export type AiSelectionMode = "none" | "point" | "lasso"; export type CadEditTool = { id: string; label: string; pickKinds: Array<"surface_point" | "edge">; parameters: Record; parameterFields: Array<{ name: string; label: string; type: "number" | "select" | "string"; unit?: string; min?: number; step?: number; options?: string[]; placeholder?: string; }>; }; export const CAD_EDIT_TOOLS: CadEditTool[] = [ { id: "add_hole", label: "打孔", pickKinds: ["surface_point"], parameters: { holeDiameter: 2, depth: "through", direction: "face_normal" }, parameterFields: [ { name: "holeDiameter", label: "孔径", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "depth", label: "深度", type: "select", options: ["through", "blind"] }, ], }, { id: "add_counterbore", label: "沉孔", pickKinds: ["surface_point"], parameters: { holeDiameter: 3, counterboreDiameter: 6, counterboreDepth: 2, depth: "through", direction: "face_normal", }, parameterFields: [ { name: "holeDiameter", label: "底孔直径", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "counterboreDiameter", label: "沉孔直径", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "counterboreDepth", label: "沉孔深度", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "depth", label: "深度", type: "select", options: ["through", "blind"] }, ], }, { id: "add_countersink", label: "锥沉孔", pickKinds: ["surface_point"], parameters: { holeDiameter: 3, countersinkDiameter: 6, countersinkAngleDeg: 90, depth: "through", direction: "face_normal", }, parameterFields: [ { name: "holeDiameter", label: "底孔直径", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "countersinkDiameter", label: "锥口直径", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "countersinkAngleDeg", label: "锥角", type: "number", unit: "deg", min: 1, step: 1 }, { name: "depth", label: "深度", type: "select", options: ["through", "blind"] }, ], }, { id: "add_slot", label: "开槽", pickKinds: ["surface_point", "surface_point"], parameters: { slotWidth: 2, depth: "through", direction: "face_normal" }, parameterFields: [ { name: "slotWidth", label: "槽宽", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "depth", label: "深度", type: "select", options: ["through", "blind"] }, ], }, { id: "add_pocket", label: "铣型腔", pickKinds: ["surface_point"], parameters: { shape: "rectangle", width: 10, height: 6, depth: 1, direction: "face_normal", orientation: "surface_xy" }, parameterFields: [ { name: "width", label: "宽度", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "height", label: "高度", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "depth", label: "深度", type: "number", unit: "mm", min: 0.01, step: 0.1 }, ], }, { id: "add_circular_pocket", label: "圆形型腔", pickKinds: ["surface_point"], parameters: { diameter: 8, depth: 1, direction: "face_normal" }, parameterFields: [ { name: "diameter", label: "直径", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "depth", label: "深度", type: "number", unit: "mm", min: 0.01, step: 0.1 }, ], }, { id: "add_hole_pattern", label: "阵列孔", pickKinds: ["surface_point"], parameters: { holeDiameter: 2, rows: 2, columns: 2, pitchX: 8, pitchY: 8, depth: "through", direction: "face_normal", orientation: "surface_xy", }, parameterFields: [ { name: "holeDiameter", label: "孔径", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "rows", label: "行数", type: "number", min: 1, step: 1 }, { name: "columns", label: "列数", type: "number", min: 1, step: 1 }, { name: "pitchX", label: "X 间距", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "pitchY", label: "Y 间距", type: "number", unit: "mm", min: 0.01, step: 0.1 }, { name: "depth", label: "深度", type: "select", options: ["through", "blind"] }, ], }, { id: "add_chamfer", label: "倒角", pickKinds: ["edge"], parameters: { distance: 1 }, parameterFields: [ { name: "distance", label: "倒角距离", type: "number", unit: "mm", min: 0.01, step: 0.1 }, ], }, { id: "add_fillet", label: "圆角", pickKinds: ["edge"], parameters: { radius: 1 }, parameterFields: [ { name: "radius", label: "圆角半径", type: "number", unit: "mm", min: 0.01, step: 0.1 }, ], }, ]; export function cadEditToolForOperation(operation: string) { return CAD_EDIT_TOOLS.find((tool) => tool.id === operation) || CAD_EDIT_TOOLS[0]; } export function cadEditToolPickKind(operation: string) { return cadEditToolForOperation(operation).pickKinds[0] || "surface_point"; } export function cadEditToolNextPickKind(operation: string, pickCount: number) { const pickKinds = cadEditToolForOperation(operation).pickKinds; return pickKinds[Math.min(Math.max(Math.floor(pickCount), 0), pickKinds.length - 1)] || "surface_point"; } export function cadEditToolPickComplete(operation: string, picks: unknown[]) { return picks.length >= cadEditToolForOperation(operation).pickKinds.length; } export function defaultCadEditParameters(operation: string) { return { ...cadEditToolForOperation(operation).parameters }; } export function buildEmbeddedCadEditIntent({ operation, pick, parameters, artifactPath, taskId, }: { operation: string; pick: Record; parameters?: Record; artifactPath: string; taskId: string; }) { const tool = cadEditToolForOperation(operation); return { schema: "cad-edit-intent.v1", operation: tool.id, source: { entryFile: artifactPath, stepPath: artifactPath, sourcePath: "", backend: "agent-studio", units: "mm", taskId, }, selection: pick, parameters: { ...defaultCadEditParameters(tool.id), ...(parameters || {}), }, }; } export function buildEmbeddedGeometrySelectionIntent({ selection, artifactPath, taskId, }: { selection: Record; artifactPath: string; taskId: string; }) { return { schema: "cad-ai-geometry-selection.v1", intent: "modify_selected_geometry", source: { entryFile: artifactPath, stepPath: artifactPath, sourcePath: "", backend: "agent-studio", units: "mm", taskId, }, selection, instruction: "用户通过 CAD Agent Studio 内置预览指定了要修改的几何区域。请结合 selection 中的屏幕坐标、近似模型坐标和当前视角理解位置,再修改可编辑源文件并重新生成 STEP 与预览资产。", }; }