@hatiolab/figure-model 0.1.92 → 0.1.94
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/CHANGELOG.md +12 -12
- package/README.md +25 -25
- package/dist/{v3-asset-types.d.ts → asset-types.d.ts} +73 -67
- package/dist/asset-types.d.ts.map +1 -0
- package/dist/asset-types.js +2 -0
- package/dist/asset-types.js.map +1 -0
- package/dist/asset.d.ts +20 -0
- package/dist/asset.d.ts.map +1 -0
- package/dist/{v3-asset.js → asset.js} +49 -28
- package/dist/asset.js.map +1 -0
- package/dist/{v3-authoring-actions.d.ts → authoring-actions.d.ts} +77 -66
- package/dist/authoring-actions.d.ts.map +1 -0
- package/dist/{v3-authoring-actions.js → authoring-actions.js} +129 -104
- package/dist/authoring-actions.js.map +1 -0
- package/dist/{v3-authoring-session.d.ts → authoring-session.d.ts} +23 -21
- package/dist/authoring-session.d.ts.map +1 -0
- package/dist/{v3-authoring-session.js → authoring-session.js} +4 -4
- package/dist/authoring-session.js.map +1 -0
- package/dist/capabilities.d.ts +3 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/{v3-capabilities.js → capabilities.js} +8 -8
- package/dist/capabilities.js.map +1 -0
- package/dist/clip-keeping.d.ts +30 -0
- package/dist/clip-keeping.d.ts.map +1 -0
- package/dist/clip-keeping.js +77 -0
- package/dist/clip-keeping.js.map +1 -0
- package/dist/command-preview.d.ts +125 -0
- package/dist/command-preview.d.ts.map +1 -0
- package/dist/command-preview.js +246 -0
- package/dist/command-preview.js.map +1 -0
- package/dist/contract.d.ts +7 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +12 -0
- package/dist/contract.js.map +1 -0
- package/dist/{v3-cost.d.ts → cost.d.ts} +5 -5
- package/dist/cost.d.ts.map +1 -0
- package/dist/{v3-cost.js → cost.js} +11 -11
- package/dist/cost.js.map +1 -0
- package/dist/{v3-create.d.ts → create.d.ts} +8 -8
- package/dist/{v3-create.d.ts.map → create.d.ts.map} +1 -1
- package/dist/{v3-create.js → create.js} +26 -26
- package/dist/create.js.map +1 -0
- package/dist/document.d.ts +5 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +31 -0
- package/dist/document.js.map +1 -0
- package/dist/{v3-driver.d.ts → driver.d.ts} +10 -10
- package/dist/driver.d.ts.map +1 -0
- package/dist/{v3-driver.js → driver.js} +10 -10
- package/dist/driver.js.map +1 -0
- package/dist/{v3-editor-workspace.d.ts → editor-workspace.d.ts} +99 -73
- package/dist/editor-workspace.d.ts.map +1 -0
- package/dist/{v3-editor-workspace.js → editor-workspace.js} +48 -32
- package/dist/editor-workspace.js.map +1 -0
- package/dist/{v3-examples.d.ts → examples.d.ts} +5 -5
- package/dist/examples.d.ts.map +1 -0
- package/dist/{v3-examples.js → examples.js} +11 -11
- package/dist/examples.js.map +1 -0
- package/dist/{v3-follow.d.ts → follow.d.ts} +5 -5
- package/dist/follow.d.ts.map +1 -0
- package/dist/{v3-follow.js → follow.js} +2 -2
- package/dist/follow.js.map +1 -0
- package/dist/{v3-gate.d.ts → gate.d.ts} +36 -28
- package/dist/gate.d.ts.map +1 -0
- package/dist/{v3-gate.js → gate.js} +54 -48
- package/dist/gate.js.map +1 -0
- package/dist/{v3-graph-types.d.ts → graph-types.d.ts} +33 -33
- package/dist/graph-types.d.ts.map +1 -0
- package/dist/graph-types.js +2 -0
- package/dist/graph-types.js.map +1 -0
- package/dist/{v3-graph.d.ts → graph.d.ts} +14 -14
- package/dist/graph.d.ts.map +1 -0
- package/dist/{v3-graph.js → graph.js} +16 -16
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +39 -33
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +39 -33
- package/dist/index.js.map +1 -1
- package/dist/{v3-instance-size.d.ts → instance-size.d.ts} +14 -14
- package/dist/instance-size.d.ts.map +1 -0
- package/dist/{v3-instance-size.js → instance-size.js} +13 -13
- package/dist/instance-size.js.map +1 -0
- package/dist/json.d.ts +12 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/{v3-json.js → json.js} +13 -13
- package/dist/json.js.map +1 -0
- package/dist/kernel-version.d.ts +8 -0
- package/dist/kernel-version.d.ts.map +1 -0
- package/dist/{v3-kernel-version.js → kernel-version.js} +4 -4
- package/dist/kernel-version.js.map +1 -0
- package/dist/{v3-part-edit.d.ts → part-edit.d.ts} +12 -11
- package/dist/part-edit.d.ts.map +1 -0
- package/dist/{v3-part-edit.js → part-edit.js} +84 -68
- package/dist/part-edit.js.map +1 -0
- package/dist/proposal.d.ts +55 -0
- package/dist/proposal.d.ts.map +1 -0
- package/dist/{v3-proposal.js → proposal.js} +29 -21
- package/dist/proposal.js.map +1 -0
- package/dist/{v3-public-inputs.d.ts → public-inputs.d.ts} +4 -4
- package/dist/public-inputs.d.ts.map +1 -0
- package/dist/{v3-public-inputs.js → public-inputs.js} +3 -3
- package/dist/public-inputs.js.map +1 -0
- package/dist/recipe-build.d.ts +27 -0
- package/dist/recipe-build.d.ts.map +1 -0
- package/dist/{v3-recipe-build.js → recipe-build.js} +9 -9
- package/dist/recipe-build.js.map +1 -0
- package/dist/recipe-from-parts.d.ts +8 -0
- package/dist/recipe-from-parts.d.ts.map +1 -0
- package/dist/{v3-recipe-from-parts.js → recipe-from-parts.js} +9 -9
- package/dist/recipe-from-parts.js.map +1 -0
- package/dist/{v3-recipe.d.ts → recipe.d.ts} +25 -25
- package/dist/recipe.d.ts.map +1 -0
- package/dist/{v3-recipe.js → recipe.js} +30 -30
- package/dist/recipe.js.map +1 -0
- package/dist/release-contract.d.ts +19 -0
- package/dist/release-contract.d.ts.map +1 -0
- package/dist/{v3-release-contract.js → release-contract.js} +8 -7
- package/dist/release-contract.js.map +1 -0
- package/dist/{v3-render-batches.d.ts → render-batches.d.ts} +8 -8
- package/dist/render-batches.d.ts.map +1 -0
- package/dist/{v3-render-batches.js → render-batches.js} +4 -4
- package/dist/render-batches.js.map +1 -0
- package/dist/resize-plan.d.ts +61 -0
- package/dist/resize-plan.d.ts.map +1 -0
- package/dist/resize-plan.js +189 -0
- package/dist/resize-plan.js.map +1 -0
- package/dist/room.d.ts +53 -0
- package/dist/room.d.ts.map +1 -0
- package/dist/room.js +90 -0
- package/dist/room.js.map +1 -0
- package/dist/{v3-score.d.ts → score.d.ts} +19 -19
- package/dist/score.d.ts.map +1 -0
- package/dist/{v3-score.js → score.js} +32 -32
- package/dist/score.js.map +1 -0
- package/dist/shape-provider.d.ts +37 -0
- package/dist/shape-provider.d.ts.map +1 -0
- package/dist/shape-provider.js +69 -0
- package/dist/shape-provider.js.map +1 -0
- package/dist/{v3-shape-sampling.d.ts → shape-sampling.d.ts} +4 -4
- package/dist/shape-sampling.d.ts.map +1 -0
- package/dist/{v3-shape-sampling.js → shape-sampling.js} +3 -3
- package/dist/shape-sampling.js.map +1 -0
- package/dist/size-edit.d.ts +38 -0
- package/dist/size-edit.d.ts.map +1 -0
- package/dist/size-edit.js +178 -0
- package/dist/size-edit.js.map +1 -0
- package/dist/{v3-surface.d.ts → surface.d.ts} +5 -5
- package/dist/surface.d.ts.map +1 -0
- package/dist/{v3-surface.js → surface.js} +7 -7
- package/dist/surface.js.map +1 -0
- package/dist/{v3-words.d.ts → words.d.ts} +3 -3
- package/dist/words.d.ts.map +1 -0
- package/dist/{v3-words.js → words.js} +3 -3
- package/dist/words.js.map +1 -0
- package/docs/{assembly-constraints-v3.md → assembly-constraints.md} +1 -1
- package/docs/{v3-asset-persistence.md → asset-persistence.md} +8 -8
- package/docs/{v3-authoring-transactions.md → authoring-transactions.md} +2 -2
- package/docs/{v3-capability-bindings.md → capability-bindings.md} +8 -8
- package/docs/{v3-common-kernel-experiment.md → common-kernel-experiment.md} +4 -4
- package/docs/{v3-core-semantics.md → core-semantics.md} +5 -5
- package/docs/{v3-cutover.md → cutover.md} +4 -4
- package/docs/{v3-design.md → design.md} +11 -11
- package/docs/{v3-document-contract.md → document-contract.md} +9 -9
- package/docs/{v3-dryroom-profile-validation.md → dryroom-profile-validation.md} +4 -4
- package/docs/{v3-editor-integration.md → editor-integration.md} +6 -6
- package/docs/{v3-full-conveyor-validation.md → full-conveyor-validation.md} +4 -4
- package/docs/{v3-full-dryroom-validation.md → full-dryroom-validation.md} +4 -4
- package/docs/{v3-full-forklift-validation.md → full-forklift-validation.md} +5 -5
- package/docs/{v3-full-robot-validation.md → full-robot-validation.md} +4 -4
- package/docs/{v3-layout-system.md → layout-system.md} +4 -4
- package/docs/{v3-legacy-risk-audit-2026-09-23.md → legacy-risk-audit-2026-09-23.md} +5 -5
- package/docs/{v3-minimal-model.md → minimal-model.md} +6 -6
- package/docs/{v3-motion-contract.md → motion-contract.md} +3 -3
- package/docs/{v3-openusd-review.md → openusd-review.md} +8 -8
- package/docs/{v3-operator-contracts.md → operator-contracts.md} +6 -6
- package/docs/{v3-payload-collision-validation.md → payload-collision-validation.md} +4 -4
- package/docs/{v3-payload-contact-validation.md → payload-contact-validation.md} +5 -5
- package/docs/prototypes/README.md +10 -10
- package/docs/prototypes/{v3-asset-samples.mjs → asset-samples.mjs} +6 -6
- package/docs/prototypes/{v3-asset-store.mjs → asset-store.mjs} +3 -3
- package/docs/prototypes/{v3-asset-store.test.mjs → asset-store.test.mjs} +6 -6
- package/docs/prototypes/asset.mjs +1 -0
- package/docs/prototypes/{v3-asset.schema.json → asset.schema.json} +2 -2
- package/docs/prototypes/{v3-asset.test.mjs → asset.test.mjs} +10 -10
- package/docs/prototypes/authoring-session.mjs +1 -0
- package/docs/prototypes/{v3-authoring-session.test.mjs → authoring-session.test.mjs} +6 -6
- package/docs/prototypes/capability-plan.mjs +1 -0
- package/docs/prototypes/{v3-capability-plan.test.mjs → capability-plan.test.mjs} +5 -5
- package/docs/prototypes/{v3-capability-samples.mjs → capability-samples.mjs} +2 -2
- package/docs/prototypes/document.mjs +2 -0
- package/docs/prototypes/{v3-document.schema.json → document.schema.json} +1 -1
- package/docs/prototypes/{v3-document.test.mjs → document.test.mjs} +7 -7
- package/docs/prototypes/{v3-dryroom-mesh.mjs → dryroom-mesh.mjs} +1 -1
- package/docs/prototypes/{v3-dryroom-mesh.test.mjs → dryroom-mesh.test.mjs} +1 -1
- package/docs/prototypes/{v3-editor-browser.mjs → editor-browser.mjs} +13 -13
- package/docs/prototypes/editor-workspace.mjs +1 -0
- package/docs/prototypes/{v3-editor-workspace.test.mjs → editor-workspace.test.mjs} +3 -3
- package/docs/prototypes/{v3-feature-pattern.test.mjs → feature-pattern.test.mjs} +1 -1
- package/docs/prototypes/{v3-full-conveyor.mjs → full-conveyor.mjs} +2 -2
- package/docs/prototypes/{v3-full-conveyor.test.mjs → full-conveyor.test.mjs} +3 -3
- package/docs/prototypes/{v3-full-dryroom.mjs → full-dryroom.mjs} +2 -2
- package/docs/prototypes/{v3-full-dryroom.test.mjs → full-dryroom.test.mjs} +3 -3
- package/docs/prototypes/{v3-full-forklift.mjs → full-forklift.mjs} +2 -2
- package/docs/prototypes/{v3-full-forklift.test.mjs → full-forklift.test.mjs} +3 -3
- package/docs/prototypes/{v3-full-robot.mjs → full-robot.mjs} +2 -2
- package/docs/prototypes/{v3-full-robot.test.mjs → full-robot.test.mjs} +4 -4
- package/docs/prototypes/{v3-kernel.test.mjs → kernel.test.mjs} +1 -1
- package/docs/prototypes/{v3-layout.test.mjs → layout.test.mjs} +1 -1
- package/docs/prototypes/{v3-more-samples.test.mjs → more-samples.test.mjs} +2 -2
- package/docs/prototypes/{v3-payload-collision.mjs → payload-collision.mjs} +2 -2
- package/docs/prototypes/{v3-payload-collision.test.mjs → payload-collision.test.mjs} +3 -3
- package/docs/prototypes/{v3-payload-fit.mjs → payload-fit.mjs} +2 -2
- package/docs/prototypes/{v3-payload-fit.test.mjs → payload-fit.test.mjs} +4 -4
- package/docs/prototypes/render-full-dryroom.mjs +12 -12
- package/docs/prototypes/{v3-repeated-binding.mjs → repeated-binding.mjs} +1 -1
- package/docs/prototypes/{v3-repeated-binding.test.mjs → repeated-binding.test.mjs} +6 -6
- package/docs/prototypes/{v3-runtime-browser.mjs → runtime-browser.mjs} +26 -26
- package/docs/prototypes/{v3-samples.test.mjs → samples.test.mjs} +1 -1
- package/docs/prototypes/{v3-spatial-plan.test.mjs → spatial-plan.test.mjs} +1 -1
- package/docs/prototypes/typed-plan.mjs +3 -0
- package/docs/prototypes/{v3-typed-plan.test.mjs → typed-plan.test.mjs} +1 -1
- package/docs/prototypes/{v3-typed-repeat.test.mjs → typed-repeat.test.mjs} +2 -2
- package/docs/{v3-repeated-binding-validation.md → repeated-binding-validation.md} +4 -4
- package/docs/{v3-research-review.md → research-review.md} +2 -2
- package/docs/{v3-review-2026-09-22.md → review-2026-09-22.md} +10 -10
- package/docs/{v3-runtime-extraction.md → runtime-extraction.md} +16 -16
- package/docs/{v3-sample-validation-expanded.md → sample-validation-expanded.md} +5 -5
- package/docs/{v3-sample-validation.md → sample-validation.md} +3 -3
- package/docs/{v3-shape-dimension-contract.md → shape-dimension-contract.md} +12 -12
- package/docs/{v3-shapeassembly-reproduction.md → shapeassembly-reproduction.md} +4 -4
- package/docs/{v3-spatial-contracts.md → spatial-contracts.md} +5 -5
- package/docs/status.md +12 -0
- package/docs/{v3-storage-integration.md → storage-integration.md} +5 -5
- package/docs/{v3-typed-repeat-contracts.md → typed-repeat-contracts.md} +3 -3
- package/package.json +3 -3
- package/dist/v3-asset-types.d.ts.map +0 -1
- package/dist/v3-asset-types.js +0 -2
- package/dist/v3-asset-types.js.map +0 -1
- package/dist/v3-asset.d.ts +0 -8
- package/dist/v3-asset.d.ts.map +0 -1
- package/dist/v3-asset.js.map +0 -1
- package/dist/v3-authoring-actions.d.ts.map +0 -1
- package/dist/v3-authoring-actions.js.map +0 -1
- package/dist/v3-authoring-session.d.ts.map +0 -1
- package/dist/v3-authoring-session.js.map +0 -1
- package/dist/v3-capabilities.d.ts +0 -3
- package/dist/v3-capabilities.d.ts.map +0 -1
- package/dist/v3-capabilities.js.map +0 -1
- package/dist/v3-contract.d.ts +0 -7
- package/dist/v3-contract.d.ts.map +0 -1
- package/dist/v3-contract.js +0 -12
- package/dist/v3-contract.js.map +0 -1
- package/dist/v3-cost.d.ts.map +0 -1
- package/dist/v3-cost.js.map +0 -1
- package/dist/v3-create.js.map +0 -1
- package/dist/v3-document.d.ts +0 -5
- package/dist/v3-document.d.ts.map +0 -1
- package/dist/v3-document.js +0 -31
- package/dist/v3-document.js.map +0 -1
- package/dist/v3-driver.d.ts.map +0 -1
- package/dist/v3-driver.js.map +0 -1
- package/dist/v3-editor-workspace.d.ts.map +0 -1
- package/dist/v3-editor-workspace.js.map +0 -1
- package/dist/v3-examples.d.ts.map +0 -1
- package/dist/v3-examples.js.map +0 -1
- package/dist/v3-follow.d.ts.map +0 -1
- package/dist/v3-follow.js.map +0 -1
- package/dist/v3-gate.d.ts.map +0 -1
- package/dist/v3-gate.js.map +0 -1
- package/dist/v3-graph-types.d.ts.map +0 -1
- package/dist/v3-graph-types.js +0 -2
- package/dist/v3-graph-types.js.map +0 -1
- package/dist/v3-graph.d.ts.map +0 -1
- package/dist/v3-graph.js.map +0 -1
- package/dist/v3-instance-size.d.ts.map +0 -1
- package/dist/v3-instance-size.js.map +0 -1
- package/dist/v3-json.d.ts +0 -12
- package/dist/v3-json.d.ts.map +0 -1
- package/dist/v3-json.js.map +0 -1
- package/dist/v3-kernel-version.d.ts +0 -8
- package/dist/v3-kernel-version.d.ts.map +0 -1
- package/dist/v3-kernel-version.js.map +0 -1
- package/dist/v3-part-edit.d.ts.map +0 -1
- package/dist/v3-part-edit.js.map +0 -1
- package/dist/v3-proposal.d.ts +0 -42
- package/dist/v3-proposal.d.ts.map +0 -1
- package/dist/v3-proposal.js.map +0 -1
- package/dist/v3-public-inputs.d.ts.map +0 -1
- package/dist/v3-public-inputs.js.map +0 -1
- package/dist/v3-recipe-build.d.ts +0 -27
- package/dist/v3-recipe-build.d.ts.map +0 -1
- package/dist/v3-recipe-build.js.map +0 -1
- package/dist/v3-recipe-from-parts.d.ts +0 -8
- package/dist/v3-recipe-from-parts.d.ts.map +0 -1
- package/dist/v3-recipe-from-parts.js.map +0 -1
- package/dist/v3-recipe.d.ts.map +0 -1
- package/dist/v3-recipe.js.map +0 -1
- package/dist/v3-release-contract.d.ts +0 -19
- package/dist/v3-release-contract.d.ts.map +0 -1
- package/dist/v3-release-contract.js.map +0 -1
- package/dist/v3-render-batches.d.ts.map +0 -1
- package/dist/v3-render-batches.js.map +0 -1
- package/dist/v3-score.d.ts.map +0 -1
- package/dist/v3-score.js.map +0 -1
- package/dist/v3-shape-sampling.d.ts.map +0 -1
- package/dist/v3-shape-sampling.js.map +0 -1
- package/dist/v3-surface.d.ts.map +0 -1
- package/dist/v3-surface.js.map +0 -1
- package/dist/v3-words.d.ts.map +0 -1
- package/dist/v3-words.js.map +0 -1
- package/docs/prototypes/v3-asset.mjs +0 -1
- package/docs/prototypes/v3-authoring-session.mjs +0 -1
- package/docs/prototypes/v3-capability-plan.mjs +0 -1
- package/docs/prototypes/v3-document.mjs +0 -2
- package/docs/prototypes/v3-editor-workspace.mjs +0 -1
- package/docs/prototypes/v3-typed-plan.mjs +0 -3
- package/docs/v3-status.md +0 -50
- /package/docs/prototypes/{v3-kernel.mjs → kernel.mjs} +0 -0
- /package/docs/prototypes/{v3-linear-comparison.py → linear-comparison.py} +0 -0
- /package/docs/prototypes/{v3-semantics.test.mjs → semantics.test.mjs} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Figures authored in
|
|
2
|
+
* Figures authored in terms, with the commands the modeller and the AI share -- examples, acceptance tests of the
|
|
3
3
|
* authoring language, and the seeds a new domain starts with.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { applyFigureAuthoring, proposeFigureOccupancy } from "./authoring-actions.js";
|
|
6
|
+
import { addFigurePrimitive, createFigureAsset } from "./create.js";
|
|
7
7
|
const box = (id, width, height, depth, token = 'palette.primary') => ({ id, kind: 'box', dimensions: { width, height, depth }, position: { x: 0, y: 0, z: 0 }, material: { token, preset: 'metal' } });
|
|
8
8
|
const cylinder = (id, radius, length, token = 'palette.dark') => ({ id, kind: 'cylinder', dimensions: { radius, length }, position: { x: 0, y: 0, z: 0 }, material: { token, preset: 'metal' } });
|
|
9
9
|
/** The chain, from the floor up: each part's bottom on the top of the one before. */
|
|
@@ -23,11 +23,11 @@ export const ROBOT_ARM_CHAIN = [
|
|
|
23
23
|
* A six-axis arm: each link joined to the one before at a joint, which is the one relation the arm needs; every size is
|
|
24
24
|
* the part's own number. The room it takes is worked out.
|
|
25
25
|
*/
|
|
26
|
-
export function
|
|
27
|
-
let asset =
|
|
26
|
+
export function robotArmFigure() {
|
|
27
|
+
let asset = createFigureAsset('6축 로봇암');
|
|
28
28
|
asset.palette = { 'palette.primary': '#477b9e', 'palette.dark': '#2b2b2b', 'palette.accent': '#f79c40', 'palette.neutral': '#9a9a9a' };
|
|
29
|
-
const run = (action) => (asset =
|
|
30
|
-
ROBOT_ARM_CHAIN.forEach(({ part }) => (asset =
|
|
29
|
+
const run = (action) => (asset = applyFigureAuthoring(asset, action));
|
|
30
|
+
ROBOT_ARM_CHAIN.forEach(({ part }) => (asset = addFigurePrimitive(asset, part)));
|
|
31
31
|
run({ kind: 'set-joint', joint: { id: 'base', type: 'fixed', body0: { plane: 'mounting-plane' }, body1: { part: 'base', face: 'bottom' } } });
|
|
32
32
|
ROBOT_ARM_CHAIN.forEach(({ part, joint }, i) => {
|
|
33
33
|
if (i === 0)
|
|
@@ -41,12 +41,12 @@ export function robotArmV3() {
|
|
|
41
41
|
run({ kind: 'set-joint', joint: { id: joint.id, type: 'revolute', ...hang, axis: joint.axis, lowerLimit: joint.min, upperLimit: joint.max } });
|
|
42
42
|
});
|
|
43
43
|
/* Two fingers on the gripper's top, at its two ends, closing towards each other from one value (0..45 mm): the right one mimics. */
|
|
44
|
-
asset =
|
|
45
|
-
asset =
|
|
44
|
+
asset = addFigurePrimitive(asset, box('finger-left', 20, 90, 40, 'palette.neutral'));
|
|
45
|
+
asset = addFigurePrimitive(asset, box('finger-right', 20, 90, 40, 'palette.neutral'));
|
|
46
46
|
run({ kind: 'set-joint', joint: { id: 'gripper', type: 'prismatic', body0: { part: 'gripper', face: 'top' }, body1: { part: 'finger-left', face: 'bottom' }, origin: { align: { x: 'min' } }, axis: 'X', lowerLimit: 0, upperLimit: 45 } });
|
|
47
47
|
run({ kind: 'set-joint', joint: { id: 'gripper-mirror', type: 'prismatic', body0: { part: 'gripper', face: 'top' }, body1: { part: 'finger-right', face: 'bottom' }, origin: { align: { x: 'max' } }, axis: 'X', mimic: { joint: 'gripper', multiplier: -1 } } });
|
|
48
48
|
run({ kind: 'set-detail-level', level: 'L' });
|
|
49
|
-
run({ kind: 'declare-occupancy', proposal:
|
|
49
|
+
run({ kind: 'declare-occupancy', proposal: proposeFigureOccupancy(asset, { over: 'range' }), placement: 'floor' });
|
|
50
50
|
return asset;
|
|
51
51
|
}
|
|
52
|
-
//# sourceMappingURL=
|
|
52
|
+
//# sourceMappingURL=examples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.js","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Axis } from './
|
|
1
|
+
import type { FigureAsset } from './asset-types.ts';
|
|
2
|
+
import type { Axis } from './words.ts';
|
|
3
3
|
/** What one dimension of a part is worked out from. */
|
|
4
|
-
export type
|
|
4
|
+
export type FigureFollow = {
|
|
5
5
|
of: 'own';
|
|
6
6
|
}
|
|
7
7
|
/** `times` 1 is the instance size itself; any other is a share of it. */
|
|
@@ -24,5 +24,5 @@ export type V3Follow = {
|
|
|
24
24
|
| {
|
|
25
25
|
of: 'expression';
|
|
26
26
|
};
|
|
27
|
-
export declare function
|
|
28
|
-
//# sourceMappingURL=
|
|
27
|
+
export declare function figureFollowOf(asset: FigureAsset, part: string, axis: Axis): FigureFollow;
|
|
28
|
+
//# sourceMappingURL=follow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"follow.d.ts","sourceRoot":"","sources":["../src/follow.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAItC,uDAAuD;AACvD,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE;AACf,yEAAyE;GACvE;IAAE,EAAE,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAChC,iDAAiD;GAC/C;IAAE,EAAE,EAAE,YAAY,CAAA;CAAE,CAAA;AASxB,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,YAAY,CAuDzF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const AXES = ['x', 'y', 'z'];
|
|
2
|
-
export function
|
|
2
|
+
export function figureFollowOf(asset, part, axis) {
|
|
3
3
|
const m = asset.document.model;
|
|
4
4
|
/*
|
|
5
5
|
A link routes the dimension through `<part>.dimension.<axis>`; before any link the shape reads its measure directly,
|
|
@@ -65,4 +65,4 @@ export function v3FollowOf(asset, part, axis) {
|
|
|
65
65
|
};
|
|
66
66
|
return walk(at);
|
|
67
67
|
}
|
|
68
|
-
//# sourceMappingURL=
|
|
68
|
+
//# sourceMappingURL=follow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"follow.js","sourceRoot":"","sources":["../src/follow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { Axis, Vec3 } from './
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import { type Point } from './
|
|
1
|
+
import type { Axis, Vec3 } from './words.ts';
|
|
2
|
+
import type { FigureAsset, FigurePlacement } from './asset-types.ts';
|
|
3
|
+
import type { FigureGeometry } from './graph-types.ts';
|
|
4
|
+
import { type Point } from './shape-sampling.ts';
|
|
5
5
|
/** One placed body in the asset frame: its centre, axis-aligned world extents and rotation. */
|
|
6
|
-
export interface
|
|
6
|
+
export interface FigureWorldBox {
|
|
7
7
|
part: string;
|
|
8
8
|
centre: Vec3;
|
|
9
9
|
/** Axis-aligned world extents, what the occupancy gate measures. */
|
|
@@ -15,25 +15,25 @@ export interface V3WorldBox {
|
|
|
15
15
|
points?: Point[];
|
|
16
16
|
}
|
|
17
17
|
/** Axis-aligned world boxes of evaluated geometry. `part` is the placing node: a `place@1` id or the repeated member. */
|
|
18
|
-
export declare function
|
|
18
|
+
export declare function figureWorldBoxesOf(geometry: readonly FigureGeometry[], writers: ReadonlyMap<string, string>, options?: {
|
|
19
19
|
points?: boolean;
|
|
20
|
-
}):
|
|
20
|
+
}): FigureWorldBox[];
|
|
21
21
|
/**
|
|
22
22
|
* Every placed body including the ones that are not drawn. The declared occupancy does not shrink or grow with
|
|
23
|
-
* visibility (
|
|
23
|
+
* visibility (designer's ruling 2026-09-22), so the gate measures against this, not against the drawn set.
|
|
24
24
|
*/
|
|
25
|
-
export declare function
|
|
25
|
+
export declare function figureOccupiedBoxesOf(geometry: readonly FigureGeometry[], writers: ReadonlyMap<string, string>, options?: {
|
|
26
26
|
points?: boolean;
|
|
27
|
-
}):
|
|
27
|
+
}): FigureWorldBox[];
|
|
28
28
|
/**
|
|
29
29
|
* How wide, tall and deep the figure's parts are, standing as they rest: the union of their boxes. The size a figure
|
|
30
30
|
* is authored at -- not the room it takes, which also holds where its joints can carry its parts (a door's swing):
|
|
31
31
|
* measuring that instead declared a 1100 mm door 8208 mm every way (2026-09-25).
|
|
32
32
|
*/
|
|
33
|
-
export declare function
|
|
33
|
+
export declare function figurePartsExtentOf(asset: FigureAsset): Record<Axis, number>;
|
|
34
34
|
/** Who writes each graph value, by node id. */
|
|
35
|
-
export declare function
|
|
36
|
-
export interface
|
|
35
|
+
export declare function figureWritersOf(asset: FigureAsset): Map<string, string>;
|
|
36
|
+
export interface FigureViolation {
|
|
37
37
|
code: 'OCCUPANCY_UNDECLARED' | 'PART_OUTSIDE_OCCUPANCY' | 'PARTS_OFF_PLACEMENT_FACE' | 'PLACEMENT_FACE_TILTED' | 'PARTS_SPLIT_ON_RESIZE' | 'SIZING_NOT_UNIFORM' | 'PUBLIC_INPUT_REFUSED';
|
|
38
38
|
/** The part that is out, or the one whose face the asset declares as what it is mounted on. */
|
|
39
39
|
part?: string;
|
|
@@ -61,7 +61,7 @@ export interface V3Violation {
|
|
|
61
61
|
* them. Never a bound over the whole range.
|
|
62
62
|
* defaults the caller asked for one state only
|
|
63
63
|
*/
|
|
64
|
-
export interface
|
|
64
|
+
export interface FigureCoverage {
|
|
65
65
|
method: 'proven' | 'sampled' | 'defaults';
|
|
66
66
|
/** The state inputs ranged over, with their bounds. */
|
|
67
67
|
inputs: Array<{
|
|
@@ -75,12 +75,14 @@ export interface V3Coverage {
|
|
|
75
75
|
sweepSteps?: number;
|
|
76
76
|
/** For `sampled`: why `proven` could not be claimed. */
|
|
77
77
|
unprovable?: string[];
|
|
78
|
+
/** `as-given`: the design values were held as the asset has them, not ranged -- this covers one size, not all. */
|
|
79
|
+
design?: 'as-given';
|
|
78
80
|
detail: string;
|
|
79
81
|
}
|
|
80
82
|
/**
|
|
81
83
|
* What each operator does to a value's extremes over the state box. Every operator in the kernel is listed by
|
|
82
84
|
* name — no pattern, no default — so a new one has no classification until someone writes its basis down, and
|
|
83
|
-
* `
|
|
85
|
+
* `state-dimension.test.ts` fails until they do.
|
|
84
86
|
*
|
|
85
87
|
* - `multilinear`: degree one in each state input given multilinear arguments, so the extreme sits at a corner
|
|
86
88
|
* however the value is later combined. Sums; products and quotients under the conditions checked in
|
|
@@ -93,13 +95,13 @@ export interface V3Coverage {
|
|
|
93
95
|
* keys that move or turn around, `geomean` refuses factors that share an input.
|
|
94
96
|
* - `unknown`: nothing is claimed. A state-dependent argument here means the coverage falls back to sampling.
|
|
95
97
|
*/
|
|
96
|
-
export declare const
|
|
98
|
+
export declare const FIGURE_STATE_EXTREME_BASIS: Readonly<Record<string, 'multilinear' | 'monotone' | 'unknown'>>;
|
|
97
99
|
/**
|
|
98
100
|
* The same basis over the design inputs a board may set (ADR-0096), which reach where state never may: a row's layout.
|
|
99
101
|
* Its count is a floor -- not multilinear -- so a value that reaches a count through a public input is not proven by
|
|
100
102
|
* corners (chief architect's condition, 2026-09-26: read off the table, not decided by hand).
|
|
101
103
|
*/
|
|
102
|
-
export declare const
|
|
104
|
+
export declare const FIGURE_DESIGN_EXTREME_BASIS: Readonly<Record<string, 'multilinear' | 'monotone' | 'unknown'>>;
|
|
103
105
|
/**
|
|
104
106
|
* Why the extremes of every state-dependent coordinate lie at the corners of the state box, or why that cannot be
|
|
105
107
|
* shown. The basis: a value that is multilinear in the state inputs (each input to degree one) or a monotone
|
|
@@ -110,7 +112,7 @@ export declare const V3_DESIGN_EXTREME_BASIS: Readonly<Record<string, 'multiline
|
|
|
110
112
|
* an input. Returns the reasons it fails, empty when it holds.
|
|
111
113
|
*
|
|
112
114
|
* Monotone in each argument is not the same as monotone in a state input the arguments share, and a value that
|
|
113
|
-
* is merely monotone cannot be combined further. Both were found by the
|
|
115
|
+
* is merely monotone cannot be combined further. Both were found by the designer, 2026-09-23:
|
|
114
116
|
* `10 + 100·min(q, 1−q)` is widest in the middle, and `10 + 100·(√q − q)` is widest at q = ¼. The gate called
|
|
115
117
|
* both proven.
|
|
116
118
|
*
|
|
@@ -123,8 +125,8 @@ export declare const V3_DESIGN_EXTREME_BASIS: Readonly<Record<string, 'multiline
|
|
|
123
125
|
* input — a sum, a product, a pose composed onto it — is refused. A new operator is bent until someone shows
|
|
124
126
|
* it preserves multilinearity and adds it to the list.
|
|
125
127
|
*/
|
|
126
|
-
export declare function cornerExtremalBasis(asset:
|
|
127
|
-
export interface
|
|
128
|
+
export declare function cornerExtremalBasis(asset: FigureAsset, dependence: Record<string, string[]>, basis?: Readonly<Record<string, string>>): string[];
|
|
129
|
+
export interface FigureInspection {
|
|
128
130
|
/** The declared volume as evaluated, when declared: the reach on each side of the asset origin. */
|
|
129
131
|
bounds?: {
|
|
130
132
|
x: {
|
|
@@ -140,24 +142,30 @@ export interface V3Inspection {
|
|
|
140
142
|
max: number;
|
|
141
143
|
};
|
|
142
144
|
};
|
|
143
|
-
placement?:
|
|
144
|
-
coverage:
|
|
145
|
-
violations:
|
|
145
|
+
placement?: FigurePlacement;
|
|
146
|
+
coverage: FigureCoverage;
|
|
147
|
+
violations: FigureViolation[];
|
|
146
148
|
}
|
|
147
|
-
export interface
|
|
149
|
+
export interface FigureInspectOptions {
|
|
148
150
|
/** Inspect one state only (the stored defaults plus these overrides) instead of the whole valid state range. */
|
|
149
151
|
at?: Record<string, number>;
|
|
150
152
|
/** Points along each input's sweep when a rotation depends on state. Default 9. */
|
|
151
153
|
sweepSteps?: number;
|
|
152
154
|
/** Corner enumeration is capped: above this many state inputs the corners are sampled, not enumerated. */
|
|
153
155
|
maxCornerInputs?: number;
|
|
156
|
+
/**
|
|
157
|
+
* `range` (the default, and what release asks): every design value a board may set -- the instance size, and the
|
|
158
|
+
* inputs the figure publishes -- over its whole range, crossed with the states. `as-given`: the states only, at the
|
|
159
|
+
* design values the asset holds -- "at this size, every pose" -- a different question, and said so in the coverage.
|
|
160
|
+
*/
|
|
161
|
+
design?: 'range' | 'as-given';
|
|
154
162
|
}
|
|
155
163
|
/**
|
|
156
164
|
* Inspect an asset against its declared occupancy. Without `at`, the whole valid state range is covered: every
|
|
157
165
|
* state input at its bounds (and, when a rotation depends on state, along its sweep), and a violation found at any
|
|
158
166
|
* evaluated state is a violation. The occupancy is never widened to make one go away.
|
|
159
167
|
*/
|
|
160
|
-
export declare function
|
|
168
|
+
export declare function inspectFigureAsset(asset: FigureAsset, options?: FigureInspectOptions | Record<string, number>): FigureInspection;
|
|
161
169
|
/**
|
|
162
170
|
* Parts that touch at the drawn size must still touch when the figure is resized. The gate once had no such check, and
|
|
163
171
|
* DRY_ROOM was published with its lamp 2300 mm above the frame at twice the height (2026-09-24).
|
|
@@ -167,7 +175,7 @@ export declare function inspectV3Asset(asset: V3Asset, options?: V3InspectOption
|
|
|
167
175
|
* the pieces are the drawn bodies whose boxes touch within `SKIN`. A figure already in
|
|
168
176
|
* several pieces at its drawn size is not refused for that — only for falling into more.
|
|
169
177
|
*/
|
|
170
|
-
export declare function splitsOnResize(asset:
|
|
178
|
+
export declare function splitsOnResize(asset: FigureAsset): FigureViolation[];
|
|
171
179
|
/**
|
|
172
180
|
* A figure that declares it grows by one ratio (`sizing: 'uniform'`) must do so: at each of the gate's resizes, every drawn
|
|
173
181
|
* body is the body at the drawn size scaled by u -- the geometric mean of the axes' factors -- about the figure's
|
|
@@ -175,5 +183,5 @@ export declare function splitsOnResize(asset: V3Asset): V3Violation[];
|
|
|
175
183
|
* that keeps a fixed number of its own, or reads a size some other way, is named. One finding: the first resize at
|
|
176
184
|
* which any part fails, with every part that fails there.
|
|
177
185
|
*/
|
|
178
|
-
export declare function notUniformOnResize(asset:
|
|
179
|
-
//# sourceMappingURL=
|
|
186
|
+
export declare function notUniformOnResize(asset: FigureAsset): FigureViolation[];
|
|
187
|
+
//# sourceMappingURL=gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../src/gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,28 +10,28 @@
|
|
|
10
10
|
*
|
|
11
11
|
* These are violations, not compile errors: the asset is valid and can be saved, and the release door refuses it
|
|
12
12
|
* (ADR-0044 decision ②). The closed list of capability names (ADR-0051 ④) is a compile error
|
|
13
|
-
* in `
|
|
13
|
+
* in `capabilities.ts`, because a name the scene does not know cannot be drawn at all.
|
|
14
14
|
*
|
|
15
|
-
* The rules are measured on the evaluated geometry, with one contact tolerance (`SKIN`, `
|
|
15
|
+
* The rules are measured on the evaluated geometry, with one contact tolerance (`SKIN`, `words.ts`).
|
|
16
16
|
*
|
|
17
17
|
* The volume is declared, not measured (ADR-0044 decision ①): an asset that fills less than its `occupancy` is
|
|
18
18
|
* fine. An asset with no `occupancy` cannot be released, because nothing says how big it is on a board.
|
|
19
19
|
*/
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import { AXES, SKIN } from "./
|
|
20
|
+
import { compileFigureAsset, figurePlacementOf, upgradeFigurePlacement } from "./asset.js";
|
|
21
|
+
import { compileFigureGraph } from "./graph.js";
|
|
22
|
+
import { resolveFigureSurface, evaluateFigureSurface } from "./surface.js";
|
|
23
|
+
import { AXES, SKIN } from "./words.js";
|
|
24
24
|
/** How far a declared mounting face may lean off the plane before it is not that plane any more. */
|
|
25
25
|
const CONTACT_TILT_DEG = 0.1;
|
|
26
|
-
import { transformPoints,
|
|
26
|
+
import { transformPoints, figureShapePoints } from "./shape-sampling.js";
|
|
27
27
|
/** Axis-aligned world boxes of evaluated geometry. `part` is the placing node: a `place@1` id or the repeated member. */
|
|
28
|
-
export function
|
|
28
|
+
export function figureWorldBoxesOf(geometry, writers, options = {}) {
|
|
29
29
|
const out = [];
|
|
30
30
|
for (const g of geometry) {
|
|
31
31
|
if (!('pose' in g))
|
|
32
32
|
continue;
|
|
33
33
|
// A part whose visibility flag is off is not drawn, so it is not a drawn body here. It is still evaluated and
|
|
34
|
-
// still placed; `
|
|
34
|
+
// still placed; `figureOccupiedBoxesOf` is the reader that wants it (the occupancy does not move with visibility).
|
|
35
35
|
if (g.visible === false)
|
|
36
36
|
continue;
|
|
37
37
|
const part = g.key ? writers.get(g.key) : g.id;
|
|
@@ -85,26 +85,26 @@ export function v3WorldBoxesOf(geometry, writers, options = {}) {
|
|
|
85
85
|
rotation: r
|
|
86
86
|
};
|
|
87
87
|
if (options.points)
|
|
88
|
-
box.points = transformPoints(
|
|
88
|
+
box.points = transformPoints(figureShapePoints(g.shape, g.segments), r, g.pose.t);
|
|
89
89
|
out.push(box);
|
|
90
90
|
}
|
|
91
91
|
return out;
|
|
92
92
|
}
|
|
93
93
|
/**
|
|
94
94
|
* Every placed body including the ones that are not drawn. The declared occupancy does not shrink or grow with
|
|
95
|
-
* visibility (
|
|
95
|
+
* visibility (designer's ruling 2026-09-22), so the gate measures against this, not against the drawn set.
|
|
96
96
|
*/
|
|
97
|
-
export function
|
|
98
|
-
return
|
|
97
|
+
export function figureOccupiedBoxesOf(geometry, writers, options = {}) {
|
|
98
|
+
return figureWorldBoxesOf(geometry.map(g => ('pose' in g ? { ...g, visible: true } : g)), writers, options);
|
|
99
99
|
}
|
|
100
100
|
/**
|
|
101
101
|
* How wide, tall and deep the figure's parts are, standing as they rest: the union of their boxes. The size a figure
|
|
102
102
|
* is authored at -- not the room it takes, which also holds where its joints can carry its parts (a door's swing):
|
|
103
103
|
* measuring that instead declared a 1100 mm door 8208 mm every way (2026-09-25).
|
|
104
104
|
*/
|
|
105
|
-
export function
|
|
106
|
-
const evaluated =
|
|
107
|
-
const boxes =
|
|
105
|
+
export function figurePartsExtentOf(asset) {
|
|
106
|
+
const evaluated = compileFigureAsset(asset).evaluate();
|
|
107
|
+
const boxes = figureOccupiedBoxesOf(evaluated.geometry, figureWritersOf(asset));
|
|
108
108
|
const out = {};
|
|
109
109
|
AXES.forEach(axis => {
|
|
110
110
|
const lo = Math.min(...boxes.map(b => b.centre[axis] - b.extent[axis] / 2));
|
|
@@ -114,7 +114,7 @@ export function v3PartsExtentOf(asset) {
|
|
|
114
114
|
return out;
|
|
115
115
|
}
|
|
116
116
|
/** Who writes each graph value, by node id. */
|
|
117
|
-
export function
|
|
117
|
+
export function figureWritersOf(asset) {
|
|
118
118
|
const writers = new Map();
|
|
119
119
|
for (const n of asset.document.model.nodes)
|
|
120
120
|
for (const ref of Object.values(n.outputs))
|
|
@@ -124,7 +124,7 @@ export function v3WritersOf(asset) {
|
|
|
124
124
|
/**
|
|
125
125
|
* What each operator does to a value's extremes over the state box. Every operator in the kernel is listed by
|
|
126
126
|
* name — no pattern, no default — so a new one has no classification until someone writes its basis down, and
|
|
127
|
-
* `
|
|
127
|
+
* `state-dimension.test.ts` fails until they do.
|
|
128
128
|
*
|
|
129
129
|
* - `multilinear`: degree one in each state input given multilinear arguments, so the extreme sits at a corner
|
|
130
130
|
* however the value is later combined. Sums; products and quotients under the conditions checked in
|
|
@@ -137,7 +137,7 @@ export function v3WritersOf(asset) {
|
|
|
137
137
|
* keys that move or turn around, `geomean` refuses factors that share an input.
|
|
138
138
|
* - `unknown`: nothing is claimed. A state-dependent argument here means the coverage falls back to sampling.
|
|
139
139
|
*/
|
|
140
|
-
export const
|
|
140
|
+
export const FIGURE_STATE_EXTREME_BASIS = Object.freeze({
|
|
141
141
|
'add@1': 'multilinear',
|
|
142
142
|
'mul@1': 'multilinear',
|
|
143
143
|
'div@1': 'multilinear',
|
|
@@ -188,16 +188,19 @@ export const V3_STATE_EXTREME_BASIS = Object.freeze({
|
|
|
188
188
|
* Its count is a floor -- not multilinear -- so a value that reaches a count through a public input is not proven by
|
|
189
189
|
* corners (chief architect's condition, 2026-09-26: read off the table, not decided by hand).
|
|
190
190
|
*/
|
|
191
|
-
export const
|
|
192
|
-
...
|
|
191
|
+
export const FIGURE_DESIGN_EXTREME_BASIS = Object.freeze({
|
|
192
|
+
...FIGURE_STATE_EXTREME_BASIS,
|
|
193
193
|
'fit-pitch@1': 'unknown',
|
|
194
194
|
'fixed-count@1': 'unknown'
|
|
195
195
|
});
|
|
196
196
|
/** The design inputs the gate ranges: the public ones, and with them the instance size, whose combination is the case. */
|
|
197
|
+
/*
|
|
198
|
+
* The design values a board may set: the instance size always -- any figure may be placed at any size its range
|
|
199
|
+
* allows -- and the inputs it publishes, crossed with it. The size was left out for a figure with no published input,
|
|
200
|
+
* so a room outgrown at a larger allowed size passed (designer 2026-09-27).
|
|
201
|
+
*/
|
|
197
202
|
function rangedDesignInputs(asset) {
|
|
198
203
|
const listed = (asset.publicInputs ?? []).map(p => p.input);
|
|
199
|
-
if (!listed.length)
|
|
200
|
-
return [];
|
|
201
204
|
const inputs = asset.document.model.inputs;
|
|
202
205
|
const size = inputs.filter(i => /^(sizing\.)?size\.[xyz]$/.test(i.id) && Number.isFinite(i.min) && Number.isFinite(i.max) && i.max < 1e12).map(i => i.id);
|
|
203
206
|
return [...listed, ...size].map(id => inputs.find(i => i.id === id)).map(i => ({ id: i.id, min: i.min, max: i.max }));
|
|
@@ -241,7 +244,7 @@ function designDependence(asset, ids) {
|
|
|
241
244
|
* an input. Returns the reasons it fails, empty when it holds.
|
|
242
245
|
*
|
|
243
246
|
* Monotone in each argument is not the same as monotone in a state input the arguments share, and a value that
|
|
244
|
-
* is merely monotone cannot be combined further. Both were found by the
|
|
247
|
+
* is merely monotone cannot be combined further. Both were found by the designer, 2026-09-23:
|
|
245
248
|
* `10 + 100·min(q, 1−q)` is widest in the middle, and `10 + 100·(√q − q)` is widest at q = ¼. The gate called
|
|
246
249
|
* both proven.
|
|
247
250
|
*
|
|
@@ -254,7 +257,7 @@ function designDependence(asset, ids) {
|
|
|
254
257
|
* input — a sum, a product, a pose composed onto it — is refused. A new operator is bent until someone shows
|
|
255
258
|
* it preserves multilinearity and adds it to the list.
|
|
256
259
|
*/
|
|
257
|
-
export function cornerExtremalBasis(asset, dependence, basis =
|
|
260
|
+
export function cornerExtremalBasis(asset, dependence, basis = FIGURE_STATE_EXTREME_BASIS) {
|
|
258
261
|
const reasons = [];
|
|
259
262
|
const dep = (ref) => dependence[ref] ?? [];
|
|
260
263
|
const shares = (a, b) => dep(a).some(x => dep(b).includes(x));
|
|
@@ -397,7 +400,7 @@ export function cornerExtremalBasis(asset, dependence, basis = V3_STATE_EXTREME_
|
|
|
397
400
|
// so a kernel that grows without writing a basis down loses coverage rather than claiming one.
|
|
398
401
|
if (basis[n.op] === 'multilinear')
|
|
399
402
|
break;
|
|
400
|
-
reasons.push(`${n.id}: ${n.op} (${basis[n.op] ?? 'unclassified'}) with a ${basis ===
|
|
403
|
+
reasons.push(`${n.id}: ${n.op} (${basis[n.op] ?? 'unclassified'}) with a ${basis === FIGURE_STATE_EXTREME_BASIS ? 'state-dependent' : 'ranged'} argument (${[...new Set(stateful.flatMap(dep))].join(', ')})`);
|
|
401
404
|
}
|
|
402
405
|
}
|
|
403
406
|
return reasons;
|
|
@@ -406,7 +409,7 @@ export function cornerExtremalBasis(asset, dependence, basis = V3_STATE_EXTREME_
|
|
|
406
409
|
Holding every part inside the declared volume and touching the plane the figure is mounted on are two
|
|
407
410
|
different claims, and corner extremality only settles the first. Whether the figure touches used to be read as
|
|
408
411
|
the *smallest* gap over its parts, and a smallest folds the way `min@1` folds: two boxes at 20q and 20(1−q) mm
|
|
409
|
-
above the floor each touch at one end of q and both float 10 mm at the middle (
|
|
412
|
+
above the floor each touch at one end of q and both float 10 mm at the middle (designer's counterexample
|
|
410
413
|
2026-09-23). The gate evaluated the two ends, found a part on the floor at each, and said proven.
|
|
411
414
|
|
|
412
415
|
The declaration names one face now, so there is no smallest to fold: the check is a single equality. What is
|
|
@@ -441,16 +444,17 @@ function stateInputs(asset) {
|
|
|
441
444
|
* state input at its bounds (and, when a rotation depends on state, along its sweep), and a violation found at any
|
|
442
445
|
* evaluated state is a violation. The occupancy is never widened to make one go away.
|
|
443
446
|
*/
|
|
444
|
-
export function
|
|
447
|
+
export function inspectFigureAsset(asset, options = {}) {
|
|
448
|
+
asset = upgradeFigurePlacement(asset);
|
|
445
449
|
// Backwards compatible: a plain record is `at`.
|
|
446
|
-
const opts = 'at' in options || 'sweepSteps' in options || 'maxCornerInputs' in options || Object.keys(options).length === 0 ? options : { at: options };
|
|
447
|
-
const compiled =
|
|
448
|
-
const graph =
|
|
450
|
+
const opts = 'at' in options || 'sweepSteps' in options || 'maxCornerInputs' in options || 'design' in options || Object.keys(options).length === 0 ? options : { at: options };
|
|
451
|
+
const compiled = compileFigureAsset(asset);
|
|
452
|
+
const graph = compileFigureGraph(asset.document.model);
|
|
449
453
|
/*
|
|
450
454
|
The state inputs, and the design inputs a board may set crossed with the instance size (ADR-0096): a long conveyor
|
|
451
455
|
with a narrow pitch is a combination, not two ranges.
|
|
452
456
|
*/
|
|
453
|
-
const designRanged = rangedDesignInputs(asset);
|
|
457
|
+
const designRanged = opts.design === 'as-given' ? [] : rangedDesignInputs(asset);
|
|
454
458
|
const inputs = [...stateInputs(asset), ...designRanged];
|
|
455
459
|
const designIds = new Set(designRanged.map(i => i.id));
|
|
456
460
|
const dependence = { ...graph.dependence };
|
|
@@ -489,7 +493,7 @@ export function inspectV3Asset(asset, options = {}) {
|
|
|
489
493
|
coverage = { method: 'proven', inputs, states: 1, detail: 'no state input; the rest pose is the only pose' };
|
|
490
494
|
}
|
|
491
495
|
else {
|
|
492
|
-
const unprovable = cornerExtremalBasis(asset, dependence, designIds.size ?
|
|
496
|
+
const unprovable = cornerExtremalBasis(asset, dependence, designIds.size ? FIGURE_DESIGN_EXTREME_BASIS : FIGURE_STATE_EXTREME_BASIS);
|
|
493
497
|
unprovable.push(...unprovenContact(asset, graph));
|
|
494
498
|
const maxCorners = opts.maxCornerInputs ?? 10;
|
|
495
499
|
const allCorners = inputs.length <= maxCorners;
|
|
@@ -535,7 +539,9 @@ export function inspectV3Asset(asset, options = {}) {
|
|
|
535
539
|
};
|
|
536
540
|
}
|
|
537
541
|
}
|
|
538
|
-
|
|
542
|
+
if (opts.design === 'as-given')
|
|
543
|
+
coverage = { ...coverage, design: 'as-given', detail: `at the design values given, not over their range: ${coverage.detail}` };
|
|
544
|
+
const plan = designIds.size ? compileFigureGraph(asset.document.model) : undefined;
|
|
539
545
|
for (const state of states) {
|
|
540
546
|
if (!plan || !Object.keys(state).some(k => designIds.has(k))) {
|
|
541
547
|
inspectOne(asset, graph, compiled.evaluate(state).geometry, state, push);
|
|
@@ -562,19 +568,19 @@ export function inspectV3Asset(asset, options = {}) {
|
|
|
562
568
|
min: values[asset.occupancy.bounds[a].min],
|
|
563
569
|
max: values[asset.occupancy.bounds[a].max]
|
|
564
570
|
});
|
|
565
|
-
return { bounds: { x: read('x'), y: read('y'), z: read('z') }, placement: asset
|
|
571
|
+
return { bounds: { x: read('x'), y: read('y'), z: read('z') }, placement: figurePlacementOf(asset), coverage, violations };
|
|
566
572
|
}
|
|
567
573
|
function inspectOne(asset, graph, geometry, state, push) {
|
|
568
574
|
const occupancy = asset.occupancy;
|
|
569
575
|
// The asset evaluation returns geometry only; the declared lengths are graph values, so read the graph itself.
|
|
570
576
|
const values = graph.evaluate({ ...asset.designInputs, ...asset.stateDefaults, ...state }).values;
|
|
571
|
-
const placement =
|
|
572
|
-
const boxes =
|
|
577
|
+
const placement = figurePlacementOf(asset);
|
|
578
|
+
const boxes = figureOccupiedBoxesOf(geometry, figureWritersOf(asset));
|
|
573
579
|
const round = (v) => Math.round(v * 1e4) / 1e4;
|
|
574
580
|
/*
|
|
575
581
|
The declared volume is the reach on each side of the asset origin, so it can sit anywhere around it. The
|
|
576
582
|
origin is where the figure is mounted, which is a coordinate reference and not a surface nothing may pass:
|
|
577
|
-
an arm on a bench reaches below the bench, and that is the machine working (
|
|
583
|
+
an arm on a bench reaches below the bench, and that is the machine working (designer's ruling 2026-09-23).
|
|
578
584
|
*/
|
|
579
585
|
const low = { x: 0, y: 0, z: 0 };
|
|
580
586
|
const high = { x: 0, y: 0, z: 0 };
|
|
@@ -608,14 +614,14 @@ function inspectOne(asset, graph, geometry, state, push) {
|
|
|
608
614
|
Only an asset that names the face it is mounted on is asked to make the contact, and two things have to hold
|
|
609
615
|
for that face to lie in the mounting plane: its reference point is on the plane, and its plane is the same
|
|
610
616
|
plane. Checking the point alone passed a box stood on its side with the right-hand face declared as the
|
|
611
|
-
mounting face, because that face's centre happened to sit at Y = 0 (
|
|
617
|
+
mounting face, because that face's centre happened to sit at Y = 0 (designer's counterexample
|
|
612
618
|
2026-09-23). A vertical face and a horizontal floor are not the same plane.
|
|
613
619
|
|
|
614
620
|
Whether the face points into the plane or away from it is a separate question — which way up the figure is
|
|
615
621
|
mounted — and is not asked here. Only that the two planes coincide.
|
|
616
622
|
|
|
617
623
|
The plane is Y = 0 in the asset frame, for a floor figure and a ceiling one alike. The origin is where the
|
|
618
|
-
figure is fastened (
|
|
624
|
+
figure is fastened (designer's ruling 2026-09-23); a ceiling figure hangs from it and names its top face.
|
|
619
625
|
Reading the plane off `occupancy.bounds.y.max` moved the thing the figure is mounted on whenever someone
|
|
620
626
|
widened the volume it takes up, which are two unrelated declarations.
|
|
621
627
|
*/
|
|
@@ -623,8 +629,8 @@ function inspectOne(asset, graph, geometry, state, push) {
|
|
|
623
629
|
if (occupancy.contact && (placement === 'floor' || placement === 'ceiling' || placement === 'wall')) {
|
|
624
630
|
const k = placement === 'wall' ? 2 : 1;
|
|
625
631
|
const axis = placement === 'wall' ? 'z' : 'y';
|
|
626
|
-
const surface =
|
|
627
|
-
const part =
|
|
632
|
+
const surface = evaluateFigureSurface(values, resolveFigureSurface({ types: graph.outputTypes, writers: nodeWriters(asset), model: asset.document.model, assetFrame: asset.document.capabilities.assetFrame }, occupancy.contact.surface, 'occupancy.contact.surface'));
|
|
633
|
+
const part = figureWritersOf(asset).get(surface.placement) ?? surface.placement;
|
|
628
634
|
const off = surface.pose.t[k];
|
|
629
635
|
if (Math.abs(off) > SKIN)
|
|
630
636
|
push({
|
|
@@ -665,10 +671,10 @@ export function splitsOnResize(asset) {
|
|
|
665
671
|
const sizing = Object.fromEntries(AXES.map(axis => [axis, model.inputs.find(i => i.id === `size.${axis}` && i.role === 'design')]));
|
|
666
672
|
if (!AXES.some(axis => sizing[axis]))
|
|
667
673
|
return [];
|
|
668
|
-
const writers =
|
|
674
|
+
const writers = figureWritersOf(asset);
|
|
669
675
|
const piecesAt = (designInputs) => {
|
|
670
|
-
const geometry =
|
|
671
|
-
return piecesOf(
|
|
676
|
+
const geometry = compileFigureAsset({ ...asset, designInputs }).evaluate().geometry;
|
|
677
|
+
return piecesOf(figureWorldBoxesOf(geometry, writers));
|
|
672
678
|
};
|
|
673
679
|
const one = piecesAt(asset.designInputs);
|
|
674
680
|
const out = [];
|
|
@@ -704,8 +710,8 @@ export function notUniformOnResize(asset) {
|
|
|
704
710
|
return [];
|
|
705
711
|
const model = asset.document.model;
|
|
706
712
|
const sizing = Object.fromEntries(AXES.map(axis => [axis, model.inputs.find(i => i.id === `size.${axis}` && i.role === 'design')]));
|
|
707
|
-
const writers =
|
|
708
|
-
const boxesAt = (designInputs) => new Map(
|
|
713
|
+
const writers = figureWritersOf(asset);
|
|
714
|
+
const boxesAt = (designInputs) => new Map(figureWorldBoxesOf(compileFigureAsset({ ...asset, designInputs }).evaluate().geometry, writers).map(box => [box.part, box]));
|
|
709
715
|
const one = boxesAt(asset.designInputs);
|
|
710
716
|
for (const axes of RESIZE_WAYS) {
|
|
711
717
|
if (!axes.every(axis => sizing[axis]))
|
|
@@ -760,4 +766,4 @@ function piecesOf(boxes) {
|
|
|
760
766
|
});
|
|
761
767
|
return [...by.values()].map(parts => [...parts].sort());
|
|
762
768
|
}
|
|
763
|
-
//# sourceMappingURL=
|
|
769
|
+
//# sourceMappingURL=gate.js.map
|