UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 12.2 kB
{"version":3,"file":"collect-line.mjs","sources":["../../../extensions/aligning_guidelines/util/collect-line.ts"],"sourcesContent":["import type { FabricObject, TBBox } from 'fabric';\nimport { Point } from 'fabric';\nimport type { HorizontalLine, VerticalLine } from '../typedefs';\nimport { aligningLineConfig } from '../constant';\nimport { getDistance, setPositionDir } from './basic';\n\ntype CollectLineProps = {\n activeObject: FabricObject;\n activeObjectRect: TBBox;\n objectRect: TBBox;\n};\n\nexport function collectLine(props: CollectLineProps) {\n const aligningLineMargin = aligningLineConfig.margin;\n const { activeObject, activeObjectRect, objectRect } = props;\n const list = makeLineByRect(objectRect);\n const aList = makeLineByRect(activeObjectRect);\n const margin = aligningLineMargin / (activeObject.canvas?.getZoom() ?? 1);\n const opts = { target: activeObject, list, aList, margin };\n const vLines = collectVerticalLine(opts);\n const hLines = collectHorizontalLine(opts);\n\n return { vLines, hLines };\n}\n\ntype CollectItemLineProps = {\n target: FabricObject;\n list: LineProps[];\n aList: LineProps[];\n margin: number;\n};\nfunction collectVerticalLine(props: CollectItemLineProps) {\n const { target, list, aList, margin } = props;\n\n const arr = aList.map((x) => getDistanceLine(x, list, 'x'));\n const min = Math.min(...arr.map((x) => x.dis));\n if (min > margin) return [];\n const lines: VerticalLine[] = [];\n const width = aList[0].x2 - aList[0].x;\n const height = aList[0].y2 - aList[0].y;\n let b = false;\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n if (min == item.dis) {\n const line = list[item.index];\n const aLine = aList[item.index];\n const x = line.x;\n const y = aLine.y;\n\n const y1 = Math.min(line.y, line.y2, y, aLine.y2);\n const y2 = Math.max(line.y, line.y2, y, aLine.y2);\n // 参考线可画多条\n lines.push({ x, y1, y2 });\n if (b) continue;\n b = true;\n // 对齐只进行一次\n setPos({\n target,\n x,\n y,\n centerX: i - 1,\n centerY: item.index - 1,\n width,\n height,\n dir: 'x',\n });\n const dis = min * item.dir;\n aList.forEach((x) => (x.x -= dis));\n }\n }\n return lines;\n}\n\nfunction collectHorizontalLine(props: CollectItemLineProps) {\n const { target, list, aList, margin } = props;\n\n const arr = aList.map((x) => getDistanceLine(x, list, 'y'));\n const min = Math.min(...arr.map((x) => x.dis));\n if (min > margin) return [];\n const lines: HorizontalLine[] = [];\n const width = aList[0].x2 - aList[0].x;\n const height = aList[0].y2 - aList[0].y;\n let b = false;\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n if (min == item.dis) {\n const line = list[item.index];\n const aLine = aList[item.index];\n const y = line.y;\n const x = aLine.x;\n\n const x1 = Math.min(line.x, line.x2, x, aLine.x2);\n const x2 = Math.max(line.x, line.x2, x, aLine.x2);\n // 参考线可画多条\n lines.push({ y, x1, x2 });\n if (b) continue;\n b = true;\n // 对齐只进行一次\n setPos({\n target,\n x,\n y,\n centerX: item.index - 1,\n centerY: i - 1,\n width,\n height,\n dir: 'y',\n });\n const dis = min * item.dir;\n aList.forEach((x) => (x.y -= dis));\n }\n }\n return lines;\n}\n\ntype LineProps = {\n x: number;\n y: number;\n x2: number;\n y2: number;\n};\nfunction getDistanceLine(\n target: LineProps,\n list: LineProps[],\n type: 'x' | 'y',\n) {\n let dis = Infinity;\n let index = -1;\n /** 1正值 -1负值 */\n let dir = 1;\n for (let i = 0; i < list.length; i++) {\n const v = getDistance(target[type], list[i][type]);\n if (dis > v) {\n index = i;\n dis = v;\n dir = target[type] > list[i][type] ? 1 : -1;\n }\n }\n return { dis, index, dir };\n}\n\nfunction makeLineByRect(rect: TBBox) {\n const { left, top, width, height } = rect;\n const a = { x: left, y: top, x2: left + width, y2: top + height };\n const x = left + width / 2;\n const y = top + height / 2;\n const b = { x, y, x2: x, y2: y };\n const c = { x: left + width, x2: left, y: top + height, y2: top };\n\n return [a, b, c];\n}\n\ntype SnapToPixelProps = {\n target: FabricObject;\n x: number;\n y: number;\n /** -1 0 1 */\n centerX: number;\n /** -1 0 1 */\n centerY: number;\n width: number;\n height: number;\n dir: 'x' | 'y';\n};\nfunction setPos(props: SnapToPixelProps) {\n const { target, centerX, centerY, width, height, dir } = props;\n let { x, y } = props;\n x -= (centerX * width) / 2;\n y -= (centerY * height) / 2;\n setPositionDir(target, new Point(x, y), dir);\n target.setCoords();\n}\n"],"names":["collectLine","props","_activeObject$canvas$","_activeObject$canvas","aligningLineMargin","aligningLineConfig","margin","activeObject","activeObjectRect","objectRect","list","makeLineByRect","aList","canvas","getZoom","opts","target","vLines","collectVerticalLine","hLines","collectHorizontalLine","arr","map","x","getDistanceLine","min","Math","dis","lines","width","x2","height","y2","y","b","i","length","item","line","index","aLine","y1","max","push","setPos","centerX","centerY","dir","forEach","x1","type","Infinity","v","getDistance","rect","left","top","a","c","setPositionDir","Point","setCoords"],"mappings":"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"}