UNPKG

tldraw

Version:

A tiny little drawing editor.

87 lines (86 loc) 3.74 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var elbowArrowSnapLines_exports = {}; __export(elbowArrowSnapLines_exports, { getElbowArrowSnapLines: () => getElbowArrowSnapLines, perpDistanceToLine: () => perpDistanceToLine, perpDistanceToLineAngle: () => perpDistanceToLineAngle }); module.exports = __toCommonJS(elbowArrowSnapLines_exports); var import_editor = require("@tldraw/editor"); var import_shared = require("../shared"); const snapLinesStore = new import_editor.WeakCache(); function getElbowArrowSnapLines(editor) { return snapLinesStore.get(editor, (editor2) => { const currentSelectedArrowShape = (0, import_editor.computed)("current selected arrow shape", () => { const shape = editor2.getOnlySelectedShape(); if (!shape || !editor2.isShapeOfType(shape, "arrow")) return null; return shape.id; }); const unselectedArrowShapeIds = editor2.store.query.ids("shape", () => { const activeArrowShapeId = currentSelectedArrowShape.get(); if (!activeArrowShapeId) return { type: { eq: "arrow" } }; return { type: { eq: "arrow" }, id: { neq: activeArrowShapeId } }; }); return (0, import_editor.computed)("elbow arrow snap lines", () => { const result = /* @__PURE__ */ new Map(); const currentPageShapeIds = editor2.getCurrentPageShapeIds(); const viewportBounds = editor2.getViewportPageBounds(); for (const id of unselectedArrowShapeIds.get()) { if (!currentPageShapeIds.has(id)) continue; const shape = editor2.getShape(id); if (shape?.type !== "arrow") continue; const shapeBounds = editor2.getShapePageBounds(id); if (!shapeBounds || !viewportBounds.includes(shapeBounds)) continue; const bindings = (0, import_shared.getArrowBindings)(editor2, shape); const geometry = editor2.getShapePageGeometry(id); const vertices = geometry.getVertices({ includeInternal: false, includeLabels: false }); for (let i = 1; i < vertices.length; i++) { const prev = vertices[i - 1]; const curr = vertices[i]; let angle = import_editor.Vec.Angle(prev, curr); if (angle < 0) angle += Math.PI; let set = result.get(angle); if (!set) { set = /* @__PURE__ */ new Set(); result.set(angle, set); } const perpDistance = perpDistanceToLineAngle(prev, angle); set.add({ perpDistance, startBoundShapeId: bindings.start?.toId, endBoundShapeId: bindings.end?.toId }); } } return result; }); }).get(); } function perpDistanceToLineAngle(pointOnLine, lineAngle) { const perpDir = import_editor.Vec.FromAngle(lineAngle).per(); return import_editor.Vec.Dpr(pointOnLine, perpDir); } function perpDistanceToLine(A, B) { return perpDistanceToLineAngle(A, import_editor.Vec.Angle(A, B)); } //# sourceMappingURL=elbowArrowSnapLines.js.map