import { createSignal, For, Show, createMemo } from "solid-js"; import { Portal } from "solid-js/web"; import { parsePlt, extractCutPaths } from "../../plotcutter/parser"; import { generateTravelPaths, travelPathsToSvg } from "../../plotcutter/layout"; import type { CardPath } from "../../plotcutter/types"; import { calculateCenter, contourToSvgPath } from "../../plotcutter/contour"; export interface PltPreviewProps { /** PLT 文件内容 */ pltCode: string; /** 关闭回调 */ onClose: () => void; } /** * 从 PLT 代码解析并生成卡片路径数据 */ function parsePltToCardPaths(pltCode: string): { cutPaths: [number, number][][]; cardPaths: CardPath[]; width: number; height: number; } { const parsed = parsePlt(pltCode); const cutPaths = extractCutPaths(parsed, 5); // 5mm 阈值 // 将解析的路径转换为 CardPath 格式用于显示 const cardPaths: CardPath[] = cutPaths.map((points, index) => { const center = calculateCenter(points); const pathD = contourToSvgPath(points); const startPoint = points[0]; const endPoint = points[points.length - 1]; return { pageIndex: 0, cardIndex: index, points, centerX: center.x, centerY: center.y, pathD, startPoint, endPoint, }; }); return { cutPaths, cardPaths, width: parsed.width || 0, height: parsed.height || 0, }; } /** * PLT 预览组件 - 基于 PLT 文本解析显示切割路径预览 * * 所有显示参数(尺寸、路径等)都从 PLT 文本解析获取。 */ export function PltPreview(props: PltPreviewProps) { // 解析传入的 PLT 代码 const parsedData = createMemo(() => { if (!props.pltCode) { return { cutPaths: [] as [number, number][][], cardPaths: [] as CardPath[], width: 0, height: 0, }; } return parsePltToCardPaths(props.pltCode); }); // 生成空走路径 const travelPathD = createMemo(() => { const cardPaths = parsedData().cardPaths; const height = parsedData().height; if (cardPaths.length === 0) return ""; const travelPaths = generateTravelPaths(cardPaths, height); return travelPathsToSvg(travelPaths); }); const handleDownload = () => { if (!props.pltCode) { alert("没有可导出的卡片"); return; } const blob = new Blob([props.pltCode], { type: "application/vnd.hp-HPGL" }); const url = URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = `deck-plt-${new Date().toISOString().slice(0, 19).replace(/:/g, "-")}.plt`; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); }; return (
{/* 头部控制栏 */}

PLT 切割预览

0}> 尺寸:{parsedData().width.toFixed(1)}mm ×{" "} {parsedData().height.toFixed(1)}mm
{/* 预览区域 */} 0 && parsedData().height > 0} fallback={
无法解析 PLT 文件尺寸
} >
{/* 边框 */} {/* 空走路径(虚线) */} {/* 切割路径 */} {(path) => { return ( {/* 切割路径 */} {/* 动画小球 */} {/* 序号标签 */} {path.cardIndex + 1} ); }}
{/* 图例说明 */}
空走路径
切割路径
刀头
); }