@hatiolab/figure-model 0.1.90 → 0.1.91
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 +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/v3-authoring-actions.d.ts +54 -8
- package/dist/v3-authoring-actions.d.ts.map +1 -1
- package/dist/v3-authoring-actions.js +259 -45
- package/dist/v3-authoring-actions.js.map +1 -1
- package/dist/v3-editor-workspace.d.ts +32 -0
- package/dist/v3-editor-workspace.d.ts.map +1 -1
- package/dist/v3-editor-workspace.js +5 -3
- package/dist/v3-editor-workspace.js.map +1 -1
- package/dist/v3-kernel-version.d.ts +1 -1
- package/dist/v3-kernel-version.js +1 -1
- package/dist/v3-part-edit.d.ts +13 -0
- package/dist/v3-part-edit.d.ts.map +1 -1
- package/dist/v3-part-edit.js +189 -61
- package/dist/v3-part-edit.js.map +1 -1
- package/package.json +1 -1
|
@@ -232,6 +232,7 @@ export declare function createV3EditorWorkspace(): {
|
|
|
232
232
|
bindings: import("./v3-asset-types.ts").V3EvaluatedBinding[];
|
|
233
233
|
palette: Record<string, string>;
|
|
234
234
|
};
|
|
235
|
+
/** A part edit, one step of the history. Removing a part also says what else that changed (`removal`). */
|
|
235
236
|
editPart({ context, edit, ...q }: V3EditControl & {
|
|
236
237
|
context: string;
|
|
237
238
|
edit: V3PartEdit;
|
|
@@ -264,6 +265,37 @@ export declare function createV3EditorWorkspace(): {
|
|
|
264
265
|
geometry: import("./v3-asset-types.ts").V3AssetGeometry[];
|
|
265
266
|
bindings: import("./v3-asset-types.ts").V3EvaluatedBinding[];
|
|
266
267
|
palette: Record<string, string>;
|
|
268
|
+
} | {
|
|
269
|
+
removal: import("./v3-authoring-actions.ts").RemovalNotice;
|
|
270
|
+
context: null;
|
|
271
|
+
name: null;
|
|
272
|
+
fields: never[];
|
|
273
|
+
geometry: never[];
|
|
274
|
+
bindings: never[];
|
|
275
|
+
dirty: boolean;
|
|
276
|
+
revision: null;
|
|
277
|
+
canUndo?: undefined;
|
|
278
|
+
canRedo?: undefined;
|
|
279
|
+
palette?: undefined;
|
|
280
|
+
} | {
|
|
281
|
+
removal: import("./v3-authoring-actions.ts").RemovalNotice;
|
|
282
|
+
context: string;
|
|
283
|
+
name: string;
|
|
284
|
+
revision: number;
|
|
285
|
+
dirty: boolean;
|
|
286
|
+
canUndo: boolean;
|
|
287
|
+
canRedo: boolean;
|
|
288
|
+
fields: {
|
|
289
|
+
value: number;
|
|
290
|
+
id: string;
|
|
291
|
+
unit: import("./v3-graph-types.ts").V3Unit;
|
|
292
|
+
min: number;
|
|
293
|
+
max: number;
|
|
294
|
+
role?: "design" | "state";
|
|
295
|
+
}[];
|
|
296
|
+
geometry: import("./v3-asset-types.ts").V3AssetGeometry[];
|
|
297
|
+
bindings: import("./v3-asset-types.ts").V3EvaluatedBinding[];
|
|
298
|
+
palette: Record<string, string>;
|
|
267
299
|
};
|
|
268
300
|
/**
|
|
269
301
|
* One authoring command — a dimension that follows, a fastening, a motion, the room the figure takes up —
|
|
@@ -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,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAGxE,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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;AAGxE,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAQpG,0GAA0G;sCACxE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgBvF;;;;;;;;OAQG;uCACgC,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,iBAAiB,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAWjG;;;OAGG;4CACqC,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAWrF,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,7 +1,7 @@
|
|
|
1
1
|
import { parseV3Asset, serializeV3Asset, compileV3Asset, captureV3AuthoredInputs } from "./v3-asset.js";
|
|
2
2
|
import { createV3AuthoringSession } from "./v3-authoring-session.js";
|
|
3
3
|
import { addV3Box, addV3Primitive } from "./v3-create.js";
|
|
4
|
-
import { editV3Part } from "./v3-part-edit.js";
|
|
4
|
+
import { editV3Part, removePart } from "./v3-part-edit.js";
|
|
5
5
|
import { applyV3Authoring } from "./v3-authoring-actions.js";
|
|
6
6
|
import { applyV3Proposal } from "./v3-proposal.js";
|
|
7
7
|
import { V3ContractError } from "./v3-contract.js";
|
|
@@ -115,10 +115,12 @@ export function createV3EditorWorkspace() {
|
|
|
115
115
|
install(a, { asset, inputs });
|
|
116
116
|
return read();
|
|
117
117
|
},
|
|
118
|
+
/** A part edit, one step of the history. Removing a part also says what else that changed (`removal`). */
|
|
118
119
|
editPart({ context, edit, ...q }) {
|
|
119
120
|
const a = current(context);
|
|
120
121
|
control(a, q);
|
|
121
|
-
const
|
|
122
|
+
const removed = edit.kind === 'remove-part' ? removePart(a.asset, edit) : undefined;
|
|
123
|
+
const asset = removed ? removed.asset : editV3Part(a.asset, edit);
|
|
122
124
|
if (serializeV3Asset(asset) !== serializeV3Asset(a.asset)) {
|
|
123
125
|
const inputs = Object.fromEntries(asset.document.model.inputs.map(i => [
|
|
124
126
|
i.id,
|
|
@@ -126,7 +128,7 @@ export function createV3EditorWorkspace() {
|
|
|
126
128
|
]));
|
|
127
129
|
install(a, { asset, inputs });
|
|
128
130
|
}
|
|
129
|
-
return read();
|
|
131
|
+
return removed ? { ...read(), removal: removed.notice } : read();
|
|
130
132
|
},
|
|
131
133
|
/**
|
|
132
134
|
* One authoring command — a dimension that follows, a fastening, a motion, the room the figure takes up —
|
|
@@ -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,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"v3-editor-workspace.js","sourceRoot":"","sources":["../src/v3-editor-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
* different result. Kept equal to package.json's version by `npm version` (the `version` script rewrites this file)
|
|
5
5
|
* and by `v3-kernel-version.test.ts`.
|
|
6
6
|
*/
|
|
7
|
-
export declare const V3_KERNEL_VERSION = "0.1.
|
|
7
|
+
export declare const V3_KERNEL_VERSION = "0.1.91";
|
|
8
8
|
//# sourceMappingURL=v3-kernel-version.d.ts.map
|
|
@@ -7,5 +7,5 @@
|
|
|
7
7
|
* different result. Kept equal to package.json's version by `npm version` (the `version` script rewrites this file)
|
|
8
8
|
* and by `v3-kernel-version.test.ts`.
|
|
9
9
|
*/
|
|
10
|
-
export const V3_KERNEL_VERSION = '0.1.
|
|
10
|
+
export const V3_KERNEL_VERSION = '0.1.91';
|
|
11
11
|
//# sourceMappingURL=v3-kernel-version.js.map
|
package/dist/v3-part-edit.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { V3Asset, V3Material } from './v3-asset-types.ts';
|
|
2
|
+
import { type RemovalNotice } from './v3-authoring-actions.ts';
|
|
2
3
|
export type V3PartEdit =
|
|
3
4
|
/**
|
|
4
5
|
* The part's material. `palette` adds the colours it names that the asset does not carry yet — a new asset carries
|
|
@@ -120,4 +121,16 @@ export type V3PartEdit =
|
|
|
120
121
|
};
|
|
121
122
|
/** Pure, validated structural edit. References are never silently retargeted or cascaded. */
|
|
122
123
|
export declare function editV3Part(source: V3Asset, edit: V3PartEdit): V3Asset;
|
|
124
|
+
/**
|
|
125
|
+
* Takes a part away, and says what else that changed (`RemovalNotice`): the parts let go, the values fixed, the
|
|
126
|
+
* controls made, the mounting face given up. `editV3Part` is this without the notice.
|
|
127
|
+
*/
|
|
128
|
+
export declare function removePart(source: V3Asset, edit: {
|
|
129
|
+
kind: 'remove-part';
|
|
130
|
+
target: string;
|
|
131
|
+
refitRoom?: boolean;
|
|
132
|
+
}): {
|
|
133
|
+
asset: V3Asset;
|
|
134
|
+
notice: RemovalNotice;
|
|
135
|
+
};
|
|
123
136
|
//# sourceMappingURL=v3-part-edit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v3-part-edit.d.ts","sourceRoot":"","sources":["../src/v3-part-edit.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"v3-part-edit.d.ts","sourceRoot":"","sources":["../src/v3-part-edit.ts"],"names":[],"mappings":"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"}
|
package/dist/v3-part-edit.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { keepPublicInputs, renamePublicInputs } from "./v3-public-inputs.js";
|
|
2
2
|
import { compileV3Asset } from "./v3-asset.js";
|
|
3
3
|
import { V3ContractError } from "./v3-contract.js";
|
|
4
|
-
import { applyV3Authoring, copyV3PartJoint, proposeV3Occupancy, releaseV3PartJoints,
|
|
4
|
+
import { applyV3Authoring, copyV3PartJoint, dropDeadDanglers, proposeV3Occupancy, releaseV3PartJoints, renameV3PartInJoints } from "./v3-authoring-actions.js";
|
|
5
5
|
import { SEGMENT_PRESETS, FIGURE_CAPABILITIES } from "./v3-words.js";
|
|
6
6
|
/** Pure, validated structural edit. References are never silently retargeted or cascaded. */
|
|
7
7
|
export function editV3Part(source, edit) {
|
|
@@ -153,6 +153,7 @@ export function editV3Part(source, edit) {
|
|
|
153
153
|
throw new V3ContractError('TARGET_ABSENT', 'part', edit.target);
|
|
154
154
|
if (edit.kind === 'duplicate-part') {
|
|
155
155
|
copyV3PartJoint(asset, edit.target, duplicatePart(asset, edit.target));
|
|
156
|
+
sweepNewlyUnread(source, asset);
|
|
156
157
|
compileV3Asset(asset);
|
|
157
158
|
return asset;
|
|
158
159
|
}
|
|
@@ -217,69 +218,193 @@ export function editV3Part(source, edit) {
|
|
|
217
218
|
look.segments = edit.segments;
|
|
218
219
|
}
|
|
219
220
|
else if (edit.kind === 'remove-part') {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
221
|
+
return removePart(source, edit).asset;
|
|
222
|
+
}
|
|
223
|
+
else
|
|
224
|
+
throw new V3ContractError('EDIT_KIND', 'part', 'unsupported operation');
|
|
225
|
+
keepPublicInputs(asset);
|
|
226
|
+
compileV3Asset(asset);
|
|
227
|
+
return asset;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Takes a part away, and says what else that changed (`RemovalNotice`): the parts let go, the values fixed, the
|
|
231
|
+
* controls made, the mounting face given up. `editV3Part` is this without the notice.
|
|
232
|
+
*/
|
|
233
|
+
export function removePart(source, edit) {
|
|
234
|
+
compileV3Asset(source);
|
|
235
|
+
const asset = structuredClone(source), model = asset.document.model;
|
|
236
|
+
if (!asset.appearance.some(a => a.target === edit.target))
|
|
237
|
+
throw new V3ContractError('TARGET_ABSENT', 'part', edit.target);
|
|
238
|
+
/*
|
|
239
|
+
A part is a placement, a row's part (drawn through its row), or a part hanging in a row (drawn on every copy).
|
|
240
|
+
Each goes: a row with its copies, a part in a row from every copy (user, 2026-09-27).
|
|
241
|
+
*/
|
|
242
|
+
const was = model.nodes.find(n => n.id === edit.target);
|
|
243
|
+
if (!was || (was.op !== 'place@1' && was.op !== 'member@1'))
|
|
244
|
+
throw new V3ContractError('EDIT_TARGET', edit.target, 'not a part of this figure');
|
|
245
|
+
/*
|
|
246
|
+
「지우고 공간 다시 맞추기」: the declaration stays, whole, while the part goes -- the mounting plane's side is read
|
|
247
|
+
from it, and a wall lamp emptied of it was fastened to a floor (2026-09-27) -- and is declared again after. A
|
|
248
|
+
mounting face on the part itself goes first: the figure then stands on no face of its own.
|
|
249
|
+
*/
|
|
250
|
+
const references = (value) => typeof value === 'string'
|
|
251
|
+
? [value]
|
|
252
|
+
: Array.isArray(value)
|
|
253
|
+
? value.flatMap(references)
|
|
254
|
+
: value && typeof value === 'object'
|
|
255
|
+
? Object.values(value).flatMap(references)
|
|
256
|
+
: [];
|
|
257
|
+
const room = edit.refitRoom && asset.occupancy?.bounds ? { placement: asset.occupancy.placement } : null;
|
|
258
|
+
const mine = (ref) => ref === edit.target || ref.startsWith(`${edit.target}.`);
|
|
259
|
+
const contactLetGo = !!(room && asset.occupancy?.contact && references(asset.occupancy.contact).some(mine));
|
|
260
|
+
if (contactLetGo)
|
|
261
|
+
delete asset.occupancy.contact;
|
|
262
|
+
const notice = releaseV3PartJoints(asset, edit.target, { spaceFittedAgain: !!room });
|
|
263
|
+
if (room && contactLetGo)
|
|
264
|
+
notice.mountingFace = true;
|
|
265
|
+
const part = model.nodes.find(n => n.id === edit.target);
|
|
266
|
+
const going = [part, ...leaveGraphRows(model, part)];
|
|
267
|
+
const goingIds = new Set(going.map(n => n.id));
|
|
268
|
+
const outputs = new Set(going.flatMap(n => Object.values(n.outputs)));
|
|
269
|
+
// Other graph nodes and capability declarations are roots. Deletion must not invalidate them.
|
|
270
|
+
/* A place declared on the part (a gripper's grip) is the part's: it goes with it, and is named. */
|
|
271
|
+
const own = (ref) => outputs.has(ref) || ref === part.id || ref.startsWith(`${part.id}.`);
|
|
272
|
+
const places = asset.document.capabilities.bindings.filter(b => references(b).some(own));
|
|
273
|
+
if (places.length) {
|
|
274
|
+
asset.document.capabilities.bindings = asset.document.capabilities.bindings.filter(b => !places.includes(b));
|
|
275
|
+
notice.bindings = places.map(b => ({ id: b.id, ...(b.label ? { label: b.label } : {}) }));
|
|
276
|
+
}
|
|
277
|
+
const bound = new Set(references(asset.document.capabilities));
|
|
278
|
+
if (model.nodes.some(n => !goingIds.has(n.id) && n.args.some(ref => outputs.has(ref))) ||
|
|
279
|
+
[...outputs].some(ref => bound.has(ref))) {
|
|
280
|
+
throw new V3ContractError('PART_REFERENCED', part.id, 'another graph node or capability references this placement');
|
|
281
|
+
}
|
|
282
|
+
model.nodes = model.nodes.filter(n => !goingIds.has(n.id));
|
|
283
|
+
asset.appearance = asset.appearance.filter(a => a.target !== part.id);
|
|
284
|
+
// Prune only upstream values belonging exclusively to the removed placement.
|
|
285
|
+
const pending = going.flatMap(n => n.args);
|
|
286
|
+
while (pending.length) {
|
|
287
|
+
const ref = pending.pop();
|
|
288
|
+
if (bound.has(ref) || model.nodes.some(n => n.args.includes(ref) || Object.values(n.params ?? {}).includes(ref)))
|
|
289
|
+
continue;
|
|
290
|
+
const writer = model.nodes.find(n => Object.values(n.outputs).includes(ref));
|
|
291
|
+
if (writer) {
|
|
292
|
+
const refs = Object.values(writer.outputs);
|
|
293
|
+
if (asset.appearance.some(a => a.target === writer.id) ||
|
|
294
|
+
refs.some(r => bound.has(r) ||
|
|
295
|
+
model.nodes.some(n => n.id !== writer.id && (n.args.includes(r) || Object.values(n.params ?? {}).includes(r)))))
|
|
246
296
|
continue;
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
297
|
+
model.nodes = model.nodes.filter(n => n.id !== writer.id);
|
|
298
|
+
pending.push(...writer.args);
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
model.inputs = model.inputs.filter(i => i.id !== ref);
|
|
302
|
+
model.constants = model.constants.filter(c => c.id !== ref);
|
|
303
|
+
delete asset.designInputs[ref];
|
|
304
|
+
delete asset.stateDefaults[ref];
|
|
305
|
+
/* A control that goes takes its clip with it: a driver writing a control nobody has is refused (FORKLIFT's wheels). */
|
|
306
|
+
if (asset.drivers?.some(d => d.state === ref)) {
|
|
307
|
+
const kept = asset.drivers.filter(d => d.state !== ref);
|
|
308
|
+
if (kept.length)
|
|
309
|
+
asset.drivers = kept;
|
|
310
|
+
else
|
|
311
|
+
delete asset.drivers;
|
|
256
312
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
const { [ref]: _gone, ...rest } = asset.stateInputs;
|
|
265
|
-
if (Object.keys(rest).length)
|
|
266
|
-
asset.stateInputs = rest;
|
|
267
|
-
else
|
|
268
|
-
delete asset.stateInputs;
|
|
269
|
-
}
|
|
313
|
+
/* A control that goes takes its label and travel time with it, or the asset names a control it has not. */
|
|
314
|
+
if (asset.stateInputs?.[ref]) {
|
|
315
|
+
const { [ref]: _gone, ...rest } = asset.stateInputs;
|
|
316
|
+
if (Object.keys(rest).length)
|
|
317
|
+
asset.stateInputs = rest;
|
|
318
|
+
else
|
|
319
|
+
delete asset.stateInputs;
|
|
270
320
|
}
|
|
271
321
|
}
|
|
272
|
-
keepPublicInputs(asset);
|
|
273
|
-
if (room) {
|
|
274
|
-
compileV3Asset(asset);
|
|
275
|
-
return applyV3Authoring(asset, { kind: 'declare-occupancy', proposal: proposeV3Occupancy(asset), placement: room.placement });
|
|
276
|
-
}
|
|
277
322
|
}
|
|
278
|
-
|
|
279
|
-
|
|
323
|
+
dropDeadDanglers(asset);
|
|
324
|
+
if (!room)
|
|
325
|
+
sweepNewlyUnread(source, asset);
|
|
326
|
+
keepPublicInputs(asset);
|
|
327
|
+
if (room) {
|
|
328
|
+
compileV3Asset(asset);
|
|
329
|
+
const fitted = applyV3Authoring(asset, { kind: 'declare-occupancy', proposal: proposeV3Occupancy(asset), placement: room.placement });
|
|
330
|
+
sweepNewlyUnread(source, fitted);
|
|
331
|
+
keepPublicInputs(fitted);
|
|
332
|
+
compileV3Asset(fitted);
|
|
333
|
+
return { asset: fitted, notice };
|
|
334
|
+
}
|
|
280
335
|
keepPublicInputs(asset);
|
|
281
336
|
compileV3Asset(asset);
|
|
282
|
-
return asset;
|
|
337
|
+
return { asset, notice };
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* What an edit left that nothing reads now and something read before: a constant only a joint's motion read, a node
|
|
341
|
+
* a copy brought that the copy's record did not make again (user, 2026-09-27: 「모델변경에 따른 부작용을 제거하라」).
|
|
342
|
+
* What nothing read before the edit is not the edit's, and stays. Taken away until nothing more goes.
|
|
343
|
+
*/
|
|
344
|
+
function sweepNewlyUnread(before, after) {
|
|
345
|
+
const strings = (v) => typeof v === 'string' ? [v] : Array.isArray(v) ? v.flatMap(strings) : v && typeof v === 'object' ? Object.values(v).flatMap(strings) : [];
|
|
346
|
+
/* A node's params name its own outputs at times (a face's name); what a node reads is what another takes. */
|
|
347
|
+
const readIn = (asset) => new Set([
|
|
348
|
+
...asset.document.model.nodes.flatMap(n => [...n.args, ...strings(n.params)].filter(r => !Object.values(n.outputs).includes(r))),
|
|
349
|
+
...strings(asset.appearance),
|
|
350
|
+
...strings(asset.occupancy),
|
|
351
|
+
...strings(asset.document.capabilities),
|
|
352
|
+
...strings(asset.drivers),
|
|
353
|
+
...strings(asset.publicInputs),
|
|
354
|
+
...strings(asset.joints),
|
|
355
|
+
...Object.keys(asset.stateInputs ?? {})
|
|
356
|
+
]);
|
|
357
|
+
const sinks = new Set(['place@1', 'repeat@1']);
|
|
358
|
+
const wasRead = readIn(before);
|
|
359
|
+
const heldBefore = (id) => wasRead.has(id);
|
|
360
|
+
const model = after.document.model;
|
|
361
|
+
for (let gone = true; gone;) {
|
|
362
|
+
gone = false;
|
|
363
|
+
const read = readIn(after);
|
|
364
|
+
const idle = model.nodes.filter(n => !sinks.has(n.op) && !Object.values(n.outputs).some(o => read.has(o)) && Object.values(n.outputs).some(heldBefore));
|
|
365
|
+
const idleValues = [...model.inputs, ...model.constants].filter(x => !read.has(x.id) && heldBefore(x.id));
|
|
366
|
+
if (!idle.length && !idleValues.length)
|
|
367
|
+
break;
|
|
368
|
+
gone = true;
|
|
369
|
+
model.nodes = model.nodes.filter(n => !idle.includes(n));
|
|
370
|
+
const values = new Set(idleValues.map(x => x.id));
|
|
371
|
+
model.inputs = model.inputs.filter(i => !values.has(i.id));
|
|
372
|
+
model.constants = model.constants.filter(c => !values.has(c.id));
|
|
373
|
+
for (const id of values) {
|
|
374
|
+
delete after.designInputs[id];
|
|
375
|
+
delete after.stateDefaults[id];
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* The row nodes that go with a part drawn through a row written in the graph (the catalogue's conveyor: no joint
|
|
381
|
+
* record). The part leaves each assembly it is in; an assembly left with nothing goes, and the repeat that copies it,
|
|
382
|
+
* and so on out through a row inside a row. A row made by fastening is not here: its record made it, and releasing
|
|
383
|
+
* the record took it away.
|
|
384
|
+
*/
|
|
385
|
+
function leaveGraphRows(model, part) {
|
|
386
|
+
const going = [];
|
|
387
|
+
const leave = (refs) => {
|
|
388
|
+
for (const assembly of model.nodes.filter(n => n.op === 'assembly@1' && !going.includes(n) && n.args.some(a => refs.includes(a)))) {
|
|
389
|
+
const rest = assembly.args.filter(a => !refs.includes(a));
|
|
390
|
+
if (rest.length) {
|
|
391
|
+
assembly.args = rest;
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
going.push(assembly);
|
|
395
|
+
const copies = model.nodes.filter(n => n.op === 'repeat@1' && n.args.includes(Object.values(assembly.outputs)[0]));
|
|
396
|
+
going.push(...copies);
|
|
397
|
+
leave(copies.flatMap(n => Object.values(n.outputs)));
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
leave(Object.values(part.outputs));
|
|
401
|
+
return going;
|
|
402
|
+
}
|
|
403
|
+
/** A graph row's own nodes, when the part is the only thing it copies: copying the part copies the row. */
|
|
404
|
+
function graphRowOfPart(model, part) {
|
|
405
|
+
const assembly = model.nodes.find(n => n.op === 'assembly@1' && n.args.length === 1 && n.args[0] === Object.values(part.outputs)[0]);
|
|
406
|
+
const row = assembly && model.nodes.find(n => n.op === 'repeat@1' && n.args.includes(Object.values(assembly.outputs)[0]));
|
|
407
|
+
return assembly && row ? [assembly, row] : [];
|
|
283
408
|
}
|
|
284
409
|
/**
|
|
285
410
|
* Copies a part under a new name. A value belongs to the part when its name is the part's own (`<part>` or
|
|
@@ -289,8 +414,11 @@ export function editV3Part(source, edit) {
|
|
|
289
414
|
function duplicatePart(asset, target) {
|
|
290
415
|
const model = asset.document.model;
|
|
291
416
|
const placement = model.nodes.find(n => n.id === target);
|
|
292
|
-
if (!placement || placement.op !== 'place@1')
|
|
293
|
-
throw new V3ContractError('EDIT_TARGET', target, '
|
|
417
|
+
if (!placement || (placement.op !== 'place@1' && placement.op !== 'member@1'))
|
|
418
|
+
throw new V3ContractError('EDIT_TARGET', target, 'not a part of this figure');
|
|
419
|
+
/* A row written in the graph is copied with its part; a row made by fastening is made again from the copied record. */
|
|
420
|
+
const fastened = (asset.joints ?? []).some(j => j.body1.part === target);
|
|
421
|
+
const row = fastened ? [] : graphRowOfPart(model, placement);
|
|
294
422
|
const taken = (id) => model.nodes.some(n => n.id === id || n.id.startsWith(`${id}.`)) ||
|
|
295
423
|
model.inputs.some(i => i.id === id || i.id.startsWith(`${id}.`)) ||
|
|
296
424
|
model.constants.some(c => c.id === id || c.id.startsWith(`${id}.`));
|
|
@@ -314,9 +442,9 @@ function duplicatePart(asset, target) {
|
|
|
314
442
|
? Object.values(value).flatMap(strings)
|
|
315
443
|
: [];
|
|
316
444
|
const look = asset.appearance.find(a => a.target === target);
|
|
317
|
-
const nodes = new Set([placement]);
|
|
445
|
+
const nodes = new Set([placement, ...row]);
|
|
318
446
|
/* The flag that shows or hides the part is upstream of its appearance, not its placement. */
|
|
319
|
-
const pending = [...placement.args, ...strings(
|
|
447
|
+
const pending = [...[placement, ...row].flatMap(n => [...n.args, ...strings(n.params)]), ...(look.visibility ? [look.visibility] : [])];
|
|
320
448
|
while (pending.length) {
|
|
321
449
|
const ref = pending.pop();
|
|
322
450
|
const writer = model.nodes.find(n => Object.values(n.outputs).includes(ref));
|