import paper from "paper" const scaleFlatPoint = (point: any, scale: number): [number, number] => { return [point[0] * scale, point[1] * scale] } const scaleSegmentToPoint = (seg: any, scale: number): any => { if (seg instanceof paper.Point) { return [seg.x * scale, seg.y * scale] } if (seg instanceof paper.Segment) { return [seg.point.x * scale, seg.point.y * scale] } if ( Array.isArray(seg) && seg.length >= 2 && typeof seg[0] === "number" && typeof seg[1] === "number" ) { return scaleFlatPoint(seg, scale) } if ( Array.isArray(seg) && Array.isArray(seg[0]) && seg[0].length >= 2 && typeof seg[0][0] === "number" && typeof seg[0][1] === "number" ) { // Support paper JSON segment format: [[x,y], [handleInX, handleInY], [handleOutX, handleOutY]] return scaleFlatPoint(seg[0], scale) } if ( seg?.point && typeof seg.point.x === "number" && typeof seg.point.y === "number" ) { return [seg.point.x * scale, seg.point.y * scale] } if ( seg?.point && Array.isArray(seg.point) && seg.point.length >= 2 && typeof seg.point[0] === "number" && typeof seg.point[1] === "number" ) { return [seg.point[0] * scale, seg.point[1] * scale] } return seg } // 调整原始比例点位到当前图片的缩放比例 export const adjustPoints: ( id: string, nestedMap: Map>, scale: number ) => Map> = ( id, nestedMap, scale ) => { const adjustedMap = new Map< string, Map >() nestedMap.forEach((innerMap, outerKey) => { if (id === outerKey) { const adjustedInnerMap = new Map< string, Array<[number, any[], any, any[]]> >() innerMap.forEach((array, innerKey) => { const adjustedArray = array.map( ([id, points, detail, hollowPoints]) => { // let adjustedPoints = points.map((point) => { // let flag = point instanceof paper.Point; // if (flag) { // return [point.x * scale, point.y * scale]; // } else { // return point.map((item: any) => item * scale); // } // }); let adjustedPoints = points.map((child) => { return child.map((seg: any) => { return scaleSegmentToPoint(seg, scale) }) }) let adjustedHollowPoints = hollowPoints.map((child) => { return child.map((seg: any) => { return scaleSegmentToPoint(seg, scale) }) }) return [id, adjustedPoints, detail, adjustedHollowPoints] } ) adjustedInnerMap.set(innerKey, adjustedArray as any) }) adjustedMap.set(outerKey, adjustedInnerMap) } else { adjustedMap.set(outerKey, innerMap) } }) return adjustedMap } // 根据比例调整不同图片的点位数据 export const adjustAllPoints: ( nestedMap: Map>, allScale: { [x: string]: number } ) => Map> = ( nestedMap, allScale ) => { const adjustedMap = new Map< string, Map >() if (!(nestedMap instanceof Map)) { return adjustedMap } nestedMap.forEach((innerMap, outerKey) => { const scale = allScale[outerKey] if (scale) { const adjustedInnerMap = new Map< string, Array<[number, any[], any, any[]]> >() innerMap.forEach((array, innerKey) => { const adjustedArray = array.map( ([id, points, detail, hollowPoints]) => { // let adjustedPoints = points.map((point) => { // let flag = point instanceof paper.Point; // if (flag) { // return [point.x * scale, point.y * scale]; // } else { // return point.map((item: any) => item * scale); // } // }); let adjustedPoints = points.map((child) => { return child.map((seg: any) => { return scaleSegmentToPoint(seg, scale) }) }) let adjustedHollowPoints = hollowPoints.map((child) => { return child.map((seg: any) => { return scaleSegmentToPoint(seg, scale) }) }) return [id, adjustedPoints, detail, adjustedHollowPoints] } ) adjustedInnerMap.set(innerKey, adjustedArray as any) }) adjustedMap.set(outerKey, adjustedInnerMap) } else { adjustedMap.set(outerKey, innerMap) } }) return adjustedMap }