From b7fe16c07c4476a345766bdd05aff2e8806a5696 Mon Sep 17 00:00:00 2001 From: Marcus <139352735+sucrammal@users.noreply.github.com> Date: Tue, 28 Jul 2026 16:33:43 -0400 Subject: [PATCH] DRAFT: New modal for inspect IK --- .../MotionPlanReplayer.svelte | 2 + .../MotionPlanReplayerUI.svelte | 31 +- .../inspect-ik/IKCandidateDetail.svelte | 102 + .../inspect-ik/IKCandidateList.svelte | 133 + .../inspect-ik/IKCandidateRow.svelte | 55 + .../inspect-ik/IKInspectionPanel.svelte | 75 + .../inspect-ik/IKSeedGroup.svelte | 58 + .../inspect-ik/IKStatusDot.svelte | 25 + .../inspect-ik/draw-pose-set.ts | 85 + .../fixtures/pirouette-request.json | 1625 +++++++++++ .../fixtures/pirouette-solutions.json | 2597 +++++++++++++++++ .../inspect-ik/ik-candidates.ts | 85 + .../inspect-ik/inspect-ik-client.ts | 37 + .../inspect-ik/namespace-snapshot.ts | 42 + .../inspect-ik/parse-ik-solutions.ts | 99 + .../inspect-ik/pose-sets.ts | 113 + .../inspect-ik/relations.ts | 11 + .../inspect-ik/useIKInspection.svelte.ts | 313 ++ .../inspect-ik/world-state-obstacles.ts | 71 + 19 files changed, 5556 insertions(+), 3 deletions(-) create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/IKCandidateDetail.svelte create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/IKCandidateList.svelte create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/IKCandidateRow.svelte create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/IKInspectionPanel.svelte create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/IKSeedGroup.svelte create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/IKStatusDot.svelte create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/draw-pose-set.ts create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/fixtures/pirouette-request.json create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/fixtures/pirouette-solutions.json create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/ik-candidates.ts create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/inspect-ik-client.ts create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/namespace-snapshot.ts create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/parse-ik-solutions.ts create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/pose-sets.ts create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/relations.ts create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/useIKInspection.svelte.ts create mode 100644 src/lib/plugins/MotionPlanReplayer/inspect-ik/world-state-obstacles.ts diff --git a/src/lib/plugins/MotionPlanReplayer/MotionPlanReplayer.svelte b/src/lib/plugins/MotionPlanReplayer/MotionPlanReplayer.svelte index bd4ce286b..74d96070c 100644 --- a/src/lib/plugins/MotionPlanReplayer/MotionPlanReplayer.svelte +++ b/src/lib/plugins/MotionPlanReplayer/MotionPlanReplayer.svelte @@ -5,6 +5,7 @@ import { useEnvironment } from '$lib/hooks/useEnvironment.svelte' + import { provideIKInspection } from './inspect-ik/useIKInspection.svelte' import MotionPlanReplayerUI from './MotionPlanReplayerUI.svelte' import { type ResolvePlanSnapshots } from './plan-dropper' import { type PlanEntry, provideMotionPlanReplayer } from './useMotionPlanReplayer.svelte' @@ -20,6 +21,7 @@ const { plans, children, resolvePlanSnapshots }: Props = $props() provideMotionPlanReplayer(untrack(() => plans)) + provideIKInspection() const environment = useEnvironment() diff --git a/src/lib/plugins/MotionPlanReplayer/MotionPlanReplayerUI.svelte b/src/lib/plugins/MotionPlanReplayer/MotionPlanReplayerUI.svelte index b59740e34..abac63d80 100644 --- a/src/lib/plugins/MotionPlanReplayer/MotionPlanReplayerUI.svelte +++ b/src/lib/plugins/MotionPlanReplayer/MotionPlanReplayerUI.svelte @@ -1,13 +1,15 @@ + +
+ Start pose unavailable — the request carries no start configuration. +
+ {/if} + + {#if detail} ++ {detail} +
+ {#if clampable} + + {/if} ++ The solver returned no configuration for this seed, so there is no pose to draw — it failed + before producing a candidate rather than producing one that collides. +
+ {:else} +No failure detail was recorded for this candidate.
+ {/if} +No candidates match this filter.
+ ++ {candidate.seed} · #{candidate.indexInSeed + 1}{isScored(cost) ? '' : ' · unscored'} +
+Running IK inspection…
+{ctx.error}
++ Demo fixture — candidates come from pirouette-request, + not from {ctx.planName ?? 'the selected plan'}. +
+