Add gated Placement F2 pack skeleton for satellite xy.
Propose positions only from PCB footprints plus numeric decoupling max_distance_mm; otherwise skip with an explicit reason. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -22,6 +22,7 @@ import type {
|
||||
NetlistPreviewDesignator,
|
||||
PauseCheckpoint,
|
||||
PlacementPlan,
|
||||
PlacementPack,
|
||||
Project,
|
||||
SkippedComponent,
|
||||
ValidationReport,
|
||||
@@ -618,6 +619,15 @@ export async function fetchPlacementPlan(projectId: string): Promise<PlacementPl
|
||||
return res.json();
|
||||
}
|
||||
|
||||
export async function fetchPlacementPack(projectId: string): Promise<PlacementPack> {
|
||||
const res = await authFetch(`${BASE}/api/pipeline/${projectId}/placement/pack`);
|
||||
if (!res.ok) {
|
||||
const err = await res.json().catch(() => ({ detail: "Placement pack not found" }));
|
||||
throw new Error(err.detail || "Placement pack not found");
|
||||
}
|
||||
return res.json();
|
||||
}
|
||||
|
||||
// --- Logs ---
|
||||
|
||||
export async function fetchProjectLogs(
|
||||
|
||||
@@ -330,6 +330,24 @@ export interface PlacementPlan {
|
||||
groups: PlacementIcGroup[];
|
||||
}
|
||||
|
||||
export interface PlacementProposal {
|
||||
ref: string;
|
||||
anchor_ref: string;
|
||||
rule_kind: string;
|
||||
max_distance_mm: number;
|
||||
proposed_x: number;
|
||||
proposed_y: number;
|
||||
layer?: string;
|
||||
basis?: string;
|
||||
}
|
||||
|
||||
export interface PlacementPack {
|
||||
objective?: string;
|
||||
status: "packed" | "skipped";
|
||||
skip_reason?: string | null;
|
||||
placements: PlacementProposal[];
|
||||
}
|
||||
|
||||
// One entry per EDIF sub-design (`&NNNN` ID prefix). Returned by the upload
|
||||
// endpoint and the subdesigns inspection endpoint; consumed by the wizard's
|
||||
// sub-design picker step.
|
||||
|
||||
Reference in New Issue
Block a user