diff --git a/src/components/md-deck/PrintPreviewHeader.tsx b/src/components/md-deck/PrintPreviewHeader.tsx index f06a4dd..e864ffe 100644 --- a/src/components/md-deck/PrintPreviewHeader.tsx +++ b/src/components/md-deck/PrintPreviewHeader.tsx @@ -179,6 +179,20 @@ export function PrintPreviewHeader(props: PrintPreviewHeaderProps) { +
+ +
+
diff --git a/src/components/md-deck/hooks/deckStore.ts b/src/components/md-deck/hooks/deckStore.ts index 544c18e..f19a8d3 100644 --- a/src/components/md-deck/hooks/deckStore.ts +++ b/src/components/md-deck/hooks/deckStore.ts @@ -73,6 +73,7 @@ export interface DeckState { printFrontOddPageOffsetX: number; printFrontOddPageOffsetY: number; printDoubleSided: boolean; + pltDoubleCut: boolean; } export interface DeckActions { @@ -156,6 +157,7 @@ export interface DeckActions { setPrintFrontOddPageOffsetX: (offset: number) => void; setPrintFrontOddPageOffsetY: (offset: number) => void; setPrintDoubleSided: (doubleSided: boolean) => void; + setPltDoubleCut: (doubleCut: boolean) => void; } export interface DeckStore { @@ -197,6 +199,7 @@ export function createDeckStore(initialSrc: string = ""): DeckStore { printFrontOddPageOffsetX: 0, printFrontOddPageOffsetY: 0, printDoubleSided: false, + pltDoubleCut: false, }); const updateDimensions = () => { @@ -553,6 +556,10 @@ export function createDeckStore(initialSrc: string = ""): DeckStore { setState({ printDoubleSided: doubleSided }); }; + const setPltDoubleCut = (doubleCut: boolean) => { + setState({ pltDoubleCut: doubleCut }); + }; + const actions: DeckActions = { setSizeW, setSizeH, @@ -599,6 +606,7 @@ export function createDeckStore(initialSrc: string = ""): DeckStore { setPrintFrontOddPageOffsetX, setPrintFrontOddPageOffsetY, setPrintDoubleSided, + setPltDoubleCut, }; return { state, actions }; diff --git a/src/components/md-deck/hooks/usePlotterExport.ts b/src/components/md-deck/hooks/usePlotterExport.ts index 3e56993..a4fe5ff 100644 --- a/src/components/md-deck/hooks/usePlotterExport.ts +++ b/src/components/md-deck/hooks/usePlotterExport.ts @@ -35,6 +35,7 @@ export function usePlotterExport(store: DeckStore): UsePlotterExportReturn { const cardHeight = () => store.state.dimensions?.cardHeight || 88; const shape = () => store.state.shape; const orientation = () => store.state.printOrientation || 'landscape'; + const doubleCut = () => store.state.pltDoubleCut; /** * 生成单页满排时的 PLT 数据 @@ -60,7 +61,7 @@ export function usePlotterExport(store: DeckStore): UsePlotterExportReturn { // 将卡片路径转换为相对于 frameBoundsWithMargin 的坐标 // 原点在 frameBoundsWithMargin 的左上角 - const relativePaths = layout.cardPaths.map(cardPath => { + const relativePaths = layout.cardPaths.flatMap(cardPath => { const relativePoints = cardPath.points.map(([x, y]) => { // 转换为相对于 frameBounds 左上角的坐标 const relativeX = x - frameBounds.x; @@ -71,7 +72,11 @@ export function usePlotterExport(store: DeckStore): UsePlotterExportReturn { // 所以 plotterY = pltHeight - relativeY return [relativeX, pltHeight - relativeY] as [number, number]; }); - return relativePoints; + if (doubleCut()) { + // 重复一次:某些切割机需要每张卡牌切两次 + return [relativePoints, relativePoints]; + } + return [relativePoints]; }); // 起点和终点都在 frameBoundsWithMargin 的左上角 (0, pltHeight)