@leafer-in/linker 2.3.2 → 2.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"linker.min.cjs","sources":["../../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.44.2_tslib@2.8.1_typescript@5.8.3/node_modules/tslib/tslib.es6.js","../../../../../../src/in/packages/linker/src/data/LinkerData.ts","../../../../../../src/in/packages/linker/src/helper/LinkerHelper.ts","../../../../../../src/in/packages/linker/src/decorator.ts","../../../../../../src/in/packages/linker/src/Linker.ts","../../../../../../src/in/packages/linker/src/helper/drawPoints.ts","../../../../../../src/in/packages/linker/src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { ILinkerData } from \"@leafer-ui/interface\"\nimport { LineData } from '@leafer-ui/draw'\n\n\nexport class LinkerData extends LineData implements ILinkerData {\n\n public get __usePathBox(): boolean {\n return ((this as ILinkerData).path || (this as ILinkerData).__pathInputed) as any as boolean\n }\n\n}\n","import { IBoundsData, IDirection, IDirection4, ILinker, IPointData, IUI } from '@leafer-ui/interface'\nimport { AroundHelper, BoundsHelper, Direction9, PointHelper } from '@leafer-ui/draw'\n\n\nconst { directionData } = AroundHelper\n\nconst directionNames: IDirection[] = [\n 'top-left',\n 'top',\n 'top-right',\n 'right',\n 'bottom-right',\n 'bottom',\n 'bottom-left',\n 'left',\n 'center'\n]\n\nexport const LinkerHelper = {\n\n /**\n * 根据箭头方向获取控制点\n */\n getCtrlPoint(linker: ILinker, node: IUI, point: IPointData, direction: IDirection, ctrl: IPointData, offsetAngle?: number): IPointData {\n\n if (node) {\n point = node.getBoxPoint(point, linker)\n // half 需要 / startNode.scale\n }\n\n let ctrlPoint\n switch (direction) {\n case 'left':\n case 'top-left':\n case 'bottom-left':\n ctrlPoint = {\n x: point.x - ctrl.x,\n y: point.y\n }\n break\n case 'top':\n ctrlPoint = {\n x: point.x,\n y: point.y - ctrl.y\n }\n break\n case 'right':\n case 'top-right':\n case 'bottom-right':\n ctrlPoint = {\n x: point.x + ctrl.x,\n y: point.y\n }\n break\n case 'bottom':\n ctrlPoint = {\n x: point.x,\n y: point.y + ctrl.y\n }\n break\n default:\n ctrlPoint = {\n x: point.x,\n y: point.y\n }\n }\n if (offsetAngle) { // 旋转角度\n offsetAngle = offsetAngle / 180 * Math.PI\n ctrlPoint = {\n x: (ctrlPoint.x - point.x) * Math.cos(offsetAngle) - (ctrlPoint.y - point.y) * Math.sin(offsetAngle) + point.x,\n y: (ctrlPoint.x - point.x) * Math.sin(offsetAngle) + (ctrlPoint.y - point.y) * Math.cos(offsetAngle) + point.y\n }\n }\n\n if (node) node.getWorldPointByBox(ctrlPoint, linker, undefined, true)\n\n return ctrlPoint\n },\n\n // 是否为相反方向\n isOppositeDirection(from: IDirection, to: IDirection): boolean {\n switch (from) {\n case 'left':\n return to == 'right'\n case 'top':\n return to == 'bottom'\n case 'right':\n return to == 'left'\n case 'bottom':\n return to == 'top'\n case 'center':\n return to == 'center'\n default:\n return false\n }\n },\n\n /**\n * 获取to 相对于 from 的方向\n * @param from\n * @param to\n * @returns\n */\n getDirectionForFromPoint(from: IPointData, to: IPointData): IDirection4 {\n const a = from.x - to.x\n const b = from.y - to.y\n\n let direction: IDirection\n let angle = (180 * Math.atan2(b, a)) / Math.PI\n\n if (angle < 0) angle = 360 + angle\n\n if (angle > 315 || angle < 45) {\n direction = 'left'\n } else if (angle > 45 && angle < 135) {\n direction = 'top'\n } else if (angle > 135 && angle < 225) {\n direction = 'right'\n } else {\n direction = 'bottom'\n }\n\n return direction\n },\n\n getRotateDirection(direction: IDirection, rotation: number, totalDirection = 8): IDirection {\n let directionIndex = Direction9[direction]\n directionIndex = (directionIndex + Math.round(rotation / (360 / totalDirection))) % totalDirection\n if (directionIndex < 0) directionIndex += totalDirection\n return directionNames[directionIndex]\n },\n\n getDirection,\n\n getPointDirection,\n\n autoRotatePoint(point: IPointData, origin: IPointData, ui: IUI): void {\n const { rotation, scaleX, scaleY } = ui\n const oneFlip = scaleX * scaleY < 0\n if (rotation || oneFlip) PointHelper.rotate(point, oneFlip ? -rotation : rotation, origin)\n }\n\n}\n\n\n\nfunction getPointDirection(boxPoint: IPointData, bounds: IBoundsData, eight?: boolean): IDirection {\n const { width, height } = bounds\n const hitRadiusX = width / 4\n const hitRadiusY = height / 4\n\n for (let i = 0; i < directionData.length; i++) {\n const unit = directionData[i]\n // 百分比坐标转像素\n const px = unit.x * width\n const py = unit.y * height\n\n const dx = boxPoint.x - px\n const dy = boxPoint.y - py\n\n if (Math.abs(dx) <= hitRadiusX && Math.abs(dy) <= hitRadiusY) {\n if (eight) {\n if (directionNames[i] !== 'center') return directionNames[i]\n } else return directionNames[i]\n }\n }\n\n return undefined\n}\n\n\nfunction getDirection(boxPoint: IPointData, bounds: IBoundsData, four?: boolean): IDirection4 | 'center' {\n const { width, height } = bounds\n const center = BoundsHelper.getPoint(bounds, 'center', true)\n // 将元素沿着对角线切成4块,匹配对应上下左右四个方向\n // 转为以中心为原点的坐标\n const dx = boxPoint.x - center.x\n const dy = boxPoint.y - center.y\n\n if (!four) {\n // 中心点\n if (Math.abs(dx) < width / 4 && Math.abs(dy) < height / 4) return 'center'\n }\n\n // ----------------------------------------\n // 将矩形按比例缩放到正方形空间\n //\n // 等价于比较:\n // |dx| / width 和 |dy| / height\n //\n // 但为了避免除法,改为:\n // |dx| * height 和 |dy| * width\n //\n // 这样可以严格按矩形的两条对角线划分区域\n // ----------------------------------------\n\n const ax = Math.abs(dx) * height\n const ay = Math.abs(dy) * width\n\n // 左右区域\n if (ax > ay) {\n return dx > 0 ? 'right' : 'left'\n }\n\n // 上下区域\n return dy > 0 ? 'bottom' : 'top'\n}","import { IValue } from '@leafer-ui/interface'\nimport { decorateLeafAttr, attr, doBoundsType, doStrokeType } from '@leafer-ui/draw'\n\n\nexport function linkerPointType(defaultValue?: IValue) {\n return decorateLeafAttr(defaultValue, (key: string) => attr({\n set(value: IValue) {\n if (this.__setAttr(key, value)) {\n const layout = this.__layout\n if (!layout.linkerChanged) {\n doBoundsType(this)\n doStrokeType(this)\n layout.linkerChanged = true\n }\n }\n }\n }))\n}","import { ILinker, ILinkerInputData, ILinkerData, ILinkerPointData, ILinkerPointOptions, ILinkerComputedPointData, ILinkerPointType, IPointData, IUI, IDirection4, ILeaf, IPointsCurve, IPointsCurveData } from '@leafer-ui/interface'\nimport { registerUI, dataProcessor, PathCommandDataHelper, pathType, isString, BoundsEvent, Line, PointHelper, BoundsHelper, LeafHelper, isObject } from '@leafer-ui/draw'\n\nimport { LinkerData } from './data/LinkerData'\nimport { LinkerHelper } from './helper/LinkerHelper'\nimport { linkerPointType } from './decorator'\n\n\nconst { moveTo, bezierCurveTo, drawPoints } = PathCommandDataHelper\nconst { isEmpty, getPoint } = BoundsHelper\nconst { getDistance } = PointHelper\nconst { getCtrlPoint, getDirectionForFromPoint, isOppositeDirection } = LinkerHelper\nconst { max, min, abs } = Math\n\n\n@registerUI()\nexport class Linker extends Line implements ILinker {\n\n public get __tag() { return 'Linker' }\n\n @dataProcessor(LinkerData)\n declare public __: ILinkerData\n\n @linkerPointType()\n public startPoint?: ILinkerPointData\n\n @linkerPointType()\n public endPoint?: ILinkerPointData\n\n @pathType({ type: 'C', value: 0.5 } as IPointsCurveData)\n declare public curve?: IPointsCurve\n\n public startNode: IUI\n public endNode: IUI\n\n public startData: ILinkerComputedPointData\n public endData: ILinkerComputedPointData\n\n\n constructor(data?: ILinkerInputData) {\n super(data)\n this.onStartNodeChange = this.onStartNodeChange.bind(this)\n this.onEndNodeChange = this.onEndNodeChange.bind(this)\n }\n\n public __updatePath(): void {\n\n const layout = this.__layout\n\n const { startNode, endNode } = this\n\n if (layout.linkerChanged) {\n this.updateLinkerNode('start')\n this.updateLinkerNode('end')\n\n this.updateLinkerPoint('start')\n this.updateLinkerPoint('end')\n\n if (startNode !== this.startNode) this.listenLinkerNode(this.startNode, startNode, 'start')\n if (endNode !== this.endNode) this.listenLinkerNode(this.endNode, endNode, 'end')\n\n layout.linkerChanged = false\n }\n\n this.updateLinkerPath()\n }\n\n public listenLinkerNode(newNode: IUI, oldNode: IUI, type: ILinkerPointType): void {\n if (oldNode) {\n oldNode.off(BoundsEvent.WORLD, type === 'end' ? this.onEndNodeChange : this.onStartNodeChange)\n const list = type === 'end' ? oldNode.endLinker : oldNode.startLinker\n if (list) {\n const index = list.indexOf(this)\n if (index > -1) list.splice(index, 1)\n }\n }\n if (newNode) {\n newNode.on(BoundsEvent.WORLD, type === 'end' ? this.onEndNodeChange : this.onStartNodeChange)\n const list = type === 'end' ? (newNode.endLinker || (newNode.endLinker = [])) : (newNode.startLinker || (newNode.startLinker = []))\n list.push(this)\n }\n }\n\n public onStartNodeChange(): void {\n this.onLinkerNodeChange('start')\n }\n\n public onEndNodeChange(): void {\n this.onLinkerNodeChange('end')\n }\n\n public onLinkerNodeChange(type: ILinkerPointType): void {\n if (this.leaferIsCreated) {\n const { layouter, zoomLayer } = this.leafer\n if (layouter.__updatedList.has(zoomLayer)) return // 节流,画布缩放平移不用更新\n layouter.addExtra(this, true)\n }\n\n const { startData, endData } = this\n if (type == 'start') {\n this.updateLinkerPoint('start')\n if (endData && endData.auto) this.updateLinkerPoint('end')\n } else {\n if (startData && startData.auto) this.updateLinkerPoint('start')\n this.updateLinkerPoint('end')\n }\n\n this.__layout.boxChange()\n LeafHelper.updateBounds(this)\n }\n\n public updateLinkerNode(type: ILinkerPointType) {\n const { startPoint, endPoint } = this\n const nowPoint = type === 'end' ? endPoint : startPoint\n if (nowPoint) {\n const { id } = nowPoint\n const ui = id && (isString(id) ? this.app.findId(id) : id)\n type === 'end' ? this.endNode = ui : this.startNode = ui\n }\n }\n\n public getLinkerNodeCenter(type: ILinkerPointType): IPointData {\n const { startPoint, endPoint, startNode, endNode, startData, endData } = this\n const node = type === 'end' ? endNode : startNode\n const data = type === 'end' ? (endData || endPoint) : (startData || startPoint)\n if (node) {\n const { worldRenderBounds } = node\n if (isEmpty(worldRenderBounds)) LeafHelper.updateBounds(node) // 防止线条位于元素底部,先于元素布局\n return getPoint(node.worldRenderBounds, 'center')\n } else {\n return data && isObject(data.point) && this.getWorldPointByLocal(data.point)\n }\n }\n\n public updateLinkerPoint(type: ILinkerPointType) {\n const { startPoint, endPoint } = this\n const nowPoint = type === 'end' ? endPoint : startPoint\n if (nowPoint) {\n const data = {} as ILinkerComputedPointData\n const { id, offset } = nowPoint\n let { direction, point } = nowPoint\n\n if (direction === 'center' || (!direction && id && !point)) {\n const start = this.getLinkerNodeCenter('start')\n const end = this.getLinkerNodeCenter('end')\n const from = type === 'end' ? end : start\n const to = type === 'end' ? start : end\n if (from && to) direction = getDirectionForFromPoint(from, to)\n data.auto = true\n }\n\n\n if (!direction && isString(point)) direction = point as any as IDirection4\n\n\n data.direction = direction\n\n const ui = type === 'end' ? this.endNode : this.startNode\n\n let p: IPointData\n\n if (ui) {\n if (!point) point = direction\n if (point) {\n const { boxBounds } = ui\n\n if (isEmpty(boxBounds)) LeafHelper.updateBounds(ui) // 防止线条位于元素底部,先于元素布局\n p = getPoint(boxBounds, point, true)\n ui.getWorldPointByBox(p, this, false, true)\n }\n } else {\n if (isObject(point)) p = point\n }\n\n if (p && offset) {\n const o = { ...offset } as IPointData\n if (!offset.x) o.x = 0\n if (!offset.y) o.y = 0\n\n if (ui) ui.getWorldPoint(o, this, true, true)\n PointHelper.move(p, o)\n }\n\n data.point = p\n\n type === 'end' ? this.endData = p && data : this.startData = p && data\n\n }\n }\n\n\n public updateLinkerPath() {\n const data = this.__\n const path: number[] = data.path = []\n\n const hasPoints = data.points && data.points.length\n\n const { startData, endData, startNode, endNode } = this\n if (!startData || !endData) {\n return\n }\n\n const startPoint = startData.point, endPoint = endData.point\n const startDirection = startData.direction, endDirection = endData.direction\n\n const half: IPointData = {\n x: abs((startPoint.x - endPoint.x) / 2),\n y: abs((startPoint.y - endPoint.y) / 2)\n }\n\n\n const arrowWidth = this.__.strokeWidth * 8\n\n let minCtrl: number\n\n if (this.__.__useArrow) {\n const ratio = min(getDistance(startPoint, endPoint) / (arrowWidth * 25), 1) // 控制add 手柄的长度与两点间的距离有关\n minCtrl = max(arrowWidth * ratio * 12, arrowWidth * 3,) // 控制手柄最少不能低于3个箭头的宽度\n } else {\n minCtrl = arrowWidth * 2\n }\n\n if (endDirection) {\n\n if (isOppositeDirection(startDirection, endDirection) && startDirection === getDirectionForFromPoint(startPoint, endPoint)) // 正好处于相反的位置, 不需要太长的控制手柄\n {\n minCtrl = arrowWidth * 2\n }\n\n }\n\n half.x = max(minCtrl, half.x)\n half.y = max(minCtrl, half.y)\n\n if (hasPoints) {\n minCtrl *= 0.6\n const points = PointHelper.toNumberPoints(data.points)\n drawPoints(path, [startPoint.x, startPoint.y, ...points, endPoint.x, endPoint.y], data.curve, false, data)\n\n if (startDirection) {\n const handleX = path[4]\n const handleY = path[5]\n\n half.x = max(minCtrl, abs(handleX - startPoint.x))\n half.y = max(minCtrl, abs(handleY - startPoint.y))\n const startCtrlPoint: IPointData = getCtrlPoint(this, startNode, startPoint, startDirection, half)\n path[4] = startCtrlPoint.x\n path[5] = startCtrlPoint.y\n }\n\n const len = path.length\n if (endDirection) {\n\n const handleX = path[len - 4]\n const handleY = path[len - 3]\n\n half.x = max(minCtrl, abs(handleX - endPoint.x))\n half.y = max(minCtrl, abs(handleY - endPoint.y))\n const endCtrlPoint: IPointData = getCtrlPoint(this, endNode, endPoint, endDirection, half)\n path[len - 4] = endCtrlPoint.x\n path[len - 3] = endCtrlPoint.y\n } else {\n path[len - 4] = endPoint.x\n path[len - 3] = endPoint.y\n }\n\n } else {\n\n const startCtrlPoint: IPointData = startDirection ? getCtrlPoint(this, startNode, startPoint, startDirection, half) : startPoint\n const endCtrlPoint: IPointData = endDirection ? getCtrlPoint(this, endNode, endPoint, endDirection, half) : endPoint\n\n moveTo(path, startPoint.x, startPoint.y)\n bezierCurveTo(path, startCtrlPoint.x, startCtrlPoint.y, endCtrlPoint.x, endCtrlPoint.y, endPoint.x, endPoint.y)\n }\n\n\n }\n\n public createStartPoint(worldPoint: IPointData, node?: ILeaf, options?: ILinkerPointOptions): ILinkerPointData {\n const data = this.createLinkerPoint(worldPoint, node, options)\n this.startPoint = data\n return data\n }\n\n public createEndPoint(worldPoint: IPointData, node?: ILeaf, options?: ILinkerPointOptions): ILinkerPointData {\n const data = this.createLinkerPoint(worldPoint, node, options)\n this.endPoint = data\n return data\n }\n\n public createLinkerPoint(worldPoint: IPointData, node?: ILeaf, options?: ILinkerPointOptions): ILinkerPointData {\n const data: ILinkerPointData = {}\n if (node && node.id) {\n const point = node.getBoxPoint(worldPoint)\n const { boxBounds } = node\n\n const mode = options && options.mode\n\n const edge = mode === 'edge' || !mode\n const four = mode === 'four'\n const auto = mode === 'auto'\n const free = mode === 'free'\n\n if (!auto) {\n\n if (four) {\n data.point = LinkerHelper.getDirection(point, boxBounds, four)\n } else {\n data.direction = LinkerHelper.getDirection(point, boxBounds, edge)\n data.point = LinkerHelper.getPointDirection(point, boxBounds, edge) || data.direction\n if (data.point === data.direction) delete data.direction\n\n if (free || edge) {\n const snapPoint = BoundsHelper.getPoint(boxBounds, data.point)\n\n const offsetX = point.x - snapPoint.x\n const offsetY = point.y - snapPoint.y\n\n const snapRadius = (options && options.snapRadius) || 10\n\n if (Math.abs(offsetX) > snapRadius || Math.abs(offsetY) > snapRadius) {\n const offset = data.offset = {\n x: Math.abs(offsetX) > snapRadius ? offsetX : 0,\n y: Math.abs(offsetY) > snapRadius ? offsetY : 0\n }\n\n if (edge && (offset.x || offset.y)) {\n switch (data.direction || data.point) {\n case 'top':\n case 'bottom':\n offset.y = 0; break\n case 'right':\n case 'left':\n offset.x = 0; break\n default:\n if (offset.x > offset.y) offset.y = 0\n else offset.x = 0\n }\n\n }\n }\n }\n }\n\n }\n\n data.id = node.id\n } else {\n data.point = this.getLocalPoint(worldPoint)\n }\n\n return data\n }\n\n}","import { IPointData, IPathCommandData } from '@leafer-ui/interface'\n\nimport { PathCommandMap, PointHelper } from '@leafer-ui/core'\n\nconst { toNumberPoints } = PointHelper\nconst { M, L, C, Z } = PathCommandMap\n\n\n/**\n * 使用角平分线自动生成平滑 Bezier 曲线\n *\n * 算法特点:\n *\n * 1. Handle 方向:\n * 使用前后方向的角平分线\n *\n * 2. Handle 长度:\n * 左右分别根据相邻边长度计算\n *\n * in = AB * curve\n * out = BC * curve\n *\n * 3. 自动曲率控制:\n *\n * - 接近平角:\n * 降低 handle,避免直线中间产生鼓包\n *\n * - 接近尖角:\n * 降低 handle,避免曲线过冲\n *\n * 4. 性能:\n *\n * - O(n)\n * - 无对象创建\n * - 无临时数组\n * - 适合大规模路径\n *\n *\n * curve:\n *\n * 0 直线\n * 0.5 推荐\n * 1 最大平滑\n */\n\n/**\n * 使用角平分线法线生成自动 Bezier 曲线\n *\n * 算法:\n *\n * 1. 通过 BA / BC 求角平分方向\n * 2. 旋转 90° 得到曲线切线方向\n * 3. 左右 handle 长度分别根据两侧距离计算\n *\n * handle:\n *\n * C2\n * |\n * |\n * A ---- B ---- C\n * |\n * |\n * C1\n *\n *\n * curve:\n *\n * 0 直线\n * 0.5 推荐\n * 1 最大曲率\n */\nexport function drawPoints(data: IPathCommandData, originPoints: number[] | IPointData[], curve?: boolean | number, close?: boolean): void {\n const points = toNumberPoints(originPoints)\n const count = points.length >> 1\n\n if (count < 2) return\n\n data.push(M, points[0], points[1])\n\n if (!curve || count < 3) {\n\n for (let i = 1; i < count; i++) {\n\n data.push(L, points[i * 2], points[i * 2 + 1])\n }\n\n if (close) data.push(Z)\n return\n }\n\n let tension = curve === true ? 0.5 : curve as number\n\n if (tension < 0) tension = 0\n else if (tension > 1) tension = 1\n\n const end = close ? count : count - 1\n\n let lastOutX = points[0]\n let lastOutY = points[1]\n\n /**\n * 非闭合路径第一个点:\n * 使用第一条边方向作为初始切线\n */\n {\n\n const dx = points[2] - points[0]\n const dy = points[3] - points[1]\n\n const len = Math.sqrt(dx * dx + dy * dy)\n\n if (len) {\n lastOutX = points[0] + dx / len * len * tension\n lastOutY = points[1] + dy / len * len * tension\n }\n }\n\n\n for (let i = 0; i < end; i++) {\n const index = i + 1 === count ? 0 : i + 1\n\n const bx = points[index * 2]\n const by = points[index * 2 + 1]\n\n const prev = index === 0 ? count - 1 : index - 1\n const next = index + 1 === count ? 0 : index + 1\n\n const ax = points[prev * 2]\n const ay = points[prev * 2 + 1]\n\n const cx = points[next * 2]\n const cy = points[next * 2 + 1]\n\n /**\n * BA\n */\n let bax = ax - bx\n let bay = ay - by\n\n /**\n * BC\n */\n let bcx = cx - bx\n let bcy = cy - by\n\n const ab = Math.sqrt(bax * bax + bay * bay)\n const bc = Math.sqrt(bcx * bcx + bcy * bcy)\n\n let inX = bx\n let inY = by\n\n let outX = bx\n let outY = by\n\n if (ab || bc) {\n\n /**\n * 计算角平分方向\n */\n let ux = 0\n let uy = 0\n\n if (ab) {\n ux += bax / ab\n uy += bay / ab\n }\n\n if (bc) {\n ux += bcx / bc\n uy += bcy / bc\n }\n\n /**\n * 角平分线长度\n */\n let uLen = Math.sqrt(ux * ux + uy * uy)\n\n /**\n * 180度:\n * 两个方向抵消\n *\n * 使用 BC 方向\n */\n if (!uLen) {\n\n if (bc) {\n ux = bcx / bc\n uy = bcy / bc\n\n } else {\n ux = bax / ab\n uy = bay / ab\n }\n\n\n uLen = 1\n }\n\n ux /= uLen\n uy /= uLen\n\n /**\n * 角平分线旋转90度\n *\n * 得到曲线切线方向\n */\n let tx = -uy\n let ty = ux\n\n /**\n * 保证方向朝向下一点\n */\n if (bc) {\n if (tx * bcx + ty * bcy < 0) {\n tx = -tx\n ty = -ty\n }\n }\n\n /**\n * 计算夹角\n */\n let cos = 0\n\n if (ab && bc) {\n cos = (bax * bcx + bay * bcy) / (ab * bc)\n if (cos > 1) cos = 1\n else if (cos < -1) cos = -1\n }\n\n /**\n * 曲率限制:\n *\n * 平角降低\n * 尖角降低\n */\n let angleFactor = Math.sqrt(Math.sqrt(Math.max(0, 1 - cos * cos)))\n\n /**\n * 保留少量曲率,\n * 避免完全退化\n */\n if (angleFactor < 0.15) angleFactor = 0.15\n\n let inLength = ab * tension * angleFactor\n let outLength = bc * tension * angleFactor\n\n /**\n * 防止 handle 过长\n */\n const maxLength = Math.min(ab || bc, bc || ab) * 0.5\n\n if (inLength > maxLength) inLength = maxLength\n if (outLength > maxLength) outLength = maxLength\n\n inX = bx - tx * inLength\n inY = by - ty * inLength\n\n outX = bx + tx * outLength\n outY = by + ty * outLength\n }\n\n data.push(C,\n\n // 上一个节点 handle out\n lastOutX,\n lastOutY,\n\n // 当前节点 handle in\n inX,\n inY,\n\n // 当前节点\n bx,\n by\n )\n\n lastOutX = outX\n lastOutY = outY\n }\n\n if (close) data.push(Z)\n}","export { Linker } from './Linker'\nexport { LinkerData } from './data/LinkerData'\n\nimport { Plugin, registerPointsCurve } from '@leafer-ui/draw'\nimport { drawPoints } from './helper/drawPoints'\n\n\nPlugin.add('linker')\n\nregisterPointsCurve('C', drawPoints)"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","SuppressedError","LinkerData","LineData","__usePathBox","this","path","__pathInputed","directionData","AroundHelper","directionNames","LinkerHelper","getCtrlPoint","linker","node","point","direction","ctrl","offsetAngle","ctrlPoint","getBoxPoint","x","y","Math","PI","cos","sin","getWorldPointByBox","undefined","isOppositeDirection","from","to","getDirectionForFromPoint","a","b","angle","atan2","getRotateDirection","rotation","totalDirection","directionIndex","Direction9","round","getDirection","boxPoint","bounds","four","width","height","center","BoundsHelper","getPoint","dx","dy","abs","ax","ay","getPointDirection","eight","hitRadiusX","hitRadiusY","unit","px","py","autoRotatePoint","origin","ui","scaleX","scaleY","oneFlip","PointHelper","rotate","linkerPointType","defaultValue","decorateLeafAttr","attr","set","value","__setAttr","layout","__layout","linkerChanged","doBoundsType","doStrokeType","moveTo","bezierCurveTo","drawPoints","PathCommandDataHelper","isEmpty","getDistance","max","min","Linker","Line","__tag","constructor","data","super","onStartNodeChange","bind","onEndNodeChange","__updatePath","startNode","endNode","updateLinkerNode","updateLinkerPoint","listenLinkerNode","updateLinkerPath","newNode","oldNode","type","off","BoundsEvent","WORLD","list","endLinker","startLinker","index","indexOf","splice","on","push","onLinkerNodeChange","leaferIsCreated","layouter","zoomLayer","leafer","__updatedList","has","addExtra","startData","endData","auto","boxChange","LeafHelper","updateBounds","startPoint","endPoint","nowPoint","id","isString","app","findId","getLinkerNodeCenter","worldRenderBounds","isObject","getWorldPointByLocal","offset","start","end","p","boxBounds","o","assign","getWorldPoint","move","__","hasPoints","points","startDirection","endDirection","half","arrowWidth","strokeWidth","minCtrl","__useArrow","ratio","toNumberPoints","curve","handleX","handleY","startCtrlPoint","len","endCtrlPoint","createStartPoint","worldPoint","options","createLinkerPoint","createEndPoint","mode","edge","free","snapPoint","offsetX","offsetY","snapRadius","getLocalPoint","dataProcessor","prototype","pathType","registerUI","M","L","C","Z","PathCommandMap","Plugin","add","registerPointsCurve","originPoints","close","count","tension","lastOutX","lastOutY","sqrt","bx","by","prev","next","bax","bay","bcx","bcy","ab","bc","inX","inY","outX","outY","ux","uy","uLen","tx","ty","angleFactor","inLength","outLength","maxLength"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"linker.min.cjs","sources":["../../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.44.2_tslib@2.8.1_typescript@5.8.3/node_modules/tslib/tslib.es6.js","../../../../../../src/in/packages/linker/src/data/LinkerData.ts","../../../../../../src/in/packages/linker/src/helper/LinkerHelper.ts","../../../../../../src/in/packages/linker/src/decorator.ts","../../../../../../src/in/packages/linker/src/helper/drawPolyline.ts","../../../../../../src/in/packages/linker/src/Linker.ts","../../../../../../src/in/packages/linker/src/helper/drawPoints.ts","../../../../../../src/in/packages/linker/src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { ILinkerData } from \"@leafer-ui/interface\"\nimport { LineData } from '@leafer-ui/draw'\n\n\nexport class LinkerData extends LineData implements ILinkerData {\n\n public get __usePathBox(): boolean {\n return ((this as ILinkerData).path || (this as ILinkerData).__pathInputed) as any as boolean\n }\n\n}\n","import { IBoundsData, IDirection, IDirection4, ILinker, IPointData, IUI } from '@leafer-ui/interface'\nimport { AroundHelper, BoundsHelper, Direction9, PointHelper } from '@leafer-ui/draw'\n\n\nconst { directionData } = AroundHelper\n\nconst directionNames: IDirection[] = [\n 'top-left',\n 'top',\n 'top-right',\n 'right',\n 'bottom-right',\n 'bottom',\n 'bottom-left',\n 'left',\n 'center'\n]\n\nexport const LinkerHelper = {\n\n /**\n * 根据箭头方向获取控制点\n */\n getCtrlPoint(linker: ILinker, node: IUI, point: IPointData, direction: IDirection, ctrl: IPointData, offsetAngle?: number): IPointData {\n\n if (node) {\n point = node.getBoxPoint(point, linker)\n // half 需要 / startNode.scale\n }\n\n let ctrlPoint\n switch (direction) {\n case 'left':\n case 'top-left':\n case 'bottom-left':\n ctrlPoint = {\n x: point.x - ctrl.x,\n y: point.y\n }\n break\n case 'top':\n ctrlPoint = {\n x: point.x,\n y: point.y - ctrl.y\n }\n break\n case 'right':\n case 'top-right':\n case 'bottom-right':\n ctrlPoint = {\n x: point.x + ctrl.x,\n y: point.y\n }\n break\n case 'bottom':\n ctrlPoint = {\n x: point.x,\n y: point.y + ctrl.y\n }\n break\n default:\n ctrlPoint = {\n x: point.x,\n y: point.y\n }\n }\n if (offsetAngle) { // 旋转角度\n offsetAngle = offsetAngle / 180 * Math.PI\n ctrlPoint = {\n x: (ctrlPoint.x - point.x) * Math.cos(offsetAngle) - (ctrlPoint.y - point.y) * Math.sin(offsetAngle) + point.x,\n y: (ctrlPoint.x - point.x) * Math.sin(offsetAngle) + (ctrlPoint.y - point.y) * Math.cos(offsetAngle) + point.y\n }\n }\n\n if (node) node.getWorldPointByBox(ctrlPoint, linker, undefined, true)\n\n return ctrlPoint\n },\n\n // 是否为相反方向\n isOppositeDirection(from: IDirection, to: IDirection): boolean {\n switch (from) {\n case 'left':\n return to == 'right'\n case 'top':\n return to == 'bottom'\n case 'right':\n return to == 'left'\n case 'bottom':\n return to == 'top'\n case 'center':\n return to == 'center'\n default:\n return false\n }\n },\n\n /**\n * 获取to 相对于 from 的方向\n * @param from\n * @param to\n * @returns\n */\n getDirectionForFromPoint(from: IPointData, to: IPointData): IDirection4 {\n const a = from.x - to.x\n const b = from.y - to.y\n\n let direction: IDirection\n let angle = (180 * Math.atan2(b, a)) / Math.PI\n\n if (angle < 0) angle = 360 + angle\n\n if (angle > 315 || angle < 45) {\n direction = 'left'\n } else if (angle > 45 && angle < 135) {\n direction = 'top'\n } else if (angle > 135 && angle < 225) {\n direction = 'right'\n } else {\n direction = 'bottom'\n }\n\n return direction\n },\n\n getRotateDirection(direction: IDirection, rotation: number, totalDirection = 8): IDirection {\n let directionIndex = Direction9[direction]\n directionIndex = (directionIndex + Math.round(rotation / (360 / totalDirection))) % totalDirection\n if (directionIndex < 0) directionIndex += totalDirection\n return directionNames[directionIndex]\n },\n\n getDirection,\n\n getPointDirection,\n\n autoRotatePoint(point: IPointData, origin: IPointData, ui: IUI): void {\n const { rotation, scaleX, scaleY } = ui\n const oneFlip = scaleX * scaleY < 0\n if (rotation || oneFlip) PointHelper.rotate(point, oneFlip ? -rotation : rotation, origin)\n }\n\n}\n\n\n\nfunction getPointDirection(boxPoint: IPointData, bounds: IBoundsData, eight?: boolean): IDirection {\n const { width, height } = bounds\n const hitRadiusX = width / 4\n const hitRadiusY = height / 4\n\n for (let i = 0; i < directionData.length; i++) {\n const unit = directionData[i]\n // 百分比坐标转像素\n const px = unit.x * width\n const py = unit.y * height\n\n const dx = boxPoint.x - px\n const dy = boxPoint.y - py\n\n if (Math.abs(dx) <= hitRadiusX && Math.abs(dy) <= hitRadiusY) {\n if (eight) {\n if (directionNames[i] !== 'center') return directionNames[i]\n } else return directionNames[i]\n }\n }\n\n return undefined\n}\n\n\nfunction getDirection(boxPoint: IPointData, bounds: IBoundsData, four?: boolean): IDirection4 | 'center' {\n const { width, height } = bounds\n const center = BoundsHelper.getPoint(bounds, 'center', true)\n // 将元素沿着对角线切成4块,匹配对应上下左右四个方向\n // 转为以中心为原点的坐标\n const dx = boxPoint.x - center.x\n const dy = boxPoint.y - center.y\n\n if (!four) {\n // 中心点\n if (Math.abs(dx) < width / 4 && Math.abs(dy) < height / 4) return 'center'\n }\n\n // ----------------------------------------\n // 将矩形按比例缩放到正方形空间\n //\n // 等价于比较:\n // |dx| / width 和 |dy| / height\n //\n // 但为了避免除法,改为:\n // |dx| * height 和 |dy| * width\n //\n // 这样可以严格按矩形的两条对角线划分区域\n // ----------------------------------------\n\n const ax = Math.abs(dx) * height\n const ay = Math.abs(dy) * width\n\n // 左右区域\n if (ax > ay) {\n return dx > 0 ? 'right' : 'left'\n }\n\n // 上下区域\n return dy > 0 ? 'bottom' : 'top'\n}","import { IValue } from '@leafer-ui/interface'\nimport { decorateLeafAttr, attr, doBoundsType, doStrokeType } from '@leafer-ui/draw'\n\n\nexport function linkerPointType(defaultValue?: IValue) {\n return decorateLeafAttr(defaultValue, (key: string) => attr({\n set(value: IValue) {\n if (this.__setAttr(key, value)) {\n const layout = this.__layout\n if (!layout.linkerChanged) {\n doBoundsType(this)\n doStrokeType(this)\n layout.linkerChanged = true\n }\n }\n }\n }))\n}","import { IDirection, IPointData, IBoundsData } from '@leafer-ui/interface'\nimport { AroundHelper, PathCommandDataHelper } from '@leafer-ui/draw'\n\nconst { directionData } = AroundHelper\nconst { moveTo, lineTo } = PathCommandDataHelper\n\nconst POLYLINE_X = 0, POLYLINE_Y = 1\nconst POLYLINE_EPSILON = 0.001\nconst POLYLINE_MIN_SEGMENT = 4\nconst POLYLINE_TURN_WEIGHT = 1.5\n\nfunction getPolylineDirectionIndex(direction: IDirection): number {\n switch (direction) {\n case 'top-left': return 0\n case 'top': return 1\n case 'top-right': return 2\n case 'right': return 3\n case 'bottom-right': return 4\n case 'bottom': return 5\n case 'bottom-left': return 6\n case 'left': return 7\n default: return 8\n }\n}\n\nfunction getPolylinePorts(direction: IDirection, point: IPointData, target: IPointData, bounds: IBoundsData | undefined, targetBounds: IBoundsData | undefined, ports: number[]): number {\n const data = directionData[getPolylineDirectionIndex(direction)]\n const dx = Math.sign(data.x - 0.5), dy = Math.sign(data.y - 0.5)\n const cx = bounds ? bounds.x + bounds.width / 2 : point.x\n const cy = bounds ? bounds.y + bounds.height / 2 : point.y\n const tx = targetBounds ? targetBounds.x + targetBounds.width / 2 : target.x\n const ty = targetBounds ? targetBounds.y + targetBounds.height / 2 : target.y\n const deltaX = tx - cx, deltaY = ty - cy\n const xSign = dx || (deltaX >= 0 ? 1 : -1)\n const ySign = dy || (deltaY >= 0 ? 1 : -1)\n const xPort = POLYLINE_X * 2 + (xSign > 0 ? 1 : 0)\n const yPort = POLYLINE_Y * 2 + (ySign > 0 ? 1 : 0)\n\n if (dx && !dy) {\n ports[0] = xPort\n return 1\n }\n\n if (dy && !dx) {\n ports[0] = yPort\n return 1\n }\n\n if (Math.abs(deltaX) >= Math.abs(deltaY)) {\n ports[0] = xPort\n ports[1] = yPort\n } else {\n ports[0] = yPort\n ports[1] = xPort\n }\n\n return 2\n}\n\nfunction getPolylineExit(point: IPointData, bounds: IBoundsData | undefined, port: number, clearance: number, result: number[]): void {\n const axis = port >> 1, sign = port & 1 ? 1 : -1\n\n if (axis === POLYLINE_X) {\n const boundary = bounds ? sign > 0 ? bounds.x + bounds.width : bounds.x : point.x\n result[0] = boundary + sign * clearance\n result[1] = point.y\n } else {\n const boundary = bounds ? sign > 0 ? bounds.y + bounds.height : bounds.y : point.y\n result[0] = point.x\n result[1] = boundary + sign * clearance\n }\n}\n\nfunction isPolylinePointBlocked(x: number, y: number, bounds: IBoundsData | undefined, clearance: number): boolean {\n if (!bounds) return false\n const left = bounds.x - clearance, right = bounds.x + bounds.width + clearance\n const top = bounds.y - clearance, bottom = bounds.y + bounds.height + clearance\n return x > left + POLYLINE_EPSILON && x < right - POLYLINE_EPSILON && y > top + POLYLINE_EPSILON && y < bottom - POLYLINE_EPSILON\n}\n\nfunction isPolylineSegmentBlocked(x1: number, y1: number, x2: number, y2: number, bounds: IBoundsData | undefined, clearance: number): boolean {\n if (!bounds) return false\n const left = bounds.x - clearance, right = bounds.x + bounds.width + clearance\n const top = bounds.y - clearance, bottom = bounds.y + bounds.height + clearance\n\n if (Math.abs(y1 - y2) <= POLYLINE_EPSILON) {\n return y1 > top + POLYLINE_EPSILON && y1 < bottom - POLYLINE_EPSILON &&\n Math.max(Math.min(x1, x2), left + POLYLINE_EPSILON) < Math.min(Math.max(x1, x2), right - POLYLINE_EPSILON)\n }\n\n if (Math.abs(x1 - x2) <= POLYLINE_EPSILON) {\n return x1 > left + POLYLINE_EPSILON && x1 < right - POLYLINE_EPSILON &&\n Math.max(Math.min(y1, y2), top + POLYLINE_EPSILON) < Math.min(Math.max(y1, y2), bottom - POLYLINE_EPSILON)\n }\n\n return true\n}\n\nfunction addPolylineBoundsCoordinates(xs: number[], ys: number[], bounds: IBoundsData | undefined, clearance: number, margin: number): void {\n if (!bounds) return\n const left = bounds.x - clearance, right = bounds.x + bounds.width + clearance\n const top = bounds.y - clearance, bottom = bounds.y + bounds.height + clearance\n xs.push(left, right, left - margin, right + margin)\n ys.push(top, bottom, top - margin, bottom + margin)\n}\n\nfunction sortPolylineCoordinates(values: number[]): void {\n values.sort((a, b) => a - b)\n let write = 0\n\n for (let i = 0; i < values.length; i++) {\n if (!write || Math.abs(values[i] - values[write - 1]) > POLYLINE_EPSILON) values[write++] = values[i]\n }\n\n values.length = write\n}\n\nfunction getPolylineCoordinateIndex(values: number[], value: number): number {\n for (let i = 0; i < values.length; i++) {\n if (Math.abs(values[i] - value) <= POLYLINE_EPSILON) return i\n }\n return -1\n}\n\n// 根据两端连接方向确定中点转折轴\nfunction getPolylineMidpointAxis(startPort: number, endPort: number, sx: number, sy: number, ex: number, ey: number): number {\n const startAxis = startPort >> 1, endAxis = endPort >> 1\n const startSign = startPort & 1 ? 1 : -1, endSign = endPort & 1 ? 1 : -1\n\n if (startAxis === endAxis && startSign === -endSign) return startAxis\n return Math.abs(ex - sx) >= Math.abs(ey - sy) ? POLYLINE_X : POLYLINE_Y\n}\n\n// 检查中点优先路径\nfunction getPolylineMidpointRoute(result: number[], startPoint: IPointData, endPoint: IPointData, sx: number, sy: number, ex: number, ey: number, midpointAxis: number, startBounds: IBoundsData | undefined, endBounds: IBoundsData | undefined, clearance: number): number {\n const midpointX = (sx + ex) / 2, midpointY = (sy + ey) / 2\n result.length = 0\n result.push(startPoint.x, startPoint.y, sx, sy)\n\n if (midpointAxis === POLYLINE_X) {\n result.push(midpointX, sy, midpointX, ey)\n } else {\n result.push(sx, midpointY, ex, midpointY)\n }\n\n result.push(ex, ey, endPoint.x, endPoint.y)\n\n // 只检查两端出口之间的路径,起终点连接段允许进入自身元素\n for (let i = 4; i < result.length - 2; i += 2) {\n const x1 = result[i - 2], y1 = result[i - 1]\n const x2 = result[i], y2 = result[i + 1]\n\n if (isPolylineSegmentBlocked(x1, y1, x2, y2, startBounds, clearance) ||\n isPolylineSegmentBlocked(x1, y1, x2, y2, endBounds, clearance)) return Infinity\n }\n\n return getPolylineScore(result, clearance)\n}\n\nfunction getPolylineRoute(result: number[], startPoint: IPointData, endPoint: IPointData, startPort: number, endPort: number, startBounds: IBoundsData | undefined, endBounds: IBoundsData | undefined, clearance: number): number {\n const startExit: number[] = [], endExit: number[] = []\n getPolylineExit(startPoint, startBounds, startPort, clearance, startExit)\n getPolylineExit(endPoint, endBounds, endPort, clearance, endExit)\n\n const sx = startExit[0], sy = startExit[1], ex = endExit[0], ey = endExit[1]\n const startAxis = startPort >> 1, endAxis = endPort >> 1\n const startSign = startPort & 1 ? 1 : -1, endSign = endPort & 1 ? 1 : -1\n const startStub = Math.abs(sx - startPoint.x) + Math.abs(sy - startPoint.y)\n const endStub = Math.abs(ex - endPoint.x) + Math.abs(ey - endPoint.y)\n\n if (isPolylineSegmentBlocked(startPoint.x, startPoint.y, sx, sy, endBounds, clearance) ||\n isPolylineSegmentBlocked(endPoint.x, endPoint.y, ex, ey, startBounds, clearance)) return Infinity\n\n const midpointAxis = getPolylineMidpointAxis(startPort, endPort, sx, sy, ex, ey)\n\n // 第一优先级:只要中点路径不受阻,就直接采用\n const midpointScore = getPolylineMidpointRoute(result, startPoint, endPoint, sx, sy, ex, ey, midpointAxis, startBounds, endBounds, clearance)\n if (midpointScore < Infinity) return midpointScore\n\n // 第二优先级:中点路径受阻,使用网格寻路绕行\n const margin = Math.max(clearance, POLYLINE_MIN_SEGMENT) * 2\n const xs: number[] = [sx, ex, (sx + ex) / 2], ys: number[] = [sy, ey, (sy + ey) / 2]\n\n addPolylineBoundsCoordinates(xs, ys, startBounds, clearance, margin)\n addPolylineBoundsCoordinates(xs, ys, endBounds, clearance, margin)\n\n let minX = Math.min(...xs), maxX = Math.max(...xs)\n let minY = Math.min(...ys), maxY = Math.max(...ys)\n xs.push(minX - margin * 2, maxX + margin * 2)\n ys.push(minY - margin * 2, maxY + margin * 2)\n\n sortPolylineCoordinates(xs)\n sortPolylineCoordinates(ys)\n\n const nx = xs.length, ny = ys.length\n const startXIndex = getPolylineCoordinateIndex(xs, sx), startYIndex = getPolylineCoordinateIndex(ys, sy)\n const endXIndex = getPolylineCoordinateIndex(xs, ex), endYIndex = getPolylineCoordinateIndex(ys, ey)\n\n if (startXIndex < 0 || startYIndex < 0 || endXIndex < 0 || endYIndex < 0) return Infinity\n\n const startNode = startYIndex * nx + startXIndex, endNode = endYIndex * nx + endXIndex\n const total = nx * ny * 3\n const distance = new Float64Array(total), previous = new Int32Array(total), visited = new Uint8Array(total)\n\n distance.fill(Infinity)\n previous.fill(-1)\n\n const startState = startNode * 3\n distance[startState] = 0\n\n const turnCost = Math.max(POLYLINE_MIN_SEGMENT, clearance * POLYLINE_TURN_WEIGHT)\n let currentState = -1, currentNode = -1, currentAxis = 0\n let currentX = 0, currentY = 0, currentDistance = 0\n\n const relax = (nextXIndex: number, nextYIndex: number, axis: number, sign: number): void => {\n const nextX = xs[nextXIndex], nextY = ys[nextYIndex]\n const nextNode = nextYIndex * nx + nextXIndex\n\n if (isPolylinePointBlocked(nextX, nextY, startBounds, clearance) ||\n isPolylinePointBlocked(nextX, nextY, endBounds, clearance)) return\n\n if (isPolylineSegmentBlocked(currentX, currentY, nextX, nextY, startBounds, clearance) ||\n isPolylineSegmentBlocked(currentX, currentY, nextX, nextY, endBounds, clearance)) return\n\n if (currentState === startState) {\n if (axis === startAxis + 1) {\n if (sign !== startSign) return\n } else if (startStub <= POLYLINE_EPSILON) return\n }\n\n if (nextNode === endNode) {\n if (axis === endAxis + 1) {\n if (sign !== -endSign) return\n } else if (endStub <= POLYLINE_EPSILON) return\n }\n\n const nextState = nextNode * 3 + axis\n if (visited[nextState]) return\n\n const segmentLength = Math.abs(nextX - currentX) + Math.abs(nextY - currentY)\n let cost = currentDistance + segmentLength\n\n if (currentAxis && currentAxis !== axis) {\n cost += turnCost\n const turnCoordinate = currentAxis === POLYLINE_X + 1 ? currentX : currentY\n const preferredCoordinate = midpointAxis === POLYLINE_X ? (sx + ex) / 2 : (sy + ey) / 2\n if (Math.abs(turnCoordinate - preferredCoordinate) > POLYLINE_EPSILON) cost += turnCost * 2\n }\n\n if (cost < distance[nextState]) {\n distance[nextState] = cost\n previous[nextState] = currentState\n }\n }\n\n let bestState = -1\n\n for (let iteration = 0; iteration < total; iteration++) {\n let minDistance = Infinity, state = -1\n\n for (let i = 0; i < total; i++) {\n if (!visited[i] && distance[i] < minDistance) {\n minDistance = distance[i]\n state = i\n }\n }\n\n if (state < 0) break\n\n currentState = state\n currentNode = Math.floor(state / 3)\n currentAxis = state % 3\n currentDistance = minDistance\n visited[state] = 1\n\n if (currentNode === endNode) {\n bestState = state\n break\n }\n\n const xIndex = currentNode % nx, yIndex = Math.floor(currentNode / nx)\n currentX = xs[xIndex]\n currentY = ys[yIndex]\n\n if (xIndex > 0) relax(xIndex - 1, yIndex, POLYLINE_X + 1, -1)\n if (xIndex < nx - 1) relax(xIndex + 1, yIndex, POLYLINE_X + 1, 1)\n if (yIndex > 0) relax(xIndex, yIndex - 1, POLYLINE_Y + 1, -1)\n if (yIndex < ny - 1) relax(xIndex, yIndex + 1, POLYLINE_Y + 1, 1)\n }\n\n if (bestState < 0) return Infinity\n\n const reverse: number[] = []\n let state = bestState\n\n while (state >= 0) {\n const node = Math.floor(state / 3)\n reverse.push(xs[node % nx], ys[Math.floor(node / nx)])\n if (state === startState) break\n state = previous[state]\n }\n\n if (state !== startState) return Infinity\n\n result.length = 0\n result.push(startPoint.x, startPoint.y, sx, sy)\n\n for (let i = reverse.length - 4; i >= 0; i -= 2) result.push(reverse[i], reverse[i + 1])\n\n result.push(endPoint.x, endPoint.y)\n return distance[bestState] + startStub + endStub\n}\n\nfunction appendPolylinePoint(points: number[], x: number, y: number): void {\n const length = points.length\n if (length >= 2 && Math.abs(points[length - 2] - x) <= POLYLINE_EPSILON && Math.abs(points[length - 1] - y) <= POLYLINE_EPSILON) return\n points.push(x, y)\n}\n\nfunction appendPolylineOrthogonal(points: number[], x1: number, y1: number, x2: number, y2: number, firstAxis = POLYLINE_X): void {\n if (Math.abs(x1 - x2) > POLYLINE_EPSILON && Math.abs(y1 - y2) > POLYLINE_EPSILON) {\n if (firstAxis === POLYLINE_X) {\n const midX = (x1 + x2) / 2\n appendPolylinePoint(points, midX, y1)\n appendPolylinePoint(points, midX, y2)\n } else {\n const midY = (y1 + y2) / 2\n appendPolylinePoint(points, x1, midY)\n appendPolylinePoint(points, x2, midY)\n }\n }\n appendPolylinePoint(points, x2, y2)\n}\n\nfunction getPolylineEditPath(result: number[], startPoint: IPointData, endPoint: IPointData, startPort: number, endPort: number, startBounds: IBoundsData | undefined, endBounds: IBoundsData | undefined, points: number[], clearance: number): number {\n if (points.length % 2) return Infinity\n for (let i = 0; i < points.length; i++) if (!Number.isFinite(points[i])) return Infinity\n\n const startExit: number[] = [], endExit: number[] = []\n getPolylineExit(startPoint, startBounds, startPort, clearance, startExit)\n getPolylineExit(endPoint, endBounds, endPort, clearance, endExit)\n\n const sx = startExit[0], sy = startExit[1], ex = endExit[0], ey = endExit[1]\n\n if (isPolylineSegmentBlocked(startPoint.x, startPoint.y, sx, sy, endBounds, clearance) ||\n isPolylineSegmentBlocked(endPoint.x, endPoint.y, ex, ey, startBounds, clearance)) return Infinity\n\n result.length = 0\n appendPolylinePoint(result, startPoint.x, startPoint.y)\n appendPolylinePoint(result, sx, sy)\n\n let x = sx, y = sy\n\n for (let i = 0; i < points.length; i += 2) {\n const nx = points[i], ny = points[i + 1]\n appendPolylineOrthogonal(result, x, y, nx, ny, i === 0 && clearance === 0 ? startPort >> 1 : POLYLINE_X)\n x = nx\n y = ny\n }\n\n const endAxis = endPort >> 1\n\n if (Math.abs(x - ex) > POLYLINE_EPSILON && Math.abs(y - ey) > POLYLINE_EPSILON) {\n if (endAxis === POLYLINE_X) appendPolylinePoint(result, x, ey)\n else appendPolylinePoint(result, ex, y)\n }\n\n appendPolylinePoint(result, ex, ey)\n appendPolylinePoint(result, endPoint.x, endPoint.y)\n return getPolylineScore(result, clearance)\n}\n\nfunction getPolylineScore(points: number[], clearance: number): number {\n let length = 0, turns = 0, previousAxis = -1\n\n for (let i = 2; i < points.length; i += 2) {\n const dx = points[i] - points[i - 2], dy = points[i + 1] - points[i - 1]\n if (Math.abs(dx) <= POLYLINE_EPSILON && Math.abs(dy) <= POLYLINE_EPSILON) continue\n\n const axis = Math.abs(dx) > POLYLINE_EPSILON ? POLYLINE_X : POLYLINE_Y\n length += Math.abs(dx) + Math.abs(dy)\n if (previousAxis !== -1 && previousAxis !== axis) turns++\n previousAxis = axis\n }\n\n return length + turns * Math.max(clearance, POLYLINE_MIN_SEGMENT) * POLYLINE_TURN_WEIGHT\n}\n\nfunction simplifyPolyline(points: number[]): void {\n let write = 2\n\n for (let read = 2; read < points.length; read += 2) {\n const x = points[read], y = points[read + 1]\n const px = points[write - 2], py = points[write - 1]\n\n if (Math.abs(x - px) <= POLYLINE_EPSILON && Math.abs(y - py) <= POLYLINE_EPSILON) continue\n\n if (write >= 4) {\n const ax = points[write - 4], ay = points[write - 3]\n const horizontal = Math.abs(ay - py) <= POLYLINE_EPSILON && Math.abs(py - y) <= POLYLINE_EPSILON && (px - ax) * (x - px) >= 0\n const vertical = Math.abs(ax - px) <= POLYLINE_EPSILON && Math.abs(px - x) <= POLYLINE_EPSILON && (py - ay) * (y - py) >= 0\n\n if (horizontal || vertical) {\n points[write - 2] = x\n points[write - 1] = y\n continue\n }\n }\n\n points[write++] = x\n points[write++] = y\n }\n\n points.length = write\n}\n\nexport function drawPolyline(path: number[], startPoint: IPointData, endPoint: IPointData, startDirection: IDirection, endDirection: IDirection, startBounds?: IBoundsData, endBounds?: IBoundsData, clearance = 8, points?: number[]): boolean {\n if (!Number.isFinite(startPoint.x) || !Number.isFinite(startPoint.y) || !Number.isFinite(endPoint.x) || !Number.isFinite(endPoint.y)) return false\n\n if (startBounds && (!Number.isFinite(startBounds.x) || !Number.isFinite(startBounds.y) || !Number.isFinite(startBounds.width) || !Number.isFinite(startBounds.height) || startBounds.width < 0 || startBounds.height < 0)) return false\n if (endBounds && (!Number.isFinite(endBounds.x) || !Number.isFinite(endBounds.y) || !Number.isFinite(endBounds.width) || !Number.isFinite(endBounds.height) || endBounds.width < 0 || endBounds.height < 0)) return false\n\n clearance = Number.isFinite(clearance) ? Math.max(0, clearance) : 8\n\n const startPorts: number[] = [], endPorts: number[] = []\n const startCount = getPolylinePorts(startDirection, startPoint, endPoint, startBounds, endBounds, startPorts)\n const endCount = getPolylinePorts(endDirection, endPoint, startPoint, endBounds, startBounds, endPorts)\n const candidate: number[] = [], best: number[] = []\n\n let bestScore = Infinity\n\n for (let pass = 0; pass < 2 && bestScore === Infinity; pass++) {\n const currentClearance = pass === 0 ? clearance : 0\n\n for (let i = 0; i < startCount; i++) {\n for (let j = 0; j < endCount; j++) {\n const score = points !== undefined\n ? getPolylineEditPath(candidate, startPoint, endPoint, startPorts[i], endPorts[j], startBounds, endBounds, points, currentClearance)\n : getPolylineRoute(candidate, startPoint, endPoint, startPorts[i], endPorts[j], startBounds, endBounds, currentClearance)\n\n if (score < bestScore) {\n bestScore = score\n best.length = 0\n for (let k = 0; k < candidate.length; k++) best.push(candidate[k])\n }\n }\n }\n }\n\n if (!best.length) return false\n if (points === undefined) simplifyPolyline(best)\n\n moveTo(path, best[0], best[1])\n for (let i = 2; i < best.length; i += 2) lineTo(path, best[i], best[i + 1])\n return true\n}","import { ILinker, ILinkerInputData, ILinkerData, ILineType, ILinkerPointData, ILinkerPointOptions, ILinkerComputedPointData, ILinkerPointType, IPointData, IUI, IDirection4, ILeaf, IPointsCurve, IPointsCurveData } from '@leafer-ui/interface'\nimport { registerUI, dataProcessor, PathCommandDataHelper, pathType, isString, BoundsEvent, Line, PointHelper, BoundsHelper, LeafHelper, isObject, boundsType } from '@leafer-ui/draw'\n\nimport { LinkerData } from './data/LinkerData'\nimport { LinkerHelper } from './helper/LinkerHelper'\nimport { linkerPointType } from './decorator'\nimport { drawPolyline } from './helper/drawPolyline'\n\n\nconst { moveTo, lineTo, bezierCurveTo, drawPoints } = PathCommandDataHelper\nconst { isEmpty, getPoint } = BoundsHelper\nconst { getDistance } = PointHelper\nconst { getCtrlPoint, getDirectionForFromPoint, isOppositeDirection } = LinkerHelper\nconst { max, min, abs } = Math\n\n\n@registerUI()\nexport class Linker extends Line implements ILinker {\n\n public get __tag() { return 'Linker' }\n\n @dataProcessor(LinkerData)\n declare public __: ILinkerData\n\n @boundsType('curve')\n public lineType?: ILineType\n\n @linkerPointType()\n public startPoint?: ILinkerPointData\n\n @linkerPointType()\n public endPoint?: ILinkerPointData\n\n @pathType({ type: 'C', value: 0.5 } as IPointsCurveData)\n declare public curve?: IPointsCurve\n\n public startNode: IUI\n public endNode: IUI\n\n public startData: ILinkerComputedPointData\n public endData: ILinkerComputedPointData\n\n\n constructor(data?: ILinkerInputData) {\n super(data)\n this.onStartNodeChange = this.onStartNodeChange.bind(this)\n this.onEndNodeChange = this.onEndNodeChange.bind(this)\n }\n\n public __updatePath(): void {\n\n const layout = this.__layout\n\n const { startNode, endNode } = this\n\n if (layout.linkerChanged) {\n this.updateLinkerNode('start')\n this.updateLinkerNode('end')\n\n this.updateLinkerPoint('start')\n this.updateLinkerPoint('end')\n\n if (startNode !== this.startNode) this.listenLinkerNode(this.startNode, startNode, 'start')\n if (endNode !== this.endNode) this.listenLinkerNode(this.endNode, endNode, 'end')\n\n layout.linkerChanged = false\n }\n\n this.updateLinkerPath()\n }\n\n public listenLinkerNode(newNode: IUI, oldNode: IUI, type: ILinkerPointType): void {\n if (oldNode) {\n oldNode.off(BoundsEvent.WORLD, type === 'end' ? this.onEndNodeChange : this.onStartNodeChange)\n const list = type === 'end' ? oldNode.endLinker : oldNode.startLinker\n if (list) {\n const index = list.indexOf(this)\n if (index > -1) list.splice(index, 1)\n }\n }\n if (newNode) {\n newNode.on(BoundsEvent.WORLD, type === 'end' ? this.onEndNodeChange : this.onStartNodeChange)\n const list = type === 'end' ? (newNode.endLinker || (newNode.endLinker = [])) : (newNode.startLinker || (newNode.startLinker = []))\n list.push(this)\n }\n }\n\n public onStartNodeChange(): void {\n this.onLinkerNodeChange('start')\n }\n\n public onEndNodeChange(): void {\n this.onLinkerNodeChange('end')\n }\n\n public onLinkerNodeChange(type: ILinkerPointType): void {\n if (this.leaferIsCreated) {\n const { layouter, zoomLayer } = this.leafer\n if (layouter.__updatedList.has(zoomLayer)) return // 节流,画布缩放平移不用更新\n layouter.addExtra(this, true)\n }\n\n const { startData, endData } = this\n if (type == 'start') {\n this.updateLinkerPoint('start')\n if (endData && endData.auto) this.updateLinkerPoint('end')\n } else {\n if (startData && startData.auto) this.updateLinkerPoint('start')\n this.updateLinkerPoint('end')\n }\n\n this.__layout.boxChange()\n LeafHelper.updateBounds(this)\n }\n\n public updateLinkerNode(type: ILinkerPointType) {\n const { startPoint, endPoint } = this\n const nowPoint = type === 'end' ? endPoint : startPoint\n if (nowPoint) {\n const { id } = nowPoint\n const ui = id && (isString(id) ? this.app.findId(id) : id)\n type === 'end' ? this.endNode = ui : this.startNode = ui\n }\n }\n\n public getLinkerNodeCenter(type: ILinkerPointType): IPointData {\n const { startPoint, endPoint, startNode, endNode, startData, endData } = this\n const node = type === 'end' ? endNode : startNode\n const data = type === 'end' ? (endData || endPoint) : (startData || startPoint)\n if (node) {\n const { worldRenderBounds } = node\n if (isEmpty(worldRenderBounds)) LeafHelper.updateBounds(node) // 防止线条位于元素底部,先于元素布局\n return getPoint(node.worldRenderBounds, 'center')\n } else {\n return data && isObject(data.point) && this.getWorldPointByLocal(data.point)\n }\n }\n\n public updateLinkerPoint(type: ILinkerPointType) {\n const { startPoint, endPoint, lineType } = this\n const nowPoint = type === 'end' ? endPoint : startPoint\n if (nowPoint) {\n const data = {} as ILinkerComputedPointData\n const { id, offset } = nowPoint\n let { direction, point } = nowPoint\n\n if (direction === 'center' || (!direction && id && !point)) {\n const start = this.getLinkerNodeCenter('start')\n const end = this.getLinkerNodeCenter('end')\n const from = type === 'end' ? end : start\n const to = type === 'end' ? start : end\n if (from && to) direction = getDirectionForFromPoint(from, to)\n data.auto = true\n }\n\n\n if (!direction && isString(point)) direction = point as any as IDirection4\n\n\n data.direction = direction\n\n const ui = type === 'end' ? this.endNode : this.startNode\n\n let p: IPointData\n\n if (ui) {\n if (!point) point = direction\n if (point) {\n const { boxBounds } = ui\n\n if (isEmpty(boxBounds)) LeafHelper.updateBounds(ui) // 防止线条位于元素底部,先于元素布局\n p = getPoint(boxBounds, point, true)\n ui.getWorldPointByBox(p, this, false, true)\n if (lineType === 'polyline') data.bounds = ui.getBounds('box', this.parent)\n }\n } else {\n if (isObject(point)) p = point\n }\n\n if (p && offset) {\n const o = { ...offset } as IPointData\n if (!offset.x) o.x = 0\n if (!offset.y) o.y = 0\n\n if (ui) ui.getWorldPoint(o, this, true, true)\n PointHelper.move(p, o)\n }\n\n data.point = p\n\n type === 'end' ? this.endData = p && data : this.startData = p && data\n\n }\n }\n\n\n public updateLinkerPath() {\n const data = this.__\n const path: number[] = data.path = []\n\n const hasPoints = data.points && data.points.length\n\n const { startData, endData, startNode, endNode } = this\n if (!startData || !endData) {\n return\n }\n\n const startPoint = startData.point, endPoint = endData.point\n const startDirection = startData.direction, endDirection = endData.direction\n\n const arrowWidth = this.__.strokeWidth * 8\n\n switch (data.lineType) {\n case 'straight':\n moveTo(path, startPoint.x, startPoint.y)\n lineTo(path, endPoint.x, endPoint.y)\n break\n case 'polyline':\n drawPolyline(path, startPoint, endPoint, startDirection, endDirection, startData.bounds, endData.bounds, arrowWidth, hasPoints && PointHelper.toNumberPoints(data.points))\n break\n case 'curve':\n default:\n const half: IPointData = {\n x: abs((startPoint.x - endPoint.x) / 2),\n y: abs((startPoint.y - endPoint.y) / 2)\n }\n\n let minCtrl: number\n\n if (this.__.__useArrow) {\n const ratio = min(getDistance(startPoint, endPoint) / (arrowWidth * 25), 1) // 控制add 手柄的长度与两点间的距离有关\n minCtrl = max(arrowWidth * ratio * 12, arrowWidth * 3,) // 控制手柄最少不能低于3个箭头的宽度\n } else {\n minCtrl = arrowWidth * 2\n }\n\n if (endDirection) {\n\n if (isOppositeDirection(startDirection, endDirection) && startDirection === getDirectionForFromPoint(startPoint, endPoint)) // 正好处于相反的位置, 不需要太长的控制手柄\n {\n minCtrl = arrowWidth * 2\n }\n\n }\n\n half.x = max(minCtrl, half.x)\n half.y = max(minCtrl, half.y)\n\n if (hasPoints) {\n minCtrl *= 0.6\n const points = PointHelper.toNumberPoints(data.points)\n drawPoints(path, [startPoint.x, startPoint.y, ...points, endPoint.x, endPoint.y], data.curve, false, data)\n\n if (startDirection) {\n const handleX = path[4]\n const handleY = path[5]\n\n half.x = max(minCtrl, abs(handleX - startPoint.x))\n half.y = max(minCtrl, abs(handleY - startPoint.y))\n const startCtrlPoint: IPointData = getCtrlPoint(this, startNode, startPoint, startDirection, half)\n path[4] = startCtrlPoint.x\n path[5] = startCtrlPoint.y\n }\n\n const len = path.length\n if (endDirection) {\n\n const handleX = path[len - 4]\n const handleY = path[len - 3]\n\n half.x = max(minCtrl, abs(handleX - endPoint.x))\n half.y = max(minCtrl, abs(handleY - endPoint.y))\n const endCtrlPoint: IPointData = getCtrlPoint(this, endNode, endPoint, endDirection, half)\n path[len - 4] = endCtrlPoint.x\n path[len - 3] = endCtrlPoint.y\n } else {\n path[len - 4] = endPoint.x\n path[len - 3] = endPoint.y\n }\n\n } else {\n\n const startCtrlPoint: IPointData = startDirection ? getCtrlPoint(this, startNode, startPoint, startDirection, half) : startPoint\n const endCtrlPoint: IPointData = endDirection ? getCtrlPoint(this, endNode, endPoint, endDirection, half) : endPoint\n\n moveTo(path, startPoint.x, startPoint.y)\n bezierCurveTo(path, startCtrlPoint.x, startCtrlPoint.y, endCtrlPoint.x, endCtrlPoint.y, endPoint.x, endPoint.y)\n }\n\n\n }\n }\n\n public createStartPoint(worldPoint: IPointData, node?: ILeaf, options?: ILinkerPointOptions): ILinkerPointData {\n const data = this.createLinkerPoint(worldPoint, node, options)\n this.startPoint = data\n return data\n }\n\n public createEndPoint(worldPoint: IPointData, node?: ILeaf, options?: ILinkerPointOptions): ILinkerPointData {\n const data = this.createLinkerPoint(worldPoint, node, options)\n this.endPoint = data\n return data\n }\n\n public createLinkerPoint(worldPoint: IPointData, node?: ILeaf, options?: ILinkerPointOptions): ILinkerPointData {\n const data: ILinkerPointData = {}\n if (node && node.id) {\n const point = node.getBoxPoint(worldPoint)\n const { boxBounds } = node\n\n const mode = options && options.mode\n\n const edge = mode === 'edge' || !mode\n const four = mode === 'four'\n const auto = mode === 'auto'\n const free = mode === 'free'\n\n if (!auto) {\n\n if (four) {\n data.point = LinkerHelper.getDirection(point, boxBounds, four)\n } else {\n data.direction = LinkerHelper.getDirection(point, boxBounds, edge)\n data.point = LinkerHelper.getPointDirection(point, boxBounds, edge) || data.direction\n if (data.point === data.direction) delete data.direction\n\n if (free || edge) {\n const snapPoint = BoundsHelper.getPoint(boxBounds, data.point)\n\n const offsetX = point.x - snapPoint.x\n const offsetY = point.y - snapPoint.y\n\n const snapRadius = (options && options.snapRadius) || 10\n\n if (Math.abs(offsetX) > snapRadius || Math.abs(offsetY) > snapRadius) {\n const offset = data.offset = {\n x: Math.abs(offsetX) > snapRadius ? offsetX : 0,\n y: Math.abs(offsetY) > snapRadius ? offsetY : 0\n }\n\n if (edge && (offset.x || offset.y)) {\n switch (data.direction || data.point) {\n case 'top':\n case 'bottom':\n offset.y = 0; break\n case 'right':\n case 'left':\n offset.x = 0; break\n default:\n if (offset.x > offset.y) offset.y = 0\n else offset.x = 0\n }\n\n }\n }\n }\n }\n\n }\n\n data.id = node.id\n } else {\n data.point = this.getLocalPoint(worldPoint)\n }\n\n return data\n }\n\n}","import { IPointData, IPathCommandData } from '@leafer-ui/interface'\n\nimport { PathCommandMap, PointHelper } from '@leafer-ui/core'\n\nconst { toNumberPoints } = PointHelper\nconst { M, L, C, Z } = PathCommandMap\n\n\n/**\n * 使用角平分线自动生成平滑 Bezier 曲线\n *\n * 算法特点:\n *\n * 1. Handle 方向:\n * 使用前后方向的角平分线\n *\n * 2. Handle 长度:\n * 左右分别根据相邻边长度计算\n *\n * in = AB * curve\n * out = BC * curve\n *\n * 3. 自动曲率控制:\n *\n * - 接近平角:\n * 降低 handle,避免直线中间产生鼓包\n *\n * - 接近尖角:\n * 降低 handle,避免曲线过冲\n *\n * 4. 性能:\n *\n * - O(n)\n * - 无对象创建\n * - 无临时数组\n * - 适合大规模路径\n *\n *\n * curve:\n *\n * 0 直线\n * 0.5 推荐\n * 1 最大平滑\n */\n\n/**\n * 使用角平分线法线生成自动 Bezier 曲线\n *\n * 算法:\n *\n * 1. 通过 BA / BC 求角平分方向\n * 2. 旋转 90° 得到曲线切线方向\n * 3. 左右 handle 长度分别根据两侧距离计算\n *\n * handle:\n *\n * C2\n * |\n * |\n * A ---- B ---- C\n * |\n * |\n * C1\n *\n *\n * curve:\n *\n * 0 直线\n * 0.5 推荐\n * 1 最大曲率\n */\nexport function drawPoints(data: IPathCommandData, originPoints: number[] | IPointData[], curve?: boolean | number, close?: boolean): void {\n const points = toNumberPoints(originPoints)\n const count = points.length >> 1\n\n if (count < 2) return\n\n data.push(M, points[0], points[1])\n\n if (!curve || count < 3) {\n\n for (let i = 1; i < count; i++) {\n\n data.push(L, points[i * 2], points[i * 2 + 1])\n }\n\n if (close) data.push(Z)\n return\n }\n\n let tension = curve === true ? 0.5 : curve as number\n\n if (tension < 0) tension = 0\n else if (tension > 1) tension = 1\n\n const end = close ? count : count - 1\n\n let lastOutX = points[0]\n let lastOutY = points[1]\n\n /**\n * 非闭合路径第一个点:\n * 使用第一条边方向作为初始切线\n */\n {\n\n const dx = points[2] - points[0]\n const dy = points[3] - points[1]\n\n const len = Math.sqrt(dx * dx + dy * dy)\n\n if (len) {\n lastOutX = points[0] + dx / len * len * tension\n lastOutY = points[1] + dy / len * len * tension\n }\n }\n\n\n for (let i = 0; i < end; i++) {\n const index = i + 1 === count ? 0 : i + 1\n\n const bx = points[index * 2]\n const by = points[index * 2 + 1]\n\n const prev = index === 0 ? count - 1 : index - 1\n const next = index + 1 === count ? 0 : index + 1\n\n const ax = points[prev * 2]\n const ay = points[prev * 2 + 1]\n\n const cx = points[next * 2]\n const cy = points[next * 2 + 1]\n\n /**\n * BA\n */\n let bax = ax - bx\n let bay = ay - by\n\n /**\n * BC\n */\n let bcx = cx - bx\n let bcy = cy - by\n\n const ab = Math.sqrt(bax * bax + bay * bay)\n const bc = Math.sqrt(bcx * bcx + bcy * bcy)\n\n let inX = bx\n let inY = by\n\n let outX = bx\n let outY = by\n\n if (ab || bc) {\n\n /**\n * 计算角平分方向\n */\n let ux = 0\n let uy = 0\n\n if (ab) {\n ux += bax / ab\n uy += bay / ab\n }\n\n if (bc) {\n ux += bcx / bc\n uy += bcy / bc\n }\n\n /**\n * 角平分线长度\n */\n let uLen = Math.sqrt(ux * ux + uy * uy)\n\n /**\n * 180度:\n * 两个方向抵消\n *\n * 使用 BC 方向\n */\n if (!uLen) {\n\n if (bc) {\n ux = bcx / bc\n uy = bcy / bc\n\n } else {\n ux = bax / ab\n uy = bay / ab\n }\n\n\n uLen = 1\n }\n\n ux /= uLen\n uy /= uLen\n\n /**\n * 角平分线旋转90度\n *\n * 得到曲线切线方向\n */\n let tx = -uy\n let ty = ux\n\n /**\n * 保证方向朝向下一点\n */\n if (bc) {\n if (tx * bcx + ty * bcy < 0) {\n tx = -tx\n ty = -ty\n }\n }\n\n /**\n * 计算夹角\n */\n let cos = 0\n\n if (ab && bc) {\n cos = (bax * bcx + bay * bcy) / (ab * bc)\n if (cos > 1) cos = 1\n else if (cos < -1) cos = -1\n }\n\n /**\n * 曲率限制:\n *\n * 平角降低\n * 尖角降低\n */\n let angleFactor = Math.sqrt(Math.sqrt(Math.max(0, 1 - cos * cos)))\n\n /**\n * 保留少量曲率,\n * 避免完全退化\n */\n if (angleFactor < 0.15) angleFactor = 0.15\n\n let inLength = ab * tension * angleFactor\n let outLength = bc * tension * angleFactor\n\n /**\n * 防止 handle 过长\n */\n const maxLength = Math.min(ab || bc, bc || ab) * 0.5\n\n if (inLength > maxLength) inLength = maxLength\n if (outLength > maxLength) outLength = maxLength\n\n inX = bx - tx * inLength\n inY = by - ty * inLength\n\n outX = bx + tx * outLength\n outY = by + ty * outLength\n }\n\n data.push(C,\n\n // 上一个节点 handle out\n lastOutX,\n lastOutY,\n\n // 当前节点 handle in\n inX,\n inY,\n\n // 当前节点\n bx,\n by\n )\n\n lastOutX = outX\n lastOutY = outY\n }\n\n if (close) data.push(Z)\n}","export { Linker } from './Linker'\nexport { LinkerData } from './data/LinkerData'\n\nimport { Plugin, registerPointsCurve } from '@leafer-ui/draw'\nimport { drawPoints } from './helper/drawPoints'\n\n\nPlugin.add('linker')\n\nregisterPointsCurve('C', drawPoints)"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","SuppressedError","LinkerData","LineData","__usePathBox","this","path","__pathInputed","directionData","AroundHelper","directionNames","LinkerHelper","getCtrlPoint","linker","node","point","direction","ctrl","offsetAngle","ctrlPoint","getBoxPoint","x","y","Math","PI","cos","sin","getWorldPointByBox","undefined","isOppositeDirection","from","to","getDirectionForFromPoint","a","b","angle","atan2","getRotateDirection","rotation","totalDirection","directionIndex","Direction9","round","getDirection","boxPoint","bounds","four","width","height","center","BoundsHelper","getPoint","dx","dy","abs","ax","ay","getPointDirection","eight","hitRadiusX","hitRadiusY","unit","px","py","autoRotatePoint","origin","ui","scaleX","scaleY","oneFlip","PointHelper","rotate","linkerPointType","defaultValue","decorateLeafAttr","attr","set","value","__setAttr","layout","__layout","linkerChanged","doBoundsType","doStrokeType","moveTo","lineTo","PathCommandDataHelper","POLYLINE_EPSILON","getPolylinePorts","targetBounds","ports","data","getPolylineDirectionIndex","sign","cx","cy","deltaX","deltaY","xPort","POLYLINE_X","yPort","POLYLINE_Y","getPolylineExit","port","clearance","result","boundary","isPolylinePointBlocked","left","right","top","bottom","isPolylineSegmentBlocked","x1","y1","x2","y2","max","min","addPolylineBoundsCoordinates","xs","ys","margin","push","sortPolylineCoordinates","values","sort","write","getPolylineCoordinateIndex","getPolylineRoute","startPoint","endPoint","startPort","endPort","startBounds","endBounds","startExit","endExit","sx","sy","ex","ey","startAxis","endAxis","startSign","endSign","startStub","endStub","Infinity","midpointAxis","getPolylineMidpointAxis","midpointScore","midpointX","midpointY","getPolylineScore","getPolylineMidpointRoute","minX","maxX","minY","maxY","nx","ny","startXIndex","startYIndex","endXIndex","endYIndex","startNode","endNode","total","distance","Float64Array","previous","Int32Array","visited","Uint8Array","fill","startState","turnCost","currentState","currentNode","currentAxis","currentX","currentY","currentDistance","relax","nextXIndex","nextYIndex","axis","nextX","nextY","nextNode","nextState","segmentLength","cost","turnCoordinate","preferredCoordinate","bestState","iteration","minDistance","state","floor","xIndex","yIndex","reverse","appendPolylinePoint","points","appendPolylineOrthogonal","firstAxis","midX","midY","getPolylineEditPath","Number","isFinite","turns","previousAxis","drawPolyline","startDirection","endDirection","startPorts","endPorts","startCount","endCount","candidate","best","bestScore","pass","currentClearance","j","score","k","read","horizontal","vertical","simplifyPolyline","bezierCurveTo","drawPoints","isEmpty","getDistance","Linker","Line","__tag","constructor","super","onStartNodeChange","bind","onEndNodeChange","__updatePath","updateLinkerNode","updateLinkerPoint","listenLinkerNode","updateLinkerPath","newNode","oldNode","type","off","BoundsEvent","WORLD","list","endLinker","startLinker","index","indexOf","splice","on","onLinkerNodeChange","leaferIsCreated","layouter","zoomLayer","leafer","__updatedList","has","addExtra","startData","endData","auto","boxChange","LeafHelper","updateBounds","nowPoint","id","isString","app","findId","getLinkerNodeCenter","worldRenderBounds","isObject","getWorldPointByLocal","lineType","offset","start","end","p","boxBounds","getBounds","parent","o","assign","getWorldPoint","move","__","hasPoints","arrowWidth","strokeWidth","toNumberPoints","half","minCtrl","__useArrow","ratio","curve","handleX","handleY","startCtrlPoint","len","endCtrlPoint","createStartPoint","worldPoint","options","createLinkerPoint","createEndPoint","mode","edge","free","snapPoint","offsetX","offsetY","snapRadius","getLocalPoint","dataProcessor","prototype","boundsType","pathType","registerUI","M","L","C","Z","PathCommandMap","Plugin","add","registerPointsCurve","originPoints","close","count","tension","lastOutX","lastOutY","sqrt","bx","by","prev","next","bax","bay","bcx","bcy","ab","bc","inX","inY","outX","outY","ux","uy","uLen","tx","ty","angleFactor","inLength","outLength","maxLength"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,2 +1,2 @@
1
- this.LeaferIN=this.LeaferIN||{},this.LeaferIN.linker=function(t,e,n){"use strict";function i(t,e,n,i){var o,r=arguments.length,s=r<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,i);else for(var a=t.length-1;a>=0;a--)(o=t[a])&&(s=(r<3?o(s):r>3?o(e,n,s):o(e,n))||s);return r>3&&s&&Object.defineProperty(e,n,s),s}"function"==typeof SuppressedError&&SuppressedError;class o extends e.LineData{get __usePathBox(){return this.path||this.__pathInputed}}const{directionData:r}=e.AroundHelper,s=["top-left","top","top-right","right","bottom-right","bottom","bottom-left","left","center"],a={getCtrlPoint(t,e,n,i,o,r){let s;switch(e&&(n=e.getBoxPoint(n,t)),i){case"left":case"top-left":case"bottom-left":s={x:n.x-o.x,y:n.y};break;case"top":s={x:n.x,y:n.y-o.y};break;case"right":case"top-right":case"bottom-right":s={x:n.x+o.x,y:n.y};break;case"bottom":s={x:n.x,y:n.y+o.y};break;default:s={x:n.x,y:n.y}}return r&&(r=r/180*Math.PI,s={x:(s.x-n.x)*Math.cos(r)-(s.y-n.y)*Math.sin(r)+n.x,y:(s.x-n.x)*Math.sin(r)+(s.y-n.y)*Math.cos(r)+n.y}),e&&e.getWorldPointByBox(s,t,void 0,!0),s},isOppositeDirection(t,e){switch(t){case"left":return"right"==e;case"top":return"bottom"==e;case"right":return"left"==e;case"bottom":return"top"==e;case"center":return"center"==e;default:return!1}},getDirectionForFromPoint(t,e){const n=t.x-e.x,i=t.y-e.y;let o,r=180*Math.atan2(i,n)/Math.PI;return r<0&&(r=360+r),o=r>315||r<45?"left":r>45&&r<135?"top":r>135&&r<225?"right":"bottom",o},getRotateDirection(t,n,i=8){let o=e.Direction9[t];return o=(o+Math.round(n/(360/i)))%i,o<0&&(o+=i),s[o]},getDirection:function(t,n,i){const{width:o,height:r}=n,s=e.BoundsHelper.getPoint(n,"center",!0),a=t.x-s.x,d=t.y-s.y;if(!i&&Math.abs(a)<o/4&&Math.abs(d)<r/4)return"center";const h=Math.abs(a)*r,c=Math.abs(d)*o;if(h>c)return a>0?"right":"left";return d>0?"bottom":"top"},getPointDirection:function(t,e,n){const{width:i,height:o}=e,a=i/4,d=o/4;for(let e=0;e<r.length;e++){const h=r[e],c=h.x*i,u=h.y*o,p=t.x-c,l=t.y-u;if(Math.abs(p)<=a&&Math.abs(l)<=d){if(!n)return s[e];if("center"!==s[e])return s[e]}}return},autoRotatePoint(t,n,i){const{rotation:o,scaleX:r,scaleY:s}=i,a=r*s<0;(o||a)&&e.PointHelper.rotate(t,a?-o:o,n)}};function d(t){return e.decorateLeafAttr(t,t=>e.attr({set(n){if(this.__setAttr(t,n)){const t=this.__layout;t.linkerChanged||(e.doBoundsType(this),e.doStrokeType(this),t.linkerChanged=!0)}}}))}const{moveTo:h,bezierCurveTo:c,drawPoints:u}=e.PathCommandDataHelper,{isEmpty:p,getPoint:l}=e.BoundsHelper,{getDistance:f}=e.PointHelper,{getCtrlPoint:y,getDirectionForFromPoint:g,isOppositeDirection:x}=a,{max:P,min:L,abs:k}=Math;t.Linker=class extends e.Line{get __tag(){return"Linker"}constructor(t){super(t),this.onStartNodeChange=this.onStartNodeChange.bind(this),this.onEndNodeChange=this.onEndNodeChange.bind(this)}__updatePath(){const t=this.__layout,{startNode:e,endNode:n}=this;t.linkerChanged&&(this.updateLinkerNode("start"),this.updateLinkerNode("end"),this.updateLinkerPoint("start"),this.updateLinkerPoint("end"),e!==this.startNode&&this.listenLinkerNode(this.startNode,e,"start"),n!==this.endNode&&this.listenLinkerNode(this.endNode,n,"end"),t.linkerChanged=!1),this.updateLinkerPath()}listenLinkerNode(t,n,i){if(n){n.off(e.BoundsEvent.WORLD,"end"===i?this.onEndNodeChange:this.onStartNodeChange);const t="end"===i?n.endLinker:n.startLinker;if(t){const e=t.indexOf(this);e>-1&&t.splice(e,1)}}if(t){t.on(e.BoundsEvent.WORLD,"end"===i?this.onEndNodeChange:this.onStartNodeChange);("end"===i?t.endLinker||(t.endLinker=[]):t.startLinker||(t.startLinker=[])).push(this)}}onStartNodeChange(){this.onLinkerNodeChange("start")}onEndNodeChange(){this.onLinkerNodeChange("end")}onLinkerNodeChange(t){if(this.leaferIsCreated){const{layouter:t,zoomLayer:e}=this.leafer;if(t.__updatedList.has(e))return;t.addExtra(this,!0)}const{startData:n,endData:i}=this;"start"==t?(this.updateLinkerPoint("start"),i&&i.auto&&this.updateLinkerPoint("end")):(n&&n.auto&&this.updateLinkerPoint("start"),this.updateLinkerPoint("end")),this.__layout.boxChange(),e.LeafHelper.updateBounds(this)}updateLinkerNode(t){const{startPoint:n,endPoint:i}=this,o="end"===t?i:n;if(o){const{id:n}=o,i=n&&(e.isString(n)?this.app.findId(n):n);"end"===t?this.endNode=i:this.startNode=i}}getLinkerNodeCenter(t){const{startPoint:n,endPoint:i,startNode:o,endNode:r,startData:s,endData:a}=this,d="end"===t?r:o,h="end"===t?a||i:s||n;if(d){const{worldRenderBounds:t}=d;return p(t)&&e.LeafHelper.updateBounds(d),l(d.worldRenderBounds,"center")}return h&&e.isObject(h.point)&&this.getWorldPointByLocal(h.point)}updateLinkerPoint(t){const{startPoint:n,endPoint:i}=this,o="end"===t?i:n;if(o){const n={},{id:i,offset:r}=o;let{direction:s,point:a}=o;if("center"===s||!s&&i&&!a){const e=this.getLinkerNodeCenter("start"),i=this.getLinkerNodeCenter("end"),o="end"===t?i:e,r="end"===t?e:i;o&&r&&(s=g(o,r)),n.auto=!0}!s&&e.isString(a)&&(s=a),n.direction=s;const d="end"===t?this.endNode:this.startNode;let h;if(d){if(a||(a=s),a){const{boxBounds:t}=d;p(t)&&e.LeafHelper.updateBounds(d),h=l(t,a,!0),d.getWorldPointByBox(h,this,!1,!0)}}else e.isObject(a)&&(h=a);if(h&&r){const t=Object.assign({},r);r.x||(t.x=0),r.y||(t.y=0),d&&d.getWorldPoint(t,this,!0,!0),e.PointHelper.move(h,t)}n.point=h,"end"===t?this.endData=h&&n:this.startData=h&&n}}updateLinkerPath(){const t=this.__,n=t.path=[],i=t.points&&t.points.length,{startData:o,endData:r,startNode:s,endNode:a}=this;if(!o||!r)return;const d=o.point,p=r.point,l=o.direction,b=r.direction,N={x:k((d.x-p.x)/2),y:k((d.y-p.y)/2)},C=8*this.__.strokeWidth;let M;if(this.__.__useArrow){const t=L(f(d,p)/(25*C),1);M=P(C*t*12,3*C)}else M=2*C;if(b&&x(l,b)&&l===g(d,p)&&(M=2*C),N.x=P(M,N.x),N.y=P(M,N.y),i){M*=.6;const i=e.PointHelper.toNumberPoints(t.points);if(u(n,[d.x,d.y,...i,p.x,p.y],t.curve,!1,t),l){const t=n[4],e=n[5];N.x=P(M,k(t-d.x)),N.y=P(M,k(e-d.y));const i=y(this,s,d,l,N);n[4]=i.x,n[5]=i.y}const o=n.length;if(b){const t=n[o-4],e=n[o-3];N.x=P(M,k(t-p.x)),N.y=P(M,k(e-p.y));const i=y(this,a,p,b,N);n[o-4]=i.x,n[o-3]=i.y}else n[o-4]=p.x,n[o-3]=p.y}else{const t=l?y(this,s,d,l,N):d,e=b?y(this,a,p,b,N):p;h(n,d.x,d.y),c(n,t.x,t.y,e.x,e.y,p.x,p.y)}}createStartPoint(t,e,n){const i=this.createLinkerPoint(t,e,n);return this.startPoint=i,i}createEndPoint(t,e,n){const i=this.createLinkerPoint(t,e,n);return this.endPoint=i,i}createLinkerPoint(t,n,i){const o={};if(n&&n.id){const r=n.getBoxPoint(t),{boxBounds:s}=n,d=i&&i.mode,h="edge"===d||!d,c="four"===d,u="free"===d;if(!("auto"===d))if(c)o.point=a.getDirection(r,s,c);else if(o.direction=a.getDirection(r,s,h),o.point=a.getPointDirection(r,s,h)||o.direction,o.point===o.direction&&delete o.direction,u||h){const t=e.BoundsHelper.getPoint(s,o.point),n=r.x-t.x,a=r.y-t.y,d=i&&i.snapRadius||10;if(Math.abs(n)>d||Math.abs(a)>d){const t=o.offset={x:Math.abs(n)>d?n:0,y:Math.abs(a)>d?a:0};if(h&&(t.x||t.y))switch(o.direction||o.point){case"top":case"bottom":t.y=0;break;case"right":case"left":t.x=0;break;default:t.x>t.y?t.y=0:t.x=0}}}o.id=n.id}else o.point=this.getLocalPoint(t);return o}},i([e.dataProcessor(o)],t.Linker.prototype,"__",void 0),i([d()],t.Linker.prototype,"startPoint",void 0),i([d()],t.Linker.prototype,"endPoint",void 0),i([e.pathType({type:"C",value:.5})],t.Linker.prototype,"curve",void 0),t.Linker=i([e.registerUI()],t.Linker);const{toNumberPoints:b}=n.PointHelper,{M:N,L:C,C:M,Z:m}=n.PathCommandMap;return e.Plugin.add("linker"),e.registerPointsCurve("C",function(t,e,n,i){const o=b(e),r=o.length>>1;if(r<2)return;if(t.push(N,o[0],o[1]),!n||r<3){for(let e=1;e<r;e++)t.push(C,o[2*e],o[2*e+1]);return void(i&&t.push(m))}let s=!0===n?.5:n;s<0?s=0:s>1&&(s=1);const a=i?r:r-1;let d=o[0],h=o[1];{const t=o[2]-o[0],e=o[3]-o[1],n=Math.sqrt(t*t+e*e);n&&(d=o[0]+t/n*n*s,h=o[1]+e/n*n*s)}for(let e=0;e<a;e++){const n=e+1===r?0:e+1,i=o[2*n],a=o[2*n+1],c=0===n?r-1:n-1,u=n+1===r?0:n+1;let p=o[2*c]-i,l=o[2*c+1]-a,f=o[2*u]-i,y=o[2*u+1]-a;const g=Math.sqrt(p*p+l*l),x=Math.sqrt(f*f+y*y);let P=i,L=a,k=i,b=a;if(g||x){let t=0,e=0;g&&(t+=p/g,e+=l/g),x&&(t+=f/x,e+=y/x);let n=Math.sqrt(t*t+e*e);n||(x?(t=f/x,e=y/x):(t=p/g,e=l/g),n=1),t/=n,e/=n;let o=-e,r=t;x&&o*f+r*y<0&&(o=-o,r=-r);let d=0;g&&x&&(d=(p*f+l*y)/(g*x),d>1?d=1:d<-1&&(d=-1));let h=Math.sqrt(Math.sqrt(Math.max(0,1-d*d)));h<.15&&(h=.15);let c=g*s*h,u=x*s*h;const N=.5*Math.min(g||x,x||g);c>N&&(c=N),u>N&&(u=N),P=i-o*c,L=a-r*c,k=i+o*u,b=a+r*u}t.push(M,d,h,P,L,i,a),d=k,h=b}i&&t.push(m)}),t.LinkerData=o,t}({},LeaferUI,LeaferUI);
1
+ this.LeaferIN=this.LeaferIN||{},this.LeaferIN.linker=function(t,e,n){"use strict";function i(t,e,n,i){var o,r=arguments.length,s=r<3?e:null===i?i=Object.getOwnPropertyDescriptor(e,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,i);else for(var a=t.length-1;a>=0;a--)(o=t[a])&&(s=(r<3?o(s):r>3?o(e,n,s):o(e,n))||s);return r>3&&s&&Object.defineProperty(e,n,s),s}"function"==typeof SuppressedError&&SuppressedError;class o extends e.LineData{get __usePathBox(){return this.path||this.__pathInputed}}const{directionData:r}=e.AroundHelper,s=["top-left","top","top-right","right","bottom-right","bottom","bottom-left","left","center"],a={getCtrlPoint(t,e,n,i,o,r){let s;switch(e&&(n=e.getBoxPoint(n,t)),i){case"left":case"top-left":case"bottom-left":s={x:n.x-o.x,y:n.y};break;case"top":s={x:n.x,y:n.y-o.y};break;case"right":case"top-right":case"bottom-right":s={x:n.x+o.x,y:n.y};break;case"bottom":s={x:n.x,y:n.y+o.y};break;default:s={x:n.x,y:n.y}}return r&&(r=r/180*Math.PI,s={x:(s.x-n.x)*Math.cos(r)-(s.y-n.y)*Math.sin(r)+n.x,y:(s.x-n.x)*Math.sin(r)+(s.y-n.y)*Math.cos(r)+n.y}),e&&e.getWorldPointByBox(s,t,void 0,!0),s},isOppositeDirection(t,e){switch(t){case"left":return"right"==e;case"top":return"bottom"==e;case"right":return"left"==e;case"bottom":return"top"==e;case"center":return"center"==e;default:return!1}},getDirectionForFromPoint(t,e){const n=t.x-e.x,i=t.y-e.y;let o,r=180*Math.atan2(i,n)/Math.PI;return r<0&&(r=360+r),o=r>315||r<45?"left":r>45&&r<135?"top":r>135&&r<225?"right":"bottom",o},getRotateDirection(t,n,i=8){let o=e.Direction9[t];return o=(o+Math.round(n/(360/i)))%i,o<0&&(o+=i),s[o]},getDirection:function(t,n,i){const{width:o,height:r}=n,s=e.BoundsHelper.getPoint(n,"center",!0),a=t.x-s.x,h=t.y-s.y;if(!i&&Math.abs(a)<o/4&&Math.abs(h)<r/4)return"center";const c=Math.abs(a)*r,u=Math.abs(h)*o;if(c>u)return a>0?"right":"left";return h>0?"bottom":"top"},getPointDirection:function(t,e,n){const{width:i,height:o}=e,a=i/4,h=o/4;for(let e=0;e<r.length;e++){const c=r[e],u=c.x*i,d=c.y*o,l=t.x-u,f=t.y-d;if(Math.abs(l)<=a&&Math.abs(f)<=h){if(!n)return s[e];if("center"!==s[e])return s[e]}}return},autoRotatePoint(t,n,i){const{rotation:o,scaleX:r,scaleY:s}=i,a=r*s<0;(o||a)&&e.PointHelper.rotate(t,a?-o:o,n)}};function h(t){return e.decorateLeafAttr(t,t=>e.attr({set(n){if(this.__setAttr(t,n)){const t=this.__layout;t.linkerChanged||(e.doBoundsType(this),e.doStrokeType(this),t.linkerChanged=!0)}}}))}const{directionData:c}=e.AroundHelper,{moveTo:u,lineTo:d}=e.PathCommandDataHelper,l=.001;function f(t,e,n,i,o,r){const s=c[function(t){switch(t){case"top-left":return 0;case"top":return 1;case"top-right":return 2;case"right":return 3;case"bottom-right":return 4;case"bottom":return 5;case"bottom-left":return 6;case"left":return 7;default:return 8}}(t)],a=Math.sign(s.x-.5),h=Math.sign(s.y-.5),u=i?i.x+i.width/2:e.x,d=i?i.y+i.height/2:e.y,l=(o?o.x+o.width/2:n.x)-u,f=(o?o.y+o.height/2:n.y)-d,p=0+((a||(l>=0?1:-1))>0?1:0),y=2+((h||(f>=0?1:-1))>0?1:0);return a&&!h?(r[0]=p,1):h&&!a?(r[0]=y,1):(Math.abs(l)>=Math.abs(f)?(r[0]=p,r[1]=y):(r[0]=y,r[1]=p),2)}function p(t,e,n,i,o){const r=1&n?1:-1;if(0===n>>1){const n=e?r>0?e.x+e.width:e.x:t.x;o[0]=n+r*i,o[1]=t.y}else{const n=e?r>0?e.y+e.height:e.y:t.y;o[0]=t.x,o[1]=n+r*i}}function y(t,e,n,i){if(!n)return!1;const o=n.x-i,r=n.x+n.width+i,s=n.y-i,a=n.y+n.height+i;return t>o+l&&t<r-l&&e>s+l&&e<a-l}function g(t,e,n,i,o,r){if(!o)return!1;const s=o.x-r,a=o.x+o.width+r,h=o.y-r,c=o.y+o.height+r;return Math.abs(e-i)<=l?e>h+l&&e<c-l&&Math.max(Math.min(t,n),s+l)<Math.min(Math.max(t,n),a-l):!(Math.abs(t-n)<=l)||t>s+l&&t<a-l&&Math.max(Math.min(e,i),h+l)<Math.min(Math.max(e,i),c-l)}function x(t,e,n,i,o){if(!n)return;const r=n.x-i,s=n.x+n.width+i,a=n.y-i,h=n.y+n.height+i;t.push(r,s,r-o,s+o),e.push(a,h,a-o,h+o)}function b(t){t.sort((t,e)=>t-e);let e=0;for(let n=0;n<t.length;n++)(!e||Math.abs(t[n]-t[e-1])>l)&&(t[e++]=t[n]);t.length=e}function M(t,e){for(let n=0;n<t.length;n++)if(Math.abs(t[n]-e)<=l)return n;return-1}function m(t,e,n,i,o,r,s,a){const h=[],c=[];p(e,r,i,a,h),p(n,s,o,a,c);const u=h[0],d=h[1],f=c[0],m=c[1],P=i>>1,k=o>>1,L=1&i?1:-1,C=1&o?1:-1,D=Math.abs(u-e.x)+Math.abs(d-e.y),_=Math.abs(f-n.x)+Math.abs(m-n.y);if(g(e.x,e.y,u,d,s,a)||g(n.x,n.y,f,m,r,a))return 1/0;const w=function(t,e,n,i,o,r){const s=t>>1;return s===e>>1&&(1&t?1:-1)==-(1&e?1:-1)?s:Math.abs(o-n)>=Math.abs(r-i)?0:1}(i,o,u,d,f,m),v=function(t,e,n,i,o,r,s,a,h,c,u){const d=(i+r)/2,l=(o+s)/2;t.length=0,t.push(e.x,e.y,i,o),0===a?t.push(d,o,d,s):t.push(i,l,r,l),t.push(r,s,n.x,n.y);for(let e=4;e<t.length-2;e+=2){const n=t[e-2],i=t[e-1],o=t[e],r=t[e+1];if(g(n,i,o,r,h,u)||g(n,i,o,r,c,u))return 1/0}return N(t,u)}(t,e,n,u,d,f,m,w,r,s,a);if(v<1/0)return v;const B=2*Math.max(a,4),F=[u,f,(u+f)/2],H=[d,m,(d+m)/2];x(F,H,r,a,B),x(F,H,s,a,B);let E=Math.min(...F),I=Math.max(...F),T=Math.min(...H),O=Math.max(...H);F.push(E-2*B,I+2*B),H.push(T-2*B,O+2*B),b(F),b(H);const S=F.length,R=H.length,A=M(F,u),W=M(H,d),j=M(F,f),q=M(H,m);if(A<0||W<0||j<0||q<0)return 1/0;const U=W*S+A,z=q*S+j,X=S*R*3,Y=new Float64Array(X),Z=new Int32Array(X),G=new Uint8Array(X);Y.fill(1/0),Z.fill(-1);const J=3*U;Y[J]=0;const K=Math.max(4,1.5*a);let Q=-1,V=-1,$=0,tt=0,et=0,nt=0;const it=(t,e,n,i)=>{const o=F[t],h=H[e],c=e*S+t;if(y(o,h,r,a)||y(o,h,s,a))return;if(g(tt,et,o,h,r,a)||g(tt,et,o,h,s,a))return;if(Q===J)if(n===P+1){if(i!==L)return}else if(D<=l)return;if(c===z)if(n===k+1){if(i!==-C)return}else if(_<=l)return;const p=3*c+n;if(G[p])return;const x=Math.abs(o-tt)+Math.abs(h-et);let b=nt+x;if($&&$!==n){b+=K;const t=1===$?tt:et,e=0===w?(u+f)/2:(d+m)/2;Math.abs(t-e)>l&&(b+=2*K)}b<Y[p]&&(Y[p]=b,Z[p]=Q)};let ot=-1;for(let t=0;t<X;t++){let t=1/0,e=-1;for(let n=0;n<X;n++)!G[n]&&Y[n]<t&&(t=Y[n],e=n);if(e<0)break;if(Q=e,V=Math.floor(e/3),$=e%3,nt=t,G[e]=1,V===z){ot=e;break}const n=V%S,i=Math.floor(V/S);tt=F[n],et=H[i],n>0&&it(n-1,i,1,-1),n<S-1&&it(n+1,i,1,1),i>0&&it(n,i-1,2,-1),i<R-1&&it(n,i+1,2,1)}if(ot<0)return 1/0;const rt=[];let st=ot;for(;st>=0;){const t=Math.floor(st/3);if(rt.push(F[t%S],H[Math.floor(t/S)]),st===J)break;st=Z[st]}if(st!==J)return 1/0;t.length=0,t.push(e.x,e.y,u,d);for(let e=rt.length-4;e>=0;e-=2)t.push(rt[e],rt[e+1]);return t.push(n.x,n.y),Y[ot]+D+_}function P(t,e,n){const i=t.length;i>=2&&Math.abs(t[i-2]-e)<=l&&Math.abs(t[i-1]-n)<=l||t.push(e,n)}function k(t,e,n,i,o,r=0){if(Math.abs(e-i)>l&&Math.abs(n-o)>l)if(0===r){const r=(e+i)/2;P(t,r,n),P(t,r,o)}else{const r=(n+o)/2;P(t,e,r),P(t,i,r)}P(t,i,o)}function L(t,e,n,i,o,r,s,a,h){if(a.length%2)return 1/0;for(let t=0;t<a.length;t++)if(!Number.isFinite(a[t]))return 1/0;const c=[],u=[];p(e,r,i,h,c),p(n,s,o,h,u);const d=c[0],f=c[1],y=u[0],x=u[1];if(g(e.x,e.y,d,f,s,h)||g(n.x,n.y,y,x,r,h))return 1/0;t.length=0,P(t,e.x,e.y),P(t,d,f);let b=d,M=f;for(let e=0;e<a.length;e+=2){const n=a[e],o=a[e+1];k(t,b,M,n,o,0===e&&0===h?i>>1:0),b=n,M=o}const m=o>>1;return Math.abs(b-y)>l&&Math.abs(M-x)>l&&(0===m?P(t,b,x):P(t,y,M)),P(t,y,x),P(t,n.x,n.y),N(t,h)}function N(t,e){let n=0,i=0,o=-1;for(let e=2;e<t.length;e+=2){const r=t[e]-t[e-2],s=t[e+1]-t[e-1];if(Math.abs(r)<=l&&Math.abs(s)<=l)continue;const a=Math.abs(r)>l?0:1;n+=Math.abs(r)+Math.abs(s),-1!==o&&o!==a&&i++,o=a}return n+i*Math.max(e,4)*1.5}function C(t,e,n,i,o,r,s,a=8,h){if(!(Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(n.x)&&Number.isFinite(n.y)))return!1;if(r&&(!Number.isFinite(r.x)||!Number.isFinite(r.y)||!Number.isFinite(r.width)||!Number.isFinite(r.height)||r.width<0||r.height<0))return!1;if(s&&(!Number.isFinite(s.x)||!Number.isFinite(s.y)||!Number.isFinite(s.width)||!Number.isFinite(s.height)||s.width<0||s.height<0))return!1;a=Number.isFinite(a)?Math.max(0,a):8;const c=[],p=[],y=f(i,e,n,r,s,c),g=f(o,n,e,s,r,p),x=[],b=[];let M=1/0;for(let t=0;t<2&&M===1/0;t++){const i=0===t?a:0;for(let t=0;t<y;t++)for(let o=0;o<g;o++){const a=void 0!==h?L(x,e,n,c[t],p[o],r,s,h,i):m(x,e,n,c[t],p[o],r,s,i);if(a<M){M=a,b.length=0;for(let t=0;t<x.length;t++)b.push(x[t])}}}if(!b.length)return!1;void 0===h&&function(t){let e=2;for(let n=2;n<t.length;n+=2){const i=t[n],o=t[n+1],r=t[e-2],s=t[e-1];if(!(Math.abs(i-r)<=l&&Math.abs(o-s)<=l)){if(e>=4){const n=t[e-4],a=t[e-3],h=Math.abs(a-s)<=l&&Math.abs(s-o)<=l&&(r-n)*(i-r)>=0,c=Math.abs(n-r)<=l&&Math.abs(r-i)<=l&&(s-a)*(o-s)>=0;if(h||c){t[e-2]=i,t[e-1]=o;continue}}t[e++]=i,t[e++]=o}}t.length=e}(b),u(t,b[0],b[1]);for(let e=2;e<b.length;e+=2)d(t,b[e],b[e+1]);return!0}const{moveTo:D,lineTo:_,bezierCurveTo:w,drawPoints:v}=e.PathCommandDataHelper,{isEmpty:B,getPoint:F}=e.BoundsHelper,{getDistance:H}=e.PointHelper,{getCtrlPoint:E,getDirectionForFromPoint:I,isOppositeDirection:T}=a,{max:O,min:S,abs:R}=Math;t.Linker=class extends e.Line{get __tag(){return"Linker"}constructor(t){super(t),this.onStartNodeChange=this.onStartNodeChange.bind(this),this.onEndNodeChange=this.onEndNodeChange.bind(this)}__updatePath(){const t=this.__layout,{startNode:e,endNode:n}=this;t.linkerChanged&&(this.updateLinkerNode("start"),this.updateLinkerNode("end"),this.updateLinkerPoint("start"),this.updateLinkerPoint("end"),e!==this.startNode&&this.listenLinkerNode(this.startNode,e,"start"),n!==this.endNode&&this.listenLinkerNode(this.endNode,n,"end"),t.linkerChanged=!1),this.updateLinkerPath()}listenLinkerNode(t,n,i){if(n){n.off(e.BoundsEvent.WORLD,"end"===i?this.onEndNodeChange:this.onStartNodeChange);const t="end"===i?n.endLinker:n.startLinker;if(t){const e=t.indexOf(this);e>-1&&t.splice(e,1)}}if(t){t.on(e.BoundsEvent.WORLD,"end"===i?this.onEndNodeChange:this.onStartNodeChange);("end"===i?t.endLinker||(t.endLinker=[]):t.startLinker||(t.startLinker=[])).push(this)}}onStartNodeChange(){this.onLinkerNodeChange("start")}onEndNodeChange(){this.onLinkerNodeChange("end")}onLinkerNodeChange(t){if(this.leaferIsCreated){const{layouter:t,zoomLayer:e}=this.leafer;if(t.__updatedList.has(e))return;t.addExtra(this,!0)}const{startData:n,endData:i}=this;"start"==t?(this.updateLinkerPoint("start"),i&&i.auto&&this.updateLinkerPoint("end")):(n&&n.auto&&this.updateLinkerPoint("start"),this.updateLinkerPoint("end")),this.__layout.boxChange(),e.LeafHelper.updateBounds(this)}updateLinkerNode(t){const{startPoint:n,endPoint:i}=this,o="end"===t?i:n;if(o){const{id:n}=o,i=n&&(e.isString(n)?this.app.findId(n):n);"end"===t?this.endNode=i:this.startNode=i}}getLinkerNodeCenter(t){const{startPoint:n,endPoint:i,startNode:o,endNode:r,startData:s,endData:a}=this,h="end"===t?r:o,c="end"===t?a||i:s||n;if(h){const{worldRenderBounds:t}=h;return B(t)&&e.LeafHelper.updateBounds(h),F(h.worldRenderBounds,"center")}return c&&e.isObject(c.point)&&this.getWorldPointByLocal(c.point)}updateLinkerPoint(t){const{startPoint:n,endPoint:i,lineType:o}=this,r="end"===t?i:n;if(r){const n={},{id:i,offset:s}=r;let{direction:a,point:h}=r;if("center"===a||!a&&i&&!h){const e=this.getLinkerNodeCenter("start"),i=this.getLinkerNodeCenter("end"),o="end"===t?i:e,r="end"===t?e:i;o&&r&&(a=I(o,r)),n.auto=!0}!a&&e.isString(h)&&(a=h),n.direction=a;const c="end"===t?this.endNode:this.startNode;let u;if(c){if(h||(h=a),h){const{boxBounds:t}=c;B(t)&&e.LeafHelper.updateBounds(c),u=F(t,h,!0),c.getWorldPointByBox(u,this,!1,!0),"polyline"===o&&(n.bounds=c.getBounds("box",this.parent))}}else e.isObject(h)&&(u=h);if(u&&s){const t=Object.assign({},s);s.x||(t.x=0),s.y||(t.y=0),c&&c.getWorldPoint(t,this,!0,!0),e.PointHelper.move(u,t)}n.point=u,"end"===t?this.endData=u&&n:this.startData=u&&n}}updateLinkerPath(){const t=this.__,n=t.path=[],i=t.points&&t.points.length,{startData:o,endData:r,startNode:s,endNode:a}=this;if(!o||!r)return;const h=o.point,c=r.point,u=o.direction,d=r.direction,l=8*this.__.strokeWidth;switch(t.lineType){case"straight":D(n,h.x,h.y),_(n,c.x,c.y);break;case"polyline":C(n,h,c,u,d,o.bounds,r.bounds,l,i&&e.PointHelper.toNumberPoints(t.points));break;default:const f={x:R((h.x-c.x)/2),y:R((h.y-c.y)/2)};let p;if(this.__.__useArrow){const t=S(H(h,c)/(25*l),1);p=O(l*t*12,3*l)}else p=2*l;if(d&&T(u,d)&&u===I(h,c)&&(p=2*l),f.x=O(p,f.x),f.y=O(p,f.y),i){p*=.6;const i=e.PointHelper.toNumberPoints(t.points);if(v(n,[h.x,h.y,...i,c.x,c.y],t.curve,!1,t),u){const t=n[4],e=n[5];f.x=O(p,R(t-h.x)),f.y=O(p,R(e-h.y));const i=E(this,s,h,u,f);n[4]=i.x,n[5]=i.y}const o=n.length;if(d){const t=n[o-4],e=n[o-3];f.x=O(p,R(t-c.x)),f.y=O(p,R(e-c.y));const i=E(this,a,c,d,f);n[o-4]=i.x,n[o-3]=i.y}else n[o-4]=c.x,n[o-3]=c.y}else{const t=u?E(this,s,h,u,f):h,e=d?E(this,a,c,d,f):c;D(n,h.x,h.y),w(n,t.x,t.y,e.x,e.y,c.x,c.y)}}}createStartPoint(t,e,n){const i=this.createLinkerPoint(t,e,n);return this.startPoint=i,i}createEndPoint(t,e,n){const i=this.createLinkerPoint(t,e,n);return this.endPoint=i,i}createLinkerPoint(t,n,i){const o={};if(n&&n.id){const r=n.getBoxPoint(t),{boxBounds:s}=n,h=i&&i.mode,c="edge"===h||!h,u="four"===h,d="free"===h;if(!("auto"===h))if(u)o.point=a.getDirection(r,s,u);else if(o.direction=a.getDirection(r,s,c),o.point=a.getPointDirection(r,s,c)||o.direction,o.point===o.direction&&delete o.direction,d||c){const t=e.BoundsHelper.getPoint(s,o.point),n=r.x-t.x,a=r.y-t.y,h=i&&i.snapRadius||10;if(Math.abs(n)>h||Math.abs(a)>h){const t=o.offset={x:Math.abs(n)>h?n:0,y:Math.abs(a)>h?a:0};if(c&&(t.x||t.y))switch(o.direction||o.point){case"top":case"bottom":t.y=0;break;case"right":case"left":t.x=0;break;default:t.x>t.y?t.y=0:t.x=0}}}o.id=n.id}else o.point=this.getLocalPoint(t);return o}},i([e.dataProcessor(o)],t.Linker.prototype,"__",void 0),i([e.boundsType("curve")],t.Linker.prototype,"lineType",void 0),i([h()],t.Linker.prototype,"startPoint",void 0),i([h()],t.Linker.prototype,"endPoint",void 0),i([e.pathType({type:"C",value:.5})],t.Linker.prototype,"curve",void 0),t.Linker=i([e.registerUI()],t.Linker);const{toNumberPoints:A}=n.PointHelper,{M:W,L:j,C:q,Z:U}=n.PathCommandMap;return e.Plugin.add("linker"),e.registerPointsCurve("C",function(t,e,n,i){const o=A(e),r=o.length>>1;if(r<2)return;if(t.push(W,o[0],o[1]),!n||r<3){for(let e=1;e<r;e++)t.push(j,o[2*e],o[2*e+1]);return void(i&&t.push(U))}let s=!0===n?.5:n;s<0?s=0:s>1&&(s=1);const a=i?r:r-1;let h=o[0],c=o[1];{const t=o[2]-o[0],e=o[3]-o[1],n=Math.sqrt(t*t+e*e);n&&(h=o[0]+t/n*n*s,c=o[1]+e/n*n*s)}for(let e=0;e<a;e++){const n=e+1===r?0:e+1,i=o[2*n],a=o[2*n+1],u=0===n?r-1:n-1,d=n+1===r?0:n+1;let l=o[2*u]-i,f=o[2*u+1]-a,p=o[2*d]-i,y=o[2*d+1]-a;const g=Math.sqrt(l*l+f*f),x=Math.sqrt(p*p+y*y);let b=i,M=a,m=i,P=a;if(g||x){let t=0,e=0;g&&(t+=l/g,e+=f/g),x&&(t+=p/x,e+=y/x);let n=Math.sqrt(t*t+e*e);n||(x?(t=p/x,e=y/x):(t=l/g,e=f/g),n=1),t/=n,e/=n;let o=-e,r=t;x&&o*p+r*y<0&&(o=-o,r=-r);let h=0;g&&x&&(h=(l*p+f*y)/(g*x),h>1?h=1:h<-1&&(h=-1));let c=Math.sqrt(Math.sqrt(Math.max(0,1-h*h)));c<.15&&(c=.15);let u=g*s*c,d=x*s*c;const k=.5*Math.min(g||x,x||g);u>k&&(u=k),d>k&&(d=k),b=i-o*u,M=a-r*u,m=i+o*d,P=a+r*d}t.push(q,h,c,b,M,i,a),h=m,c=P}i&&t.push(U)}),t.LinkerData=o,t}({},LeaferUI,LeaferUI);
2
2
  //# sourceMappingURL=linker.min.js.map