@leafer-in/linker 2.3.3 → 2.3.4
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.
- package/dist/linker.cjs +166 -152
- package/dist/linker.esm.js +166 -152
- package/dist/linker.esm.min.js +1 -1
- package/dist/linker.esm.min.js.map +1 -1
- package/dist/linker.js +162 -152
- package/dist/linker.min.cjs +1 -1
- package/dist/linker.min.cjs.map +1 -1
- package/dist/linker.min.js +1 -1
- package/dist/linker.min.js.map +1 -1
- package/package.json +1 -1
- package/src/helper/drawPolyline.ts +177 -177
package/dist/linker.min.cjs.map
CHANGED
|
@@ -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/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":"2EAsDO,SAASA,EAAWC,EAAYC,EAAQC,EAAKC,GAChD,IAA2HC,EAAvHC,EAAIC,UAAUC,OAAQC,EAAIH,EAAI,EAAIJ,EAAkB,OAATE,EAAgBA,EAAOM,OAAOC,yBAAyBT,EAAQC,GAAOC,EACrH,GAAuB,iBAAZQ,SAAoD,mBAArBA,QAAQC,SAAyBJ,EAAIG,QAAQC,SAASZ,EAAYC,EAAQC,EAAKC,QACpH,IAAK,IAAIU,EAAIb,EAAWO,OAAS,EAAGM,GAAK,EAAGA,KAAST,EAAIJ,EAAWa,MAAIL,GAAKH,EAAI,EAAID,EAAEI,GAAKH,EAAI,EAAID,EAAEH,EAAQC,EAAKM,GAAKJ,EAAEH,EAAQC,KAASM,GAChJ,OAAOH,EAAI,GAAKG,GAAKC,OAAOK,eAAeb,EAAQC,EAAKM,GAAIA,CAChE,CA6QkD,mBAApBO,iBAAiCA,gBCpUzD,MAAOC,UAAmBC,EAAAA,SAE5B,gBAAWC,GACP,OAASC,KAAqBC,MAASD,KAAqBE,aAChE,ECJJ,MAAMC,cAAEA,GAAkBC,EAAAA,aAEpBC,EAA+B,CACjC,WACA,MACA,YACA,QACA,eACA,SACA,cACA,OACA,UAGSC,EAAe,CAKxB,YAAAC,CAAaC,EAAiBC,EAAWC,EAAmBC,EAAuBC,EAAkBC,GAOjG,IAAIC,EACJ,OANIL,IACAC,EAAQD,EAAKM,YAAYL,EAAOF,IAK5BG,GACJ,IAAK,OACL,IAAK,WACL,IAAK,cACDG,EAAY,CACRE,EAAGN,EAAMM,EAAIJ,EAAKI,EAClBC,EAAGP,EAAMO,GAEb,MACJ,IAAK,MACDH,EAAY,CACRE,EAAGN,EAAMM,EACTC,EAAGP,EAAMO,EAAIL,EAAKK,GAEtB,MACJ,IAAK,QACL,IAAK,YACL,IAAK,eACDH,EAAY,CACRE,EAAGN,EAAMM,EAAIJ,EAAKI,EAClBC,EAAGP,EAAMO,GAEb,MACJ,IAAK,SACDH,EAAY,CACRE,EAAGN,EAAMM,EACTC,EAAGP,EAAMO,EAAIL,EAAKK,GAEtB,MACJ,QACIH,EAAY,CACRE,EAAGN,EAAMM,EACTC,EAAGP,EAAMO,GAarB,OAVIJ,IACAA,EAAcA,EAAc,IAAMK,KAAKC,GACvCL,EAAY,CACRE,GAAIF,EAAUE,EAAIN,EAAMM,GAAKE,KAAKE,IAAIP,IAAgBC,EAAUG,EAAIP,EAAMO,GAAKC,KAAKG,IAAIR,GAAeH,EAAMM,EAC7GC,GAAIH,EAAUE,EAAIN,EAAMM,GAAKE,KAAKG,IAAIR,IAAgBC,EAAUG,EAAIP,EAAMO,GAAKC,KAAKE,IAAIP,GAAeH,EAAMO,IAIjHR,GAAMA,EAAKa,mBAAmBR,EAAWN,OAAQe,GAAW,GAEzDT,CACX,EAGA,mBAAAU,CAAoBC,EAAkBC,GAClC,OAAQD,GACJ,IAAK,OACD,MAAa,SAANC,EACX,IAAK,MACD,MAAa,UAANA,EACX,IAAK,QACD,MAAa,QAANA,EACX,IAAK,SACD,MAAa,OAANA,EACX,IAAK,SACD,MAAa,UAANA,EACX,QACI,OAAO,EAEnB,EAQA,wBAAAC,CAAyBF,EAAkBC,GACvC,MAAME,EAAIH,EAAKT,EAAIU,EAAGV,EAChBa,EAAIJ,EAAKR,EAAIS,EAAGT,EAEtB,IAAIN,EACAmB,EAAS,IAAMZ,KAAKa,MAAMF,EAAGD,GAAMV,KAAKC,GAc5C,OAZIW,EAAQ,IAAGA,EAAQ,IAAMA,GAGzBnB,EADAmB,EAAQ,KAAOA,EAAQ,GACX,OACLA,EAAQ,IAAMA,EAAQ,IACjB,MACLA,EAAQ,KAAOA,EAAQ,IAClB,QAEA,SAGTnB,CACX,EAEA,kBAAAqB,CAAmBrB,EAAuBsB,EAAkBC,EAAiB,GACzE,IAAIC,EAAiBC,EAAAA,WAAWzB,GAGhC,OAFAwB,GAAkBA,EAAiBjB,KAAKmB,MAAMJ,GAAY,IAAMC,KAAoBA,EAChFC,EAAiB,IAAGA,GAAkBD,GACnC7B,EAAe8B,EAC1B,EAEAG,aAuCJ,SAAsBC,EAAsBC,EAAqBC,GAC7D,MAAMC,MAAEA,EAAKC,OAAEA,GAAWH,EACpBI,EAASC,EAAAA,aAAaC,SAASN,EAAQ,UAAU,GAGjDO,EAAKR,EAASvB,EAAI4B,EAAO5B,EACzBgC,EAAKT,EAAStB,EAAI2B,EAAO3B,EAE/B,IAAKwB,GAEGvB,KAAK+B,IAAIF,GAAML,EAAQ,GAAKxB,KAAK+B,IAAID,GAAML,EAAS,EAAG,MAAO,SAetE,MAAMO,EAAKhC,KAAK+B,IAAIF,GAAMJ,EACpBQ,EAAKjC,KAAK+B,IAAID,GAAMN,EAG1B,GAAIQ,EAAKC,EACL,OAAOJ,EAAK,EAAI,QAAU,OAI9B,OAAOC,EAAK,EAAI,SAAW,KAC/B,EAxEII,kBAYJ,SAA2Bb,EAAsBC,EAAqBa,GAClE,MAAMX,MAAEA,EAAKC,OAAEA,GAAWH,EACpBc,EAAaZ,EAAQ,EACrBa,EAAaZ,EAAS,EAE5B,IAAK,IAAIjD,EAAI,EAAGA,EAAIS,EAAcf,OAAQM,IAAK,CAC3C,MAAM8D,EAAOrD,EAAcT,GAErB+D,EAAKD,EAAKxC,EAAI0B,EACdgB,EAAKF,EAAKvC,EAAI0B,EAEdI,EAAKR,EAASvB,EAAIyC,EAClBT,EAAKT,EAAStB,EAAIyC,EAExB,GAAIxC,KAAK+B,IAAIF,IAAOO,GAAcpC,KAAK+B,IAAID,IAAOO,EAAY,CAC1D,IAAIF,EAEG,OAAOhD,EAAeX,GADzB,GAA0B,WAAtBW,EAAeX,GAAiB,OAAOW,EAAeX,EAElE,CACJ,CAEA,MACJ,EAhCI,eAAAiE,CAAgBjD,EAAmBkD,EAAoBC,GACnD,MAAM5B,SAAEA,EAAQ6B,OAAEA,EAAMC,OAAEA,GAAWF,EAC/BG,EAAUF,EAASC,EAAS,GAC9B9B,GAAY+B,IAASC,EAAAA,YAAYC,OAAOxD,EAAOsD,GAAW/B,EAAWA,EAAU2B,EACvF,GCxIE,SAAUO,EAAgBC,GAC5B,OAAOC,mBAAiBD,EAAerF,GAAgBuF,EAAAA,KAAK,CACxD,GAAAC,CAAIC,GACA,GAAIxE,KAAKyE,UAAU1F,EAAKyF,GAAQ,CAC5B,MAAME,EAAS1E,KAAK2E,SACfD,EAAOE,gBACRC,EAAAA,aAAa7E,MACb8E,EAAAA,aAAa9E,MACb0E,EAAOE,eAAgB,EAE/B,CACJ,IAER,CCdA,MAAMzE,cAAEA,GAAkBC,EAAAA,qBAClB2E,EAAMC,OAAEA,GAAWC,EAAAA,sBAGrBC,EAAmB,KAkBzB,SAASC,EAAiBxE,EAAuBD,EAAmB5B,EAAoB0D,EAAiC4C,EAAuCC,GAC5J,MAAMC,EAAOnF,EAfjB,SAAmCQ,GAC/B,OAAQA,GACJ,IAAK,WAAY,OAAO,EACxB,IAAK,MAAO,OAAO,EACnB,IAAK,YAAa,OAAO,EACzB,IAAK,QAAS,OAAO,EACrB,IAAK,eAAgB,OAAO,EAC5B,IAAK,SAAU,OAAO,EACtB,IAAK,cAAe,OAAO,EAC3B,IAAK,OAAQ,OAAO,EACpB,QAAS,OAAO,EAExB,CAG+B4E,CAA0B5E,IAC/CoC,EAAK7B,KAAKsE,KAAKF,EAAKtE,EAAI,IAAMgC,EAAK9B,KAAKsE,KAAKF,EAAKrE,EAAI,IACtDwE,EAAKjD,EAASA,EAAOxB,EAAIwB,EAAOE,MAAQ,EAAIhC,EAAMM,EAClD0E,EAAKlD,EAASA,EAAOvB,EAAIuB,EAAOG,OAAS,EAAIjC,EAAMO,EAGnD0E,GAFKP,EAAeA,EAAapE,EAAIoE,EAAa1C,MAAQ,EAAI5D,EAAOkC,GAEvDyE,EAAIG,GADbR,EAAeA,EAAanE,EAAImE,EAAazC,OAAS,EAAI7D,EAAOmC,GACtCyE,EAGhCG,EAAQC,IAFA/C,IAAO4C,GAAU,EAAI,GAAI,IAEC,EAAI,EAAI,GAC1CI,EAAQC,IAFAhD,IAAO4C,GAAU,EAAI,GAAI,IAEC,EAAI,EAAI,GAEhD,OAAI7C,IAAOC,GACPqC,EAAM,GAAKQ,EACJ,GAGP7C,IAAOD,GACPsC,EAAM,GAAKU,EACJ,IAGP7E,KAAK+B,IAAI0C,IAAWzE,KAAK+B,IAAI2C,IAC7BP,EAAM,GAAKQ,EACXR,EAAM,GAAKU,IAEXV,EAAM,GAAKU,EACXV,EAAM,GAAKQ,GAGR,EACX,CAEA,SAASI,EAAgBvF,EAAmB8B,EAAiC0D,EAAcC,EAAmBC,GAC1G,MAAwBZ,EAAc,EAAPU,EAAW,GAAI,EAE9C,GAxDe,IAsDFA,GAAQ,EAEI,CACrB,MAAMG,EAAW7D,EAASgD,EAAO,EAAIhD,EAAOxB,EAAIwB,EAAOE,MAAQF,EAAOxB,EAAIN,EAAMM,EAChFoF,EAAO,GAAKC,EAAWb,EAAOW,EAC9BC,EAAO,GAAK1F,EAAMO,CACtB,KAAO,CACH,MAAMoF,EAAW7D,EAASgD,EAAO,EAAIhD,EAAOvB,EAAIuB,EAAOG,OAASH,EAAOvB,EAAIP,EAAMO,EACjFmF,EAAO,GAAK1F,EAAMM,EAClBoF,EAAO,GAAKC,EAAWb,EAAOW,CAClC,CACJ,CAEA,SAASG,EAAuBtF,EAAWC,EAAWuB,EAAiC2D,GACnF,IAAK3D,EAAQ,OAAO,EACpB,MAAM+D,EAAO/D,EAAOxB,EAAImF,EAAWK,EAAQhE,EAAOxB,EAAIwB,EAAOE,MAAQyD,EAC/DM,EAAMjE,EAAOvB,EAAIkF,EAAWO,EAASlE,EAAOvB,EAAIuB,EAAOG,OAASwD,EACtE,OAAOnF,EAAIuF,EAAOrB,GAAoBlE,EAAIwF,EAAQtB,GAAoBjE,EAAIwF,EAAMvB,GAAoBjE,EAAIyF,EAASxB,CACrH,CAEA,SAASyB,EAAyBC,EAAYC,EAAYC,EAAYC,EAAYvE,EAAiC2D,GAC/G,IAAK3D,EAAQ,OAAO,EACpB,MAAM+D,EAAO/D,EAAOxB,EAAImF,EAAWK,EAAQhE,EAAOxB,EAAIwB,EAAOE,MAAQyD,EAC/DM,EAAMjE,EAAOvB,EAAIkF,EAAWO,EAASlE,EAAOvB,EAAIuB,EAAOG,OAASwD,EAEtE,OAAIjF,KAAK+B,IAAI4D,EAAKE,IAAO7B,EACd2B,EAAKJ,EAAMvB,GAAoB2B,EAAKH,EAASxB,GAChDhE,KAAK8F,IAAI9F,KAAK+F,IAAIL,EAAIE,GAAKP,EAAOrB,GAAoBhE,KAAK+F,IAAI/F,KAAK8F,IAAIJ,EAAIE,GAAKN,EAAQtB,KAG7FhE,KAAK+B,IAAI2D,EAAKE,IAAO5B,IACd0B,EAAKL,EAAOrB,GAAoB0B,EAAKJ,EAAQtB,GAChDhE,KAAK8F,IAAI9F,KAAK+F,IAAIJ,EAAIE,GAAKN,EAAMvB,GAAoBhE,KAAK+F,IAAI/F,KAAK8F,IAAIH,EAAIE,GAAKL,EAASxB,EAIrG,CAEA,SAASgC,EAA6BC,EAAcC,EAAc5E,EAAiC2D,EAAmBkB,GAClH,IAAK7E,EAAQ,OACb,MAAM+D,EAAO/D,EAAOxB,EAAImF,EAAWK,EAAQhE,EAAOxB,EAAIwB,EAAOE,MAAQyD,EAC/DM,EAAMjE,EAAOvB,EAAIkF,EAAWO,EAASlE,EAAOvB,EAAIuB,EAAOG,OAASwD,EACtEgB,EAAGG,KAAKf,EAAMC,EAAOD,EAAOc,EAAQb,EAAQa,GAC5CD,EAAGE,KAAKb,EAAKC,EAAQD,EAAMY,EAAQX,EAASW,EAChD,CAEA,SAASE,EAAwBC,GAC7BA,EAAOC,KAAK,CAAC7F,EAAGC,IAAMD,EAAIC,GAC1B,IAAI6F,EAAQ,EAEZ,IAAK,IAAIhI,EAAI,EAAGA,EAAI8H,EAAOpI,OAAQM,MAC1BgI,GAASxG,KAAK+B,IAAIuE,EAAO9H,GAAK8H,EAAOE,EAAQ,IAAMxC,KAAkBsC,EAAOE,KAAWF,EAAO9H,IAGvG8H,EAAOpI,OAASsI,CACpB,CAEA,SAASC,EAA2BH,EAAkBhD,GAClD,IAAK,IAAI9E,EAAI,EAAGA,EAAI8H,EAAOpI,OAAQM,IAC/B,GAAIwB,KAAK+B,IAAIuE,EAAO9H,GAAK8E,IAAUU,EAAkB,OAAOxF,EAEhE,OAAO,CACX,CAqCA,SAASkI,EAAiBxB,EAAkByB,EAAwBC,EAAsBC,EAAmBC,EAAiBC,EAAsCC,EAAoC/B,GACpM,MAAMgC,EAAsB,GAAIC,EAAoB,GACpDnC,EAAgB4B,EAAYI,EAAaF,EAAW5B,EAAWgC,GAC/DlC,EAAgB6B,EAAUI,EAAWF,EAAS7B,EAAWiC,GAEzD,MAAMC,EAAKF,EAAU,GAAIG,EAAKH,EAAU,GAAII,EAAKH,EAAQ,GAAII,EAAKJ,EAAQ,GACpEK,EAAYV,GAAa,EAAGW,EAAUV,GAAW,EACjDW,EAAwB,EAAZZ,EAAgB,KAAQa,EAAoB,EAAVZ,EAAc,GAAI,EAChEa,EAAY3H,KAAK+B,IAAIoF,EAAKR,EAAW7G,GAAKE,KAAK+B,IAAIqF,EAAKT,EAAW5G,GACnE6H,EAAU5H,KAAK+B,IAAIsF,EAAKT,EAAS9G,GAAKE,KAAK+B,IAAIuF,EAAKV,EAAS7G,GAEnE,GAAI0F,EAAyBkB,EAAW7G,EAAG6G,EAAW5G,EAAGoH,EAAIC,EAAIJ,EAAW/B,IACxEQ,EAAyBmB,EAAS9G,EAAG8G,EAAS7G,EAAGsH,EAAIC,EAAIP,EAAa9B,GAAY,OAAO4C,IAE7F,MAAMC,EAhDV,SAAiCjB,EAAmBC,EAAiBK,EAAYC,EAAYC,EAAYC,GACrG,MAAMC,EAAYV,GAAa,EAG/B,OAAIU,IAHwCT,GAAW,IACzB,EAAZD,EAAgB,SAA4B,EAAVC,EAAc,GAAI,GAEVS,EACrDvH,KAAK+B,IAAIsF,EAAKF,IAAOnH,KAAK+B,IAAIuF,EAAKF,GA5H3B,EAAgB,CA6HnC,CA0CyBW,CAAwBlB,EAAWC,EAASK,EAAIC,EAAIC,EAAIC,GAGvEU,EA1CV,SAAkC9C,EAAkByB,EAAwBC,EAAsBO,EAAYC,EAAYC,EAAYC,EAAYQ,EAAsBf,EAAsCC,EAAoC/B,GAC9O,MAAMgD,GAAad,EAAKE,GAAM,EAAGa,GAAad,EAAKE,GAAM,EACzDpC,EAAOhH,OAAS,EAChBgH,EAAOkB,KAAKO,EAAW7G,EAAG6G,EAAW5G,EAAGoH,EAAIC,GAnI7B,IAqIXU,EACA5C,EAAOkB,KAAK6B,EAAWb,EAAIa,EAAWX,GAEtCpC,EAAOkB,KAAKe,EAAIe,EAAWb,EAAIa,GAGnChD,EAAOkB,KAAKiB,EAAIC,EAAIV,EAAS9G,EAAG8G,EAAS7G,GAGzC,IAAK,IAAIvB,EAAI,EAAGA,EAAI0G,EAAOhH,OAAS,EAAGM,GAAK,EAAG,CAC3C,MAAMkH,EAAKR,EAAO1G,EAAI,GAAImH,EAAKT,EAAO1G,EAAI,GACpCoH,EAAKV,EAAO1G,GAAIqH,EAAKX,EAAO1G,EAAI,GAEtC,GAAIiH,EAAyBC,EAAIC,EAAIC,EAAIC,EAAIkB,EAAa9B,IACtDQ,EAAyBC,EAAIC,EAAIC,EAAIC,EAAImB,EAAW/B,GAAY,OAAO4C,GAC/E,CAEA,OAAOM,EAAiBjD,EAAQD,EACpC,CAmB0BmD,CAAyBlD,EAAQyB,EAAYC,EAAUO,EAAIC,EAAIC,EAAIC,EAAIQ,EAAcf,EAAaC,EAAW/B,GACnI,GAAI+C,EAAgBH,IAAU,OAAOG,EAGrC,MAAM7B,EAAqD,EAA5CnG,KAAK8F,IAAIb,EA5KC,GA6KnBgB,EAAe,CAACkB,EAAIE,GAAKF,EAAKE,GAAM,GAAInB,EAAe,CAACkB,EAAIE,GAAKF,EAAKE,GAAM,GAElFtB,EAA6BC,EAAIC,EAAIa,EAAa9B,EAAWkB,GAC7DH,EAA6BC,EAAIC,EAAIc,EAAW/B,EAAWkB,GAE3D,IAAIkC,EAAOrI,KAAK+F,OAAOE,GAAKqC,EAAOtI,KAAK8F,OAAOG,GAC3CsC,EAAOvI,KAAK+F,OAAOG,GAAKsC,EAAOxI,KAAK8F,OAAOI,GAC/CD,EAAGG,KAAKiC,EAAgB,EAATlC,EAAYmC,EAAgB,EAATnC,GAClCD,EAAGE,KAAKmC,EAAgB,EAATpC,EAAYqC,EAAgB,EAATrC,GAElCE,EAAwBJ,GACxBI,EAAwBH,GAExB,MAAMuC,EAAKxC,EAAG/H,OAAQwK,EAAKxC,EAAGhI,OACxByK,EAAclC,EAA2BR,EAAIkB,GAAKyB,EAAcnC,EAA2BP,EAAIkB,GAC/FyB,EAAYpC,EAA2BR,EAAIoB,GAAKyB,EAAYrC,EAA2BP,EAAIoB,GAEjG,GAAIqB,EAAc,GAAKC,EAAc,GAAKC,EAAY,GAAKC,EAAY,EAAG,OAAOjB,IAEjF,MAAMkB,EAAYH,EAAcH,EAAKE,EAAaK,EAAUF,EAAYL,EAAKI,EACvEI,EAAQR,EAAKC,EAAK,EAClBQ,EAAW,IAAIC,aAAaF,GAAQG,EAAW,IAAIC,WAAWJ,GAAQK,EAAU,IAAIC,WAAWN,GAErGC,EAASM,KAAK3B,KACduB,EAASI,SAET,MAAMC,EAAyB,EAAZV,EACnBG,EAASO,GAAc,EAEvB,MAAMC,EAAW1J,KAAK8F,IA1MG,EACA,IAyMuBb,GAChD,IAAI0E,GAAe,EAAIC,GAAc,EAAIC,EAAc,EACnDC,GAAW,EAAGC,GAAW,EAAGC,GAAkB,EAElD,MAAMC,GAAQ,CAACC,EAAoBC,EAAoBC,EAAc9F,KACjE,MAAM+F,EAAQpE,EAAGiE,GAAaI,EAAQpE,EAAGiE,GACnCI,EAAWJ,EAAa1B,EAAKyB,EAEnC,GAAI9E,EAAuBiF,EAAOC,EAAOvD,EAAa9B,IAClDG,EAAuBiF,EAAOC,EAAOtD,EAAW/B,GAAY,OAEhE,GAAIQ,EAAyBqE,GAAUC,GAAUM,EAAOC,EAAOvD,EAAa9B,IACxEQ,EAAyBqE,GAAUC,GAAUM,EAAOC,EAAOtD,EAAW/B,GAAY,OAEtF,GAAI0E,IAAiBF,EACjB,GAAIW,IAAS7C,EAAY,GACrB,GAAIjD,IAASmD,EAAW,YACrB,GAAIE,GAAa3D,EAAkB,OAG9C,GAAIuG,IAAavB,EACb,GAAIoB,IAAS5C,EAAU,GACnB,GAAIlD,KAAUoD,EAAS,YACpB,GAAIE,GAAW5D,EAAkB,OAG5C,MAAMwG,EAAuB,EAAXD,EAAeH,EACjC,GAAId,EAAQkB,GAAY,OAExB,MAAMC,EAAgBzK,KAAK+B,IAAIsI,EAAQP,IAAY9J,KAAK+B,IAAIuI,EAAQP,IACpE,IAAIW,EAAOV,GAAkBS,EAE7B,GAAIZ,GAAeA,IAAgBO,EAAM,CACrCM,GAAQhB,EACR,MAAMiB,EAAiC/F,IAAhBiF,EAAiCC,GAAWC,GAC7Da,EA/OC,IA+OqB9C,GAA+BX,EAAKE,GAAM,GAAKD,EAAKE,GAAM,EAClFtH,KAAK+B,IAAI4I,EAAiBC,GAAuB5G,IAAkB0G,GAAmB,EAAXhB,EACnF,CAEIgB,EAAOxB,EAASsB,KAChBtB,EAASsB,GAAaE,EACtBtB,EAASoB,GAAab,IAI9B,IAAIkB,IAAY,EAEhB,IAAK,IAAIC,EAAY,EAAGA,EAAY7B,EAAO6B,IAAa,CACpD,IAAIC,EAAclD,IAAUmD,GAAQ,EAEpC,IAAK,IAAIxM,EAAI,EAAGA,EAAIyK,EAAOzK,KAClB8K,EAAQ9K,IAAM0K,EAAS1K,GAAKuM,IAC7BA,EAAc7B,EAAS1K,GACvBwM,EAAQxM,GAIhB,GAAIwM,EAAQ,EAAG,MAQf,GANArB,EAAeqB,EACfpB,EAAc5J,KAAKiL,MAAMD,EAAQ,GACjCnB,EAAcmB,EAAQ,EACtBhB,GAAkBe,EAClBzB,EAAQ0B,GAAS,EAEbpB,IAAgBZ,EAAS,CACzB6B,GAAYG,EACZ,KACJ,CAEA,MAAME,EAAStB,EAAcnB,EAAI0C,EAASnL,KAAKiL,MAAMrB,EAAcnB,GACnEqB,GAAW7D,EAAGiF,GACdnB,GAAW7D,EAAGiF,GAEVD,EAAS,GAAGjB,GAAMiB,EAAS,EAAGC,EAAQvG,MACtCsG,EAASzC,EAAK,GAAGwB,GAAMiB,EAAS,EAAGC,EAAQvG,EAAgB,GAC3DuG,EAAS,GAAGlB,GAAMiB,EAAQC,EAAS,EAAGrG,MACtCqG,EAASzC,EAAK,GAAGuB,GAAMiB,EAAQC,EAAS,EAAGrG,EAAgB,EACnE,CAEA,GAAI+F,GAAY,EAAG,OAAOhD,IAE1B,MAAMuD,GAAoB,GAC1B,IAAIJ,GAAQH,GAEZ,KAAOG,IAAS,GAAG,CACf,MAAMzL,EAAOS,KAAKiL,MAAMD,GAAQ,GAEhC,GADAI,GAAQhF,KAAKH,EAAG1G,EAAOkJ,GAAKvC,EAAGlG,KAAKiL,MAAM1L,EAAOkJ,KAC7CuC,KAAUvB,EAAY,MAC1BuB,GAAQ5B,EAAS4B,GACrB,CAEA,GAAIA,KAAUvB,EAAY,OAAO5B,IAEjC3C,EAAOhH,OAAS,EAChBgH,EAAOkB,KAAKO,EAAW7G,EAAG6G,EAAW5G,EAAGoH,EAAIC,GAE5C,IAAK,IAAI5I,EAAI4M,GAAQlN,OAAS,EAAGM,GAAK,EAAGA,GAAK,EAAG0G,EAAOkB,KAAKgF,GAAQ5M,GAAI4M,GAAQ5M,EAAI,IAGrF,OADA0G,EAAOkB,KAAKQ,EAAS9G,EAAG8G,EAAS7G,GAC1BmJ,EAAS2B,IAAalD,EAAYC,CAC7C,CAEA,SAASyD,EAAoBC,EAAkBxL,EAAWC,GACtD,MAAM7B,EAASoN,EAAOpN,OAClBA,GAAU,GAAK8B,KAAK+B,IAAIuJ,EAAOpN,EAAS,GAAK4B,IAAMkE,GAAoBhE,KAAK+B,IAAIuJ,EAAOpN,EAAS,GAAK6B,IAAMiE,GAC/GsH,EAAOlF,KAAKtG,EAAGC,EACnB,CAEA,SAASwL,EAAyBD,EAAkB5F,EAAYC,EAAYC,EAAYC,EAAY2F,EAzTjF,GA0Tf,GAAIxL,KAAK+B,IAAI2D,EAAKE,GAAM5B,GAAoBhE,KAAK+B,IAAI4D,EAAKE,GAAM7B,EAC5D,GA3TW,IA2TPwH,EAA0B,CAC1B,MAAMC,GAAQ/F,EAAKE,GAAM,EACzByF,EAAoBC,EAAQG,EAAM9F,GAClC0F,EAAoBC,EAAQG,EAAM5F,EACtC,KAAO,CACH,MAAM6F,GAAQ/F,EAAKE,GAAM,EACzBwF,EAAoBC,EAAQ5F,EAAIgG,GAChCL,EAAoBC,EAAQ1F,EAAI8F,EACpC,CAEJL,EAAoBC,EAAQ1F,EAAIC,EACpC,CAEA,SAAS8F,EAAoBzG,EAAkByB,EAAwBC,EAAsBC,EAAmBC,EAAiBC,EAAsCC,EAAoCsE,EAAkBrG,GACzN,GAAIqG,EAAOpN,OAAS,EAAG,OAAO2J,IAC9B,IAAK,IAAIrJ,EAAI,EAAGA,EAAI8M,EAAOpN,OAAQM,IAAK,IAAKoN,OAAOC,SAASP,EAAO9M,IAAK,OAAOqJ,IAEhF,MAAMZ,EAAsB,GAAIC,EAAoB,GACpDnC,EAAgB4B,EAAYI,EAAaF,EAAW5B,EAAWgC,GAC/DlC,EAAgB6B,EAAUI,EAAWF,EAAS7B,EAAWiC,GAEzD,MAAMC,EAAKF,EAAU,GAAIG,EAAKH,EAAU,GAAII,EAAKH,EAAQ,GAAII,EAAKJ,EAAQ,GAE1E,GAAIzB,EAAyBkB,EAAW7G,EAAG6G,EAAW5G,EAAGoH,EAAIC,EAAIJ,EAAW/B,IACxEQ,EAAyBmB,EAAS9G,EAAG8G,EAAS7G,EAAGsH,EAAIC,EAAIP,EAAa9B,GAAY,OAAO4C,IAE7F3C,EAAOhH,OAAS,EAChBmN,EAAoBnG,EAAQyB,EAAW7G,EAAG6G,EAAW5G,GACrDsL,EAAoBnG,EAAQiC,EAAIC,GAEhC,IAAItH,EAAIqH,EAAIpH,EAAIqH,EAEhB,IAAK,IAAI5I,EAAI,EAAGA,EAAI8M,EAAOpN,OAAQM,GAAK,EAAG,CACvC,MAAMiK,EAAK6C,EAAO9M,GAAIkK,EAAK4C,EAAO9M,EAAI,GACtC+M,EAAyBrG,EAAQpF,EAAGC,EAAG0I,EAAIC,EAAU,IAANlK,GAAyB,IAAdyG,EAAkB4B,GAAa,EA7V9E,GA8VX/G,EAAI2I,EACJ1I,EAAI2I,CACR,CAEA,MAAMlB,EAAUV,GAAW,EAS3B,OAPI9G,KAAK+B,IAAIjC,EAAIuH,GAAMrD,GAAoBhE,KAAK+B,IAAIhC,EAAIuH,GAAMtD,IApW/C,IAqWPwD,EAAwB6D,EAAoBnG,EAAQpF,EAAGwH,GACtD+D,EAAoBnG,EAAQmC,EAAItH,IAGzCsL,EAAoBnG,EAAQmC,EAAIC,GAChC+D,EAAoBnG,EAAQ0B,EAAS9G,EAAG8G,EAAS7G,GAC1CoI,EAAiBjD,EAAQD,EACpC,CAEA,SAASkD,EAAiBmD,EAAkBrG,GACxC,IAAI/G,EAAS,EAAG4N,EAAQ,EAAGC,GAAe,EAE1C,IAAK,IAAIvN,EAAI,EAAGA,EAAI8M,EAAOpN,OAAQM,GAAK,EAAG,CACvC,MAAMqD,EAAKyJ,EAAO9M,GAAK8M,EAAO9M,EAAI,GAAIsD,EAAKwJ,EAAO9M,EAAI,GAAK8M,EAAO9M,EAAI,GACtE,GAAIwB,KAAK+B,IAAIF,IAAOmC,GAAoBhE,KAAK+B,IAAID,IAAOkC,EAAkB,SAE1E,MAAMoG,EAAOpK,KAAK+B,IAAIF,GAAMmC,EArXjB,EAAgB,EAsX3B9F,GAAU8B,KAAK+B,IAAIF,GAAM7B,KAAK+B,IAAID,QAC9BiK,GAAuBA,IAAiB3B,GAAM0B,IAClDC,EAAe3B,CACnB,CAEA,OAAOlM,EAAS4N,EAAQ9L,KAAK8F,IAAIb,EAzXR,GACA,GAyX7B,CA8BM,SAAU+G,EAAajN,EAAgB4H,EAAwBC,EAAsBqF,EAA4BC,EAA0BnF,EAA2BC,EAAyB/B,EAAY,EAAGqG,GAChN,KAAKM,OAAOC,SAASlF,EAAW7G,IAAO8L,OAAOC,SAASlF,EAAW5G,IAAO6L,OAAOC,SAASjF,EAAS9G,IAAO8L,OAAOC,SAASjF,EAAS7G,IAAI,OAAO,EAE7I,GAAIgH,KAAiB6E,OAAOC,SAAS9E,EAAYjH,KAAO8L,OAAOC,SAAS9E,EAAYhH,KAAO6L,OAAOC,SAAS9E,EAAYvF,SAAWoK,OAAOC,SAAS9E,EAAYtF,SAAWsF,EAAYvF,MAAQ,GAAKuF,EAAYtF,OAAS,GAAI,OAAO,EAClO,GAAIuF,KAAe4E,OAAOC,SAAS7E,EAAUlH,KAAO8L,OAAOC,SAAS7E,EAAUjH,KAAO6L,OAAOC,SAAS7E,EAAUxF,SAAWoK,OAAOC,SAAS7E,EAAUvF,SAAWuF,EAAUxF,MAAQ,GAAKwF,EAAUvF,OAAS,GAAI,OAAO,EAEpNwD,EAAY2G,OAAOC,SAAS5G,GAAajF,KAAK8F,IAAI,EAAGb,GAAa,EAElE,MAAMkH,EAAuB,GAAIC,EAAqB,GAChDC,EAAapI,EAAiBgI,EAAgBtF,EAAYC,EAAUG,EAAaC,EAAWmF,GAC5FG,EAAWrI,EAAiBiI,EAActF,EAAUD,EAAYK,EAAWD,EAAaqF,GACxFG,EAAsB,GAAIC,EAAiB,GAEjD,IAAIC,EAAY5E,IAEhB,IAAK,IAAI6E,EAAO,EAAGA,EAAO,GAAKD,IAAc5E,IAAU6E,IAAQ,CAC3D,MAAMC,EAA4B,IAATD,EAAazH,EAAY,EAElD,IAAK,IAAIzG,EAAI,EAAGA,EAAI6N,EAAY7N,IAC5B,IAAK,IAAIoO,EAAI,EAAGA,EAAIN,EAAUM,IAAK,CAC/B,MAAMC,OAAmBxM,IAAXiL,EACRK,EAAoBY,EAAW5F,EAAYC,EAAUuF,EAAW3N,GAAI4N,EAASQ,GAAI7F,EAAaC,EAAWsE,EAAQqB,GACjHjG,EAAiB6F,EAAW5F,EAAYC,EAAUuF,EAAW3N,GAAI4N,EAASQ,GAAI7F,EAAaC,EAAW2F,GAE5G,GAAIE,EAAQJ,EAAW,CACnBA,EAAYI,EACZL,EAAKtO,OAAS,EACd,IAAK,IAAI4O,EAAI,EAAGA,EAAIP,EAAUrO,OAAQ4O,IAAKN,EAAKpG,KAAKmG,EAAUO,GACnE,CACJ,CAER,CAEA,IAAKN,EAAKtO,OAAQ,OAAO,OACVmC,IAAXiL,GA9DR,SAA0BA,GACtB,IAAI9E,EAAQ,EAEZ,IAAK,IAAIuG,EAAO,EAAGA,EAAOzB,EAAOpN,OAAQ6O,GAAQ,EAAG,CAChD,MAAMjN,EAAIwL,EAAOyB,GAAOhN,EAAIuL,EAAOyB,EAAO,GACpCxK,EAAK+I,EAAO9E,EAAQ,GAAIhE,EAAK8I,EAAO9E,EAAQ,GAElD,KAAIxG,KAAK+B,IAAIjC,EAAIyC,IAAOyB,GAAoBhE,KAAK+B,IAAIhC,EAAIyC,IAAOwB,GAAhE,CAEA,GAAIwC,GAAS,EAAG,CACZ,MAAMxE,EAAKsJ,EAAO9E,EAAQ,GAAIvE,EAAKqJ,EAAO9E,EAAQ,GAC5CwG,EAAahN,KAAK+B,IAAIE,EAAKO,IAAOwB,GAAoBhE,KAAK+B,IAAIS,EAAKzC,IAAMiE,IAAqBzB,EAAKP,IAAOlC,EAAIyC,IAAO,EACtH0K,EAAWjN,KAAK+B,IAAIC,EAAKO,IAAOyB,GAAoBhE,KAAK+B,IAAIQ,EAAKzC,IAAMkE,IAAqBxB,EAAKP,IAAOlC,EAAIyC,IAAO,EAE1H,GAAIwK,GAAcC,EAAU,CACxB3B,EAAO9E,EAAQ,GAAK1G,EACpBwL,EAAO9E,EAAQ,GAAKzG,EACpB,QACJ,CACJ,CAEAuL,EAAO9E,KAAW1G,EAClBwL,EAAO9E,KAAWzG,CAfgE,CAgBtF,CAEAuL,EAAOpN,OAASsI,CACpB,CAoC8B0G,CAAiBV,GAE3C3I,EAAO9E,EAAMyN,EAAK,GAAIA,EAAK,IAC3B,IAAK,IAAIhO,EAAI,EAAGA,EAAIgO,EAAKtO,OAAQM,GAAK,EAAGsF,EAAO/E,EAAMyN,EAAKhO,GAAIgO,EAAKhO,EAAI,IACxE,OAAO,CACX,CC9bA,MAAMqF,OAAEA,EAAMC,OAAEA,EAAMqJ,cAAEA,EAAaC,WAAEA,GAAerJ,EAAAA,uBAChDsJ,QAAEA,EAAOzL,SAAEA,GAAaD,EAAAA,cACxB2L,YAAEA,GAAgBvK,EAAAA,aAClB1D,aAAEA,EAAYoB,yBAAEA,EAAwBH,oBAAEA,GAAwBlB,GAClE0G,IAAEA,EAAGC,IAAEA,EAAGhE,IAAEA,GAAQ/B,KAIbuN,QAAAA,OAAN,cAAqBC,OAExB,SAAWC,GAAU,MAAO,QAAS,CAwBrC,WAAAC,CAAYtJ,GACRuJ,MAAMvJ,GACNtF,KAAK8O,kBAAoB9O,KAAK8O,kBAAkBC,KAAK/O,MACrDA,KAAKgP,gBAAkBhP,KAAKgP,gBAAgBD,KAAK/O,KACrD,CAEO,YAAAiP,GAEH,MAAMvK,EAAS1E,KAAK2E,UAEdsF,UAAEA,EAASC,QAAEA,GAAYlK,KAE3B0E,EAAOE,gBACP5E,KAAKkP,iBAAiB,SACtBlP,KAAKkP,iBAAiB,OAEtBlP,KAAKmP,kBAAkB,SACvBnP,KAAKmP,kBAAkB,OAEnBlF,IAAcjK,KAAKiK,WAAWjK,KAAKoP,iBAAiBpP,KAAKiK,UAAWA,EAAW,SAC/EC,IAAYlK,KAAKkK,SAASlK,KAAKoP,iBAAiBpP,KAAKkK,QAASA,EAAS,OAE3ExF,EAAOE,eAAgB,GAG3B5E,KAAKqP,kBACT,CAEO,gBAAAD,CAAiBE,EAAcC,EAAcC,GAChD,GAAID,EAAS,CACTA,EAAQE,IAAIC,EAAAA,YAAYC,MAAgB,QAATH,EAAiBxP,KAAKgP,gBAAkBhP,KAAK8O,mBAC5E,MAAMc,EAAgB,QAATJ,EAAiBD,EAAQM,UAAYN,EAAQO,YAC1D,GAAIF,EAAM,CACN,MAAMG,EAAQH,EAAKI,QAAQhQ,MACvB+P,GAAQ,GAAIH,EAAKK,OAAOF,EAAO,EACvC,CACJ,CACA,GAAIT,EAAS,CACTA,EAAQY,GAAGR,EAAAA,YAAYC,MAAgB,QAATH,EAAiBxP,KAAKgP,gBAAkBhP,KAAK8O,oBACrD,QAATU,EAAkBF,EAAQO,YAAcP,EAAQO,UAAY,IAAQP,EAAQQ,cAAgBR,EAAQQ,YAAc,KAC1HxI,KAAKtH,KACd,CACJ,CAEO,iBAAA8O,GACH9O,KAAKmQ,mBAAmB,QAC5B,CAEO,eAAAnB,GACHhP,KAAKmQ,mBAAmB,MAC5B,CAEO,kBAAAA,CAAmBX,GACtB,GAAIxP,KAAKoQ,gBAAiB,CACtB,MAAMC,SAAEA,EAAQC,UAAEA,GAActQ,KAAKuQ,OACrC,GAAIF,EAASG,cAAcC,IAAIH,GAAY,OAC3CD,EAASK,SAAS1Q,MAAM,EAC5B,CAEA,MAAM2Q,UAAEA,EAASC,QAAEA,GAAY5Q,KACnB,SAARwP,GACAxP,KAAKmP,kBAAkB,SACnByB,GAAWA,EAAQC,MAAM7Q,KAAKmP,kBAAkB,SAEhDwB,GAAaA,EAAUE,MAAM7Q,KAAKmP,kBAAkB,SACxDnP,KAAKmP,kBAAkB,QAG3BnP,KAAK2E,SAASmM,YACdC,EAAAA,WAAWC,aAAahR,KAC5B,CAEO,gBAAAkP,CAAiBM,GACpB,MAAM3H,WAAEA,EAAUC,SAAEA,GAAa9H,KAC3BiR,EAAoB,QAATzB,EAAiB1H,EAAWD,EAC7C,GAAIoJ,EAAU,CACV,MAAMC,GAAEA,GAAOD,EACTpN,EAAKqN,IAAOC,EAAAA,SAASD,GAAMlR,KAAKoR,IAAIC,OAAOH,GAAMA,GAC9C,QAAT1B,EAAiBxP,KAAKkK,QAAUrG,EAAK7D,KAAKiK,UAAYpG,CAC1D,CACJ,CAEO,mBAAAyN,CAAoB9B,GACvB,MAAM3H,WAAEA,EAAUC,SAAEA,EAAQmC,UAAEA,EAASC,QAAEA,EAAOyG,UAAEA,EAASC,QAAEA,GAAY5Q,KACnES,EAAgB,QAAT+O,EAAiBtF,EAAUD,EAClC3E,EAAgB,QAATkK,EAAkBoB,GAAW9I,EAAa6I,GAAa9I,EACpE,GAAIpH,EAAM,CACN,MAAM8Q,kBAAEA,GAAsB9Q,EAE9B,OADI8N,EAAQgD,IAAoBR,aAAWC,aAAavQ,GACjDqC,EAASrC,EAAK8Q,kBAAmB,SAC5C,CACI,OAAOjM,GAAQkM,EAAAA,SAASlM,EAAK5E,QAAUV,KAAKyR,qBAAqBnM,EAAK5E,MAE9E,CAEO,iBAAAyO,CAAkBK,GACrB,MAAM3H,WAAEA,EAAUC,SAAEA,EAAQ4J,SAAEA,GAAa1R,KACrCiR,EAAoB,QAATzB,EAAiB1H,EAAWD,EAC7C,GAAIoJ,EAAU,CACV,MAAM3L,EAAO,CAAA,GACP4L,GAAEA,EAAES,OAAEA,GAAWV,EACvB,IAAItQ,UAAEA,EAASD,MAAEA,GAAUuQ,EAE3B,GAAkB,WAAdtQ,IAA4BA,GAAauQ,IAAOxQ,EAAQ,CACxD,MAAMkR,EAAQ5R,KAAKsR,oBAAoB,SACjCO,EAAM7R,KAAKsR,oBAAoB,OAC/B7P,EAAgB,QAAT+N,EAAiBqC,EAAMD,EAC9BlQ,EAAc,QAAT8N,EAAiBoC,EAAQC,EAChCpQ,GAAQC,IAAIf,EAAYgB,EAAyBF,EAAMC,IAC3D4D,EAAKuL,MAAO,CAChB,EAGKlQ,GAAawQ,EAAAA,SAASzQ,KAAQC,EAAYD,GAG/C4E,EAAK3E,UAAYA,EAEjB,MAAMkD,EAAc,QAAT2L,EAAiBxP,KAAKkK,QAAUlK,KAAKiK,UAEhD,IAAI6H,EAEJ,GAAIjO,GAEA,GADKnD,IAAOA,EAAQC,GAChBD,EAAO,CACP,MAAMqR,UAAEA,GAAclO,EAElB0K,EAAQwD,IAAYhB,aAAWC,aAAanN,GAChDiO,EAAIhP,EAASiP,EAAWrR,GAAO,GAC/BmD,EAAGvC,mBAAmBwQ,EAAG9R,MAAM,GAAO,GACrB,aAAb0R,IAAyBpM,EAAK9C,OAASqB,EAAGmO,UAAU,MAAOhS,KAAKiS,QACxE,OAEIT,EAAAA,SAAS9Q,KAAQoR,EAAIpR,GAG7B,GAAIoR,GAAKH,EAAQ,CACb,MAAMO,EAAI5S,OAAA6S,OAAA,CAAA,EAAKR,GACVA,EAAO3Q,IAAGkR,EAAElR,EAAI,GAChB2Q,EAAO1Q,IAAGiR,EAAEjR,EAAI,GAEjB4C,GAAIA,EAAGuO,cAAcF,EAAGlS,MAAM,GAAM,GACxCiE,cAAYoO,KAAKP,EAAGI,EACxB,CAEA5M,EAAK5E,MAAQoR,EAEJ,QAATtC,EAAiBxP,KAAK4Q,QAAUkB,GAAKxM,EAAOtF,KAAK2Q,UAAYmB,GAAKxM,CAEtE,CACJ,CAGO,gBAAA+J,GACH,MAAM/J,EAAOtF,KAAKsS,GACZrS,EAAiBqF,EAAKrF,KAAO,GAE7BsS,EAAYjN,EAAKkH,QAAUlH,EAAKkH,OAAOpN,QAEvCuR,UAAEA,EAASC,QAAEA,EAAO3G,UAAEA,EAASC,QAAEA,GAAYlK,KACnD,IAAK2Q,IAAcC,EACf,OAGJ,MAAM/I,EAAa8I,EAAUjQ,MAAOoH,EAAW8I,EAAQlQ,MACjDyM,EAAiBwD,EAAUhQ,UAAWyM,EAAewD,EAAQjQ,UAE7D6R,EAAmC,EAAtBxS,KAAKsS,GAAGG,YAE3B,OAAQnN,EAAKoM,UACT,IAAK,WACD3M,EAAO9E,EAAM4H,EAAW7G,EAAG6G,EAAW5G,GACtC+D,EAAO/E,EAAM6H,EAAS9G,EAAG8G,EAAS7G,GAClC,MACJ,IAAK,WACDiM,EAAajN,EAAM4H,EAAYC,EAAUqF,EAAgBC,EAAcuD,EAAUnO,OAAQoO,EAAQpO,OAAQgQ,EAAYD,GAAatO,EAAAA,YAAYyO,eAAepN,EAAKkH,SAClK,MAEJ,QACI,MAAMmG,EAAmB,CACrB3R,EAAGiC,GAAK4E,EAAW7G,EAAI8G,EAAS9G,GAAK,GACrCC,EAAGgC,GAAK4E,EAAW5G,EAAI6G,EAAS7G,GAAK,IAGzC,IAAI2R,EAEJ,GAAI5S,KAAKsS,GAAGO,WAAY,CACpB,MAAMC,EAAQ7L,EAAIuH,EAAY3G,EAAYC,IAA0B,GAAb0K,GAAkB,GACzEI,EAAU5L,EAAIwL,EAAaM,EAAQ,GAAiB,EAAbN,EAC3C,MACII,EAAuB,EAAbJ,EAed,GAZIpF,GAEI5L,EAAoB2L,EAAgBC,IAAiBD,IAAmBxL,EAAyBkG,EAAYC,KAE7G8K,EAAuB,EAAbJ,GAKlBG,EAAK3R,EAAIgG,EAAI4L,EAASD,EAAK3R,GAC3B2R,EAAK1R,EAAI+F,EAAI4L,EAASD,EAAK1R,GAEvBsR,EAAW,CACXK,GAAW,GACX,MAAMpG,EAASvI,EAAAA,YAAYyO,eAAepN,EAAKkH,QAG/C,GAFA8B,EAAWrO,EAAM,CAAC4H,EAAW7G,EAAG6G,EAAW5G,KAAMuL,EAAQ1E,EAAS9G,EAAG8G,EAAS7G,GAAIqE,EAAKyN,OAAO,EAAOzN,GAEjG6H,EAAgB,CAChB,MAAM6F,EAAU/S,EAAK,GACfgT,EAAUhT,EAAK,GAErB0S,EAAK3R,EAAIgG,EAAI4L,EAAS3P,EAAI+P,EAAUnL,EAAW7G,IAC/C2R,EAAK1R,EAAI+F,EAAI4L,EAAS3P,EAAIgQ,EAAUpL,EAAW5G,IAC/C,MAAMiS,EAA6B3S,EAAaP,KAAMiK,EAAWpC,EAAYsF,EAAgBwF,GAC7F1S,EAAK,GAAKiT,EAAelS,EACzBf,EAAK,GAAKiT,EAAejS,CAC7B,CAEA,MAAMkS,EAAMlT,EAAKb,OACjB,GAAIgO,EAAc,CAEd,MAAM4F,EAAU/S,EAAKkT,EAAM,GACrBF,EAAUhT,EAAKkT,EAAM,GAE3BR,EAAK3R,EAAIgG,EAAI4L,EAAS3P,EAAI+P,EAAUlL,EAAS9G,IAC7C2R,EAAK1R,EAAI+F,EAAI4L,EAAS3P,EAAIgQ,EAAUnL,EAAS7G,IAC7C,MAAMmS,EAA2B7S,EAAaP,KAAMkK,EAASpC,EAAUsF,EAAcuF,GACrF1S,EAAKkT,EAAM,GAAKC,EAAapS,EAC7Bf,EAAKkT,EAAM,GAAKC,EAAanS,CACjC,MACIhB,EAAKkT,EAAM,GAAKrL,EAAS9G,EACzBf,EAAKkT,EAAM,GAAKrL,EAAS7G,CAGjC,KAAO,CAEH,MAAMiS,EAA6B/F,EAAiB5M,EAAaP,KAAMiK,EAAWpC,EAAYsF,EAAgBwF,GAAQ9K,EAChHuL,EAA2BhG,EAAe7M,EAAaP,KAAMkK,EAASpC,EAAUsF,EAAcuF,GAAQ7K,EAE5G/C,EAAO9E,EAAM4H,EAAW7G,EAAG6G,EAAW5G,GACtCoN,EAAcpO,EAAMiT,EAAelS,EAAGkS,EAAejS,EAAGmS,EAAapS,EAAGoS,EAAanS,EAAG6G,EAAS9G,EAAG8G,EAAS7G,EACjH,EAIZ,CAEO,gBAAAoS,CAAiBC,EAAwB7S,EAAc8S,GAC1D,MAAMjO,EAAOtF,KAAKwT,kBAAkBF,EAAY7S,EAAM8S,GAEtD,OADAvT,KAAK6H,WAAavC,EACXA,CACX,CAEO,cAAAmO,CAAeH,EAAwB7S,EAAc8S,GACxD,MAAMjO,EAAOtF,KAAKwT,kBAAkBF,EAAY7S,EAAM8S,GAEtD,OADAvT,KAAK8H,SAAWxC,EACTA,CACX,CAEO,iBAAAkO,CAAkBF,EAAwB7S,EAAc8S,GAC3D,MAAMjO,EAAyB,CAAA,EAC/B,GAAI7E,GAAQA,EAAKyQ,GAAI,CACjB,MAAMxQ,EAAQD,EAAKM,YAAYuS,IACzBvB,UAAEA,GAActR,EAEhBiT,EAAOH,GAAWA,EAAQG,KAE1BC,EAAgB,SAATD,IAAoBA,EAC3BjR,EAAgB,SAATiR,EAEPE,EAAgB,SAATF,EAEb,KAHsB,SAATA,GAKT,GAAIjR,EACA6C,EAAK5E,MAAQJ,EAAagC,aAAa5B,EAAOqR,EAAWtP,QAMzD,GAJA6C,EAAK3E,UAAYL,EAAagC,aAAa5B,EAAOqR,EAAW4B,GAC7DrO,EAAK5E,MAAQJ,EAAa8C,kBAAkB1C,EAAOqR,EAAW4B,IAASrO,EAAK3E,UACxE2E,EAAK5E,QAAU4E,EAAK3E,kBAAkB2E,EAAK3E,UAE3CiT,GAAQD,EAAM,CACd,MAAME,EAAYhR,EAAAA,aAAaC,SAASiP,EAAWzM,EAAK5E,OAElDoT,EAAUpT,EAAMM,EAAI6S,EAAU7S,EAC9B+S,EAAUrT,EAAMO,EAAI4S,EAAU5S,EAE9B+S,EAAcT,GAAWA,EAAQS,YAAe,GAEtD,GAAI9S,KAAK+B,IAAI6Q,GAAWE,GAAc9S,KAAK+B,IAAI8Q,GAAWC,EAAY,CAClE,MAAMrC,EAASrM,EAAKqM,OAAS,CACzB3Q,EAAGE,KAAK+B,IAAI6Q,GAAWE,EAAaF,EAAU,EAC9C7S,EAAGC,KAAK+B,IAAI8Q,GAAWC,EAAaD,EAAU,GAGlD,GAAIJ,IAAShC,EAAO3Q,GAAK2Q,EAAO1Q,GAC5B,OAAQqE,EAAK3E,WAAa2E,EAAK5E,OAC3B,IAAK,MACL,IAAK,SACDiR,EAAO1Q,EAAI,EAAG,MAClB,IAAK,QACL,IAAK,OACD0Q,EAAO3Q,EAAI,EAAG,MAClB,QACQ2Q,EAAO3Q,EAAI2Q,EAAO1Q,EAAG0Q,EAAO1Q,EAAI,EAC/B0Q,EAAO3Q,EAAI,EAIhC,CACJ,CAKRsE,EAAK4L,GAAKzQ,EAAKyQ,EACnB,MACI5L,EAAK5E,MAAQV,KAAKiU,cAAcX,GAGpC,OAAOhO,CACX,GAzVe1G,EAAA,CADdsV,EAAAA,cAAcrU,IACe4O,eAAA0F,UAAA,UAAA,GAGvBvV,EAAA,CADNwV,EAAAA,WAAW,UACe3F,eAAA0F,UAAA,gBAAA,GAGpBvV,EAAA,CADNuF,KACmCsK,eAAA0F,UAAA,kBAAA,GAG7BvV,EAAA,CADNuF,KACiCsK,eAAA0F,UAAA,gBAAA,GAGnBvV,EAAA,CADdyV,EAAAA,SAAS,CAAE7E,KAAM,IAAKhL,MAAO,MACKiK,eAAA0F,UAAA,aAAA,GAjB1B1F,QAAAA,OAAM7P,EAAA,CADlB0V,EAAAA,cACY7F,gBCbb,MAAMiE,eAAEA,GAAmBzO,EAAAA,aACrBsQ,EAAEA,EAACC,EAAEA,EAACC,EAAEA,EAACC,EAAEA,GAAMC,EAAAA,eCEvBC,EAAAA,OAAOC,IAAI,UAEXC,EAAAA,oBAAoB,ID8Dd,SAAqBxP,EAAwByP,EAAuChC,EAA0BiC,GAChH,MAAMxI,EAASkG,EAAeqC,GACxBE,EAAQzI,EAAOpN,QAAU,EAE/B,GAAI6V,EAAQ,EAAG,OAIf,GAFA3P,EAAKgC,KAAKiN,EAAG/H,EAAO,GAAIA,EAAO,KAE1BuG,GAASkC,EAAQ,EAAG,CAErB,IAAK,IAAIvV,EAAI,EAAGA,EAAIuV,EAAOvV,IAEvB4F,EAAKgC,KAAKkN,EAAGhI,EAAW,EAAJ9M,GAAQ8M,EAAW,EAAJ9M,EAAQ,IAI/C,YADIsV,GAAO1P,EAAKgC,KAAKoN,GAEzB,CAEA,IAAIQ,GAAoB,IAAVnC,EAAiB,GAAMA,EAEjCmC,EAAU,EAAGA,EAAU,EAClBA,EAAU,IAAGA,EAAU,GAEhC,MAAMrD,EAAMmD,EAAQC,EAAQA,EAAQ,EAEpC,IAAIE,EAAW3I,EAAO,GAClB4I,EAAW5I,EAAO,GAMtB,CAEI,MAAMzJ,EAAKyJ,EAAO,GAAKA,EAAO,GACxBxJ,EAAKwJ,EAAO,GAAKA,EAAO,GAExB2G,EAAMjS,KAAKmU,KAAKtS,EAAKA,EAAKC,EAAKA,GAEjCmQ,IACAgC,EAAW3I,EAAO,GAAKzJ,EAAKoQ,EAAMA,EAAM+B,EACxCE,EAAW5I,EAAO,GAAKxJ,EAAKmQ,EAAMA,EAAM+B,EAEhD,CAGA,IAAK,IAAIxV,EAAI,EAAGA,EAAImS,EAAKnS,IAAK,CAC1B,MAAMqQ,EAAQrQ,EAAI,IAAMuV,EAAQ,EAAIvV,EAAI,EAElC4V,EAAK9I,EAAe,EAARuD,GACZwF,EAAK/I,EAAe,EAARuD,EAAY,GAExByF,EAAiB,IAAVzF,EAAckF,EAAQ,EAAIlF,EAAQ,EACzC0F,EAAO1F,EAAQ,IAAMkF,EAAQ,EAAIlF,EAAQ,EAW/C,IAAI2F,EATOlJ,EAAc,EAAPgJ,GASHF,EACXK,EATOnJ,EAAc,EAAPgJ,EAAW,GASdD,EAKXK,EAZOpJ,EAAc,EAAPiJ,GAYHH,EACXO,EAZOrJ,EAAc,EAAPiJ,EAAW,GAYdF,EAEf,MAAMO,EAAK5U,KAAKmU,KAAKK,EAAMA,EAAMC,EAAMA,GACjCI,EAAK7U,KAAKmU,KAAKO,EAAMA,EAAMC,EAAMA,GAEvC,IAAIG,EAAMV,EACNW,EAAMV,EAENW,EAAOZ,EACPa,EAAOZ,EAEX,GAAIO,GAAMC,EAAI,CAKV,IAAIK,EAAK,EACLC,EAAK,EAELP,IACAM,GAAMV,EAAMI,EACZO,GAAMV,EAAMG,GAGZC,IACAK,GAAMR,EAAMG,EACZM,GAAMR,EAAME,GAMhB,IAAIO,EAAOpV,KAAKmU,KAAKe,EAAKA,EAAKC,EAAKA,GAQ/BC,IAEGP,GACAK,EAAKR,EAAMG,EACXM,EAAKR,EAAME,IAGXK,EAAKV,EAAMI,EACXO,EAAKV,EAAMG,GAIfQ,EAAO,GAGXF,GAAME,EACND,GAAMC,EAON,IAAIC,GAAMF,EACNG,EAAKJ,EAKLL,GACIQ,EAAKX,EAAMY,EAAKX,EAAM,IACtBU,GAAMA,EACNC,GAAMA,GAOd,IAAIpV,EAAM,EAEN0U,GAAMC,IACN3U,GAAOsU,EAAME,EAAMD,EAAME,IAAQC,EAAKC,GAClC3U,EAAM,EAAGA,EAAM,EACVA,GAAM,IAAIA,GAAM,IAS7B,IAAIqV,EAAcvV,KAAKmU,KAAKnU,KAAKmU,KAAKnU,KAAK8F,IAAI,EAAG,EAAI5F,EAAMA,KAMxDqV,EAAc,MAAMA,EAAc,KAEtC,IAAIC,EAAWZ,EAAKZ,EAAUuB,EAC1BE,EAAYZ,EAAKb,EAAUuB,EAK/B,MAAMG,EAA2C,GAA/B1V,KAAK+F,IAAI6O,GAAMC,EAAIA,GAAMD,GAEvCY,EAAWE,IAAWF,EAAWE,GACjCD,EAAYC,IAAWD,EAAYC,GAEvCZ,EAAMV,EAAKiB,EAAKG,EAChBT,EAAMV,EAAKiB,EAAKE,EAEhBR,EAAOZ,EAAKiB,EAAKI,EACjBR,EAAOZ,EAAKiB,EAAKG,CACrB,CAEArR,EAAKgC,KAAKmN,EAGNU,EACAC,EAGAY,EACAC,EAGAX,EACAC,GAGJJ,EAAWe,EACXd,EAAWe,CACf,CAEInB,GAAO1P,EAAKgC,KAAKoN,EACzB","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, targetBounds?: IBoundsData): 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 xPort = (dx || (deltaX >= 0 ? 1 : -1)) > 0 ? 1 : 0\n const yPort = (dy || (deltaY >= 0 ? 1 : -1)) > 0 ? 3 : 2\n\n if (dx && !dy) return [xPort]\n if (dy && !dx) return [yPort]\n return Math.abs(deltaX) >= Math.abs(deltaY) ? [xPort, yPort] : [yPort, xPort]\n}\n\nfunction getPolylineExit(point: IPointData, bounds: IBoundsData | undefined, port: number, clearance: number): IPointData {\n const axis = port >> 1, sign = port & 1 ? 1 : -1\n\n if (axis === POLYLINE_X) {\n const x = bounds ? bounds.x + (sign > 0 ? bounds.width : 0) : point.x\n return { x: x + sign * clearance, y: point.y }\n }\n\n const y = bounds ? bounds.y + (sign > 0 ? bounds.height : 0) : point.y\n return { x: point.x, y: y + sign * clearance }\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\nfunction isPolylinePortAligned(port: number, stub: number, dx: number, dy: number): boolean {\n const offset = (port >> 1) === POLYLINE_X ? dx : dy\n const sign = port & 1 ? 1 : -1\n return Math.abs(offset) <= POLYLINE_EPSILON ? stub > POLYLINE_EPSILON : offset * sign > 0\n}\n\nfunction isPolylineMidpointAligned(port: number | undefined, stub: number, dx: number, dy: number, axis: number): boolean {\n if (port === undefined) return true\n\n // 取中点路径中实际存在的第一段,忽略重合的出口和转折点\n if (axis === POLYLINE_X && Math.abs(dx / 2) > POLYLINE_EPSILON) return isPolylinePortAligned(port, stub, dx, 0)\n if (axis === POLYLINE_Y && Math.abs(dy / 2) > POLYLINE_EPSILON) return isPolylinePortAligned(port, stub, 0, dy)\n if (Math.abs(dx) <= POLYLINE_EPSILON && Math.abs(dy) <= POLYLINE_EPSILON) return true\n return isPolylinePortAligned(port, stub, dx, dy)\n}\n\n// 检查实际接入方向,允许顺向接入或垂直转向,禁止与后续线段原路折返\nfunction isPolylineApproachAligned(points: number[], port?: number): boolean {\n if (port === undefined) return true\n\n const last = points.length - 2, x = points[last], y = points[last + 1]\n\n for (let i = last - 2; i >= 0; i -= 2) {\n const dx = points[i] - x, dy = points[i + 1] - y\n if (Math.abs(dx) > POLYLINE_EPSILON || Math.abs(dy) > POLYLINE_EPSILON) return isPolylinePortAligned(port, 1, dx, dy)\n }\n\n return true\n}\n\nfunction getPolylineRoute(result: number[], startPoint: IPointData, endPoint: IPointData, startPort: number, endPort: number | undefined, startBounds: IBoundsData | undefined, endBounds: IBoundsData | undefined, clearance: number, strictPorts: boolean, approachPort?: number): number {\n const startExit = getPolylineExit(startPoint, startBounds, startPort, clearance)\n const endExit = endPort === undefined ? endPoint : getPolylineExit(endPoint, endBounds, endPort, clearance)\n const { x: sx, y: sy } = startExit, { x: ex, y: ey } = endExit\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 if (endPort === undefined && (isPolylinePointBlocked(ex, ey, startBounds, clearance) ||\n isPolylinePointBlocked(ex, ey, endBounds, clearance))) return Infinity\n\n const axis = endPort === undefined ? startPort >> 1 : getPolylineMidpointAxis(startPort, endPort, sx, sy, ex, ey)\n const dx = ex - sx, dy = ey - sy\n result.length = 0\n result.push(startPoint.x, startPoint.y, sx, sy)\n\n if ((!strictPorts || (isPolylineMidpointAligned(startPort, startStub, dx, dy, axis) &&\n isPolylineMidpointAligned(endPort, endStub, -dx, -dy, axis))) &&\n isPolylineMidpointAligned(approachPort, 1, -dx, -dy, axis)) {\n const mx = (sx + ex) / 2, my = (sy + ey) / 2\n if (axis === POLYLINE_X) result.push(mx, sy, mx, ey)\n else result.push(sx, my, ex, my)\n result.push(ex, ey, endPoint.x, endPoint.y)\n\n // 两端的出线段可以进入各自所属元素\n for (let i = 4; i < result.length - 2; i += 2) {\n if (isPolylineSegmentBlocked(result[i - 2], result[i - 1], result[i], result[i + 1], startBounds, clearance) ||\n isPolylineSegmentBlocked(result[i - 2], result[i - 1], result[i], result[i + 1], endBounds, clearance)) {\n result.length = 4\n break\n }\n }\n\n // 兼顾出口与途径点重合的情况\n if (result.length > 4 && isPolylineApproachAligned(result, approachPort)) return getPolylineScore(result, clearance)\n result.length = 4\n }\n\n const score = findPolylineGridRoute(result, startExit, endExit, startPort, endPort, startBounds, endBounds, clearance, axis, startStub, endStub, strictPorts, approachPort)\n if (score === Infinity) return score\n\n result.push(endPoint.x, endPoint.y)\n return isPolylineApproachAligned(result, approachPort) ? score + startStub + endStub : Infinity\n}\n\nfunction findPolylineGridRoute(result: number[], startExit: IPointData, endExit: IPointData, startPort: number, endPort: number | undefined, startBounds: IBoundsData | undefined, endBounds: IBoundsData | undefined, clearance: number, midpointAxis: number, startStub: number, endStub: number, strictPorts: boolean, approachPort?: number): number {\n const { x: sx, y: sy } = startExit, { x: ex, y: ey } = endExit\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 xs.push(Math.min(...xs) - margin * 2, Math.max(...xs) + margin * 2)\n ys.push(Math.min(...ys) - margin * 2, Math.max(...ys) + 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 const pending = [startState]\n\n const turnCost = Math.max(POLYLINE_MIN_SEGMENT, clearance * POLYLINE_TURN_WEIGHT)\n const preferredCoordinate = midpointAxis === POLYLINE_X ? (sx + ex) / 2 : (sy + ey) / 2\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): void => {\n const nextX = xs[nextXIndex], nextY = ys[nextYIndex]\n const nextNode = nextYIndex * nx + nextXIndex\n const dx = nextX - currentX, dy = nextY - currentY\n\n if (nextNode === startNode) return\n\n // 接入约束独立于端口约束,放宽端口时仍禁止在途径点处折返\n if (approachPort !== undefined && nextNode === endNode && !isPolylinePortAligned(approachPort, 1, -dx, -dy)) return\n\n if (strictPorts && ((currentState === startState && !isPolylinePortAligned(startPort, startStub, dx, dy)) ||\n (endPort !== undefined && nextNode === endNode && !isPolylinePortAligned(endPort, endStub, -dx, -dy)))) return\n\n if (isPolylinePointBlocked(nextX, nextY, startBounds, clearance) ||\n isPolylinePointBlocked(nextX, nextY, endBounds, clearance) ||\n isPolylineSegmentBlocked(currentX, currentY, nextX, nextY, startBounds, clearance) ||\n isPolylineSegmentBlocked(currentX, currentY, nextX, nextY, endBounds, clearance)) return\n\n const nextState = nextNode * 3 + axis\n if (visited[nextState]) return\n\n let cost = currentDistance + (Math.abs(dx) + Math.abs(dy))\n\n if (currentAxis && currentAxis !== axis) {\n cost += turnCost\n const turnCoordinate = currentAxis === POLYLINE_X + 1 ? currentX : currentY\n if (Math.abs(turnCoordinate - preferredCoordinate) > POLYLINE_EPSILON) cost += turnCost * 2\n }\n\n if (cost < distance[nextState]) {\n if (distance[nextState] === Infinity) pending.push(nextState)\n distance[nextState] = cost\n previous[nextState] = currentState\n }\n }\n\n let bestState = -1\n\n while (pending.length) {\n let index = 0, state = pending[0]\n for (let i = 1; i < pending.length; i++) {\n const next = pending[i]\n if (distance[next] < distance[state] || (distance[next] === distance[state] && next < state)) {\n index = i\n state = next\n }\n }\n\n pending[index] = pending[pending.length - 1]\n pending.pop()\n currentState = state\n currentNode = Math.floor(state / 3)\n currentAxis = state % 3\n currentDistance = distance[state]\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)\n if (xIndex < nx - 1) relax(xIndex + 1, yIndex, POLYLINE_X + 1)\n if (yIndex > 0) relax(xIndex, yIndex - 1, POLYLINE_Y + 1)\n if (yIndex < ny - 1) relax(xIndex, yIndex + 1, POLYLINE_Y + 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 for (let i = reverse.length - 4; i >= 0; i -= 2) result.push(reverse[i], reverse[i + 1])\n return distance[bestState]\n}\n\n// 锚点或途径点被元素覆盖时,保留一条尽量少穿过元素的临时接线\nfunction getPolylineFallback(start: IPointData, end: IPointData, port: number, startBounds?: IBoundsData, endBounds?: IBoundsData): number[] {\n const { x: sx, y: sy } = start, { x: ex, y: ey } = end\n if (sx === ex || sy === ey) return [sx, sy, ex, ey]\n\n const horizontal = (port >> 1) === POLYLINE_X\n const crosses = (x: number, y: number): number => {\n let count = 0\n if (isPolylineSegmentBlocked(sx, sy, x, y, startBounds, 0)) count++\n if (isPolylineSegmentBlocked(x, y, ex, ey, startBounds, 0)) count++\n if (isPolylineSegmentBlocked(sx, sy, x, y, endBounds, 0)) count++\n if (isPolylineSegmentBlocked(x, y, ex, ey, endBounds, 0)) count++\n return count\n }\n const xy = crosses(ex, sy), yx = crosses(sx, ey)\n return xy < yx || (xy === yx && horizontal) ? [sx, sy, ex, sy, ex, ey] : [sx, sy, sx, ey, ex, ey]\n}\n\nfunction getBestPolyline(startPoint: IPointData, endPoint: IPointData, startDirection: IDirection, endDirection: IDirection | undefined, startBounds: IBoundsData | undefined, endBounds: IBoundsData | undefined, clearance: number, approachPort?: number): number[] {\n const startPorts = getPolylinePorts(startDirection, startPoint, endPoint, startBounds, endDirection === undefined ? undefined : endBounds)\n const endPorts = endDirection === undefined ? [undefined] : getPolylinePorts(endDirection, endPoint, startPoint, endBounds, startBounds)\n let candidate: number[] = [], best: number[] = [], bestScore = Infinity\n\n // 先保留方向并减小间距,再允许贴边转向\n for (let pass = clearance ? 0 : 1; pass < 3 && !best.length; pass++) {\n const gap = pass ? 0 : clearance\n for (let i = 0; i < startPorts.length; i++) {\n for (let j = 0; j < endPorts.length; j++) {\n const score = getPolylineRoute(candidate, startPoint, endPoint, startPorts[i], endPorts[j], startBounds, endBounds, gap, pass < 2, approachPort)\n if (score < bestScore) {\n bestScore = score\n const previous = best\n best = candidate\n candidate = previous\n }\n }\n }\n }\n\n if (!best.length) return getPolylineFallback(startPoint, endPoint, startPorts[0], startBounds, endBounds)\n simplifyPolyline(best)\n const last = best.length - 2\n if (best[last] !== endPoint.x || best[last + 1] !== endPoint.y) best.push(endPoint.x, endPoint.y)\n return best\n}\n\nfunction getPolylineEditSide(point: IPointData, waypoint: IPointData, direction: IDirection, bounds: IBoundsData | undefined, otherBounds: IBoundsData | undefined, clearance: number, points: number[], index: number, step: number): number[] {\n if (point.x === waypoint.x && point.y === waypoint.y) return []\n\n let approachPort: number | undefined\n\n // 跳过重合途径点,根据后续线段确定接入方向\n for (let i = index + step; i >= 0 && i < points.length; i += step) {\n const dx = points[i] - waypoint.x, dy = points[i + 1] - waypoint.y\n if (Math.abs(dx) <= POLYLINE_EPSILON && Math.abs(dy) <= POLYLINE_EPSILON) continue\n\n if (Math.abs(dy) <= POLYLINE_EPSILON) approachPort = dx > 0 ? 0 : 1\n else if (Math.abs(dx) <= POLYLINE_EPSILON) approachPort = dy > 0 ? 2 : 3\n break\n }\n\n const side = getBestPolyline(point, waypoint, direction, undefined, bounds, otherBounds, clearance, approachPort)\n side.length -= 2\n return side\n}\n\nfunction drawPolylineEditPath(path: number[], startPoint: IPointData, endPoint: IPointData, startDirection: IDirection, endDirection: IDirection, startBounds: IBoundsData | undefined, endBounds: IBoundsData | undefined, clearance: number, points: number[]): boolean {\n const length = points.length, last = length - 2\n if (length % 2) return false\n for (let i = 0; i < length; i++) if (!Number.isFinite(points[i])) return false\n\n const start = getPolylineEditSide(startPoint, { x: points[0], y: points[1] }, startDirection, startBounds, endBounds, clearance, points, 0, 2)\n const end = getPolylineEditSide(endPoint, { x: points[last], y: points[last + 1] }, endDirection, endBounds, startBounds, clearance, points, last, -2)\n\n // 只拼接两端生成的接线,中间顶点按原坐标写入\n const first = start.length ? start : points\n moveTo(path, first[0], first[1])\n for (let i = 2; i < start.length; i += 2) lineTo(path, start[i], start[i + 1])\n for (let i = start.length ? 0 : 2; i < length; i += 2) lineTo(path, points[i], points[i + 1])\n for (let i = end.length - 2; i >= 0; i -= 2) lineTo(path, end[i], end[i + 1])\n return true\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 if (points?.length) return drawPolylineEditPath(path, startPoint, endPoint, startDirection, endDirection, startBounds, endBounds, clearance, points)\n\n const best = getBestPolyline(startPoint, endPoint, startDirection, endDirection, startBounds, endBounds, clearance)\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","POLYLINE_TURN_WEIGHT","getPolylinePorts","targetBounds","data","getPolylineDirectionIndex","sign","cx","cy","deltaX","deltaY","xPort","yPort","getPolylineExit","port","clearance","isPolylinePointBlocked","left","right","top","bottom","isPolylineSegmentBlocked","x1","y1","x2","y2","max","min","addPolylineBoundsCoordinates","xs","ys","margin","push","sortPolylineCoordinates","values","sort","write","getPolylineCoordinateIndex","isPolylinePortAligned","stub","offset","isPolylineMidpointAligned","axis","isPolylineApproachAligned","points","last","getPolylineRoute","result","startPoint","endPoint","startPort","endPort","startBounds","endBounds","strictPorts","approachPort","startExit","endExit","sx","sy","ex","ey","startStub","endStub","Infinity","startAxis","getPolylineMidpointAxis","mx","my","turns","previousAxis","getPolylineScore","score","midpointAxis","nx","ny","startXIndex","startYIndex","endXIndex","endYIndex","startNode","endNode","total","distance","Float64Array","previous","Int32Array","visited","Uint8Array","fill","startState","pending","turnCost","preferredCoordinate","currentState","currentNode","currentAxis","currentX","currentY","currentDistance","relax","nextXIndex","nextYIndex","nextX","nextY","nextNode","nextState","cost","turnCoordinate","POLYLINE_X","bestState","index","state","next","pop","floor","xIndex","yIndex","POLYLINE_Y","reverse","findPolylineGridRoute","getBestPolyline","startDirection","endDirection","startPorts","endPorts","candidate","best","bestScore","pass","gap","j","start","end","horizontal","crosses","count","xy","yx","getPolylineFallback","read","vertical","simplifyPolyline","getPolylineEditSide","waypoint","otherBounds","step","side","drawPolyline","Number","isFinite","first","drawPolylineEditPath","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","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","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","tension","lastOutX","lastOutY","sqrt","bx","by","prev","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]}
|
package/dist/linker.min.js
CHANGED
|
@@ -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,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);
|
|
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 u=Math.abs(a)*r,c=Math.abs(h)*o;if(u>c)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 u=r[e],c=u.x*i,d=u.y*o,l=t.x-c,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:u}=e.AroundHelper,{moveTo:c,lineTo:d}=e.PathCommandDataHelper,l=.001,f=1.5;function p(t,e,n,i,o){const r=u[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)],s=Math.sign(r.x-.5),a=Math.sign(r.y-.5),h=i?i.x+i.width/2:e.x,c=i?i.y+i.height/2:e.y,d=(o?o.x+o.width/2:n.x)-h,l=(o?o.y+o.height/2:n.y)-c,f=(s||(d>=0?1:-1))>0?1:0,p=(a||(l>=0?1:-1))>0?3:2;return s&&!a?[f]:a&&!s?[p]:Math.abs(d)>=Math.abs(l)?[f,p]:[p,f]}function y(t,e,n,i){const o=1&n?1:-1;if(0===n>>1){return{x:(e?e.x+(o>0?e.width:0):t.x)+o*i,y:t.y}}const r=e?e.y+(o>0?e.height:0):t.y;return{x:t.x,y:r+o*i}}function g(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 x(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,u=o.y+o.height+r;return Math.abs(e-i)<=l?e>h+l&&e<u-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),u-l)}function b(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 M(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 P(t,e,n,i){const o=t>>1?i:n,r=1&t?1:-1;return Math.abs(o)<=l?e>l:o*r>0}function k(t,e,n,i,o){return void 0===t||(0===o&&Math.abs(n/2)>l?P(t,e,n,0):1===o&&Math.abs(i/2)>l?P(t,e,0,i):Math.abs(n)<=l&&Math.abs(i)<=l||P(t,e,n,i))}function L(t,e){if(void 0===e)return!0;const n=t.length-2,i=t[n],o=t[n+1];for(let r=n-2;r>=0;r-=2){const n=t[r]-i,s=t[r+1]-o;if(Math.abs(n)>l||Math.abs(s)>l)return P(e,1,n,s)}return!0}function N(t,e,n,i,o,r,s,a,h,u){const c=y(e,r,i,a),d=void 0===o?n:y(n,s,o,a),{x:p,y:N}=c,{x:v,y:C}=d,D=Math.abs(p-e.x)+Math.abs(N-e.y),_=Math.abs(v-n.x)+Math.abs(C-n.y);if(x(e.x,e.y,p,N,s,a)||x(n.x,n.y,v,C,r,a))return 1/0;if(void 0===o&&(g(v,C,r,a)||g(v,C,s,a)))return 1/0;const w=void 0===o?i>>1: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,p,N,v,C),B=v-p,F=C-N;if(t.length=0,t.push(e.x,e.y,p,N),(!h||k(i,D,B,F,w)&&k(o,_,-B,-F,w))&&k(u,1,-B,-F,w)){const e=(p+v)/2,i=(N+C)/2;0===w?t.push(e,N,e,C):t.push(p,i,v,i),t.push(v,C,n.x,n.y);for(let e=4;e<t.length-2;e+=2)if(x(t[e-2],t[e-1],t[e],t[e+1],r,a)||x(t[e-2],t[e-1],t[e],t[e+1],s,a)){t.length=4;break}if(t.length>4&&L(t,u))return function(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}(t,a);t.length=4}const H=function(t,e,n,i,o,r,s,a,h,u,c,d,p){const{x:y,y:k}=e,{x:L,y:N}=n,v=2*Math.max(a,4),C=[y,L,(y+L)/2],D=[k,N,(k+N)/2];b(C,D,r,a,v),b(C,D,s,a,v),C.push(Math.min(...C)-2*v,Math.max(...C)+2*v),D.push(Math.min(...D)-2*v,Math.max(...D)+2*v),M(C),M(D);const _=C.length,w=D.length,B=m(C,y),F=m(D,k),H=m(C,L),E=m(D,N);if(B<0||F<0||H<0||E<0)return 1/0;const I=F*_+B,T=E*_+H,O=_*w*3,S=new Float64Array(O),R=new Int32Array(O),A=new Uint8Array(O);S.fill(1/0),R.fill(-1);const W=3*I;S[W]=0;const j=[W],q=Math.max(4,a*f),U=0===h?(y+L)/2:(k+N)/2;let z=-1,X=-1,Y=0,Z=0,G=0,J=0;const K=(t,e,n)=>{const h=C[t],f=D[e],y=e*_+t,b=h-Z,M=f-G;if(y===I)return;if(void 0!==p&&y===T&&!P(p,1,-b,-M))return;if(d&&(z===W&&!P(i,u,b,M)||void 0!==o&&y===T&&!P(o,c,-b,-M)))return;if(g(h,f,r,a)||g(h,f,s,a)||x(Z,G,h,f,r,a)||x(Z,G,h,f,s,a))return;const m=3*y+n;if(A[m])return;let k=J+(Math.abs(b)+Math.abs(M));if(Y&&Y!==n){k+=q;const t=1===Y?Z:G;Math.abs(t-U)>l&&(k+=2*q)}k<S[m]&&(S[m]===1/0&&j.push(m),S[m]=k,R[m]=z)};let Q=-1;for(;j.length;){let t=0,e=j[0];for(let n=1;n<j.length;n++){const i=j[n];(S[i]<S[e]||S[i]===S[e]&&i<e)&&(t=n,e=i)}if(j[t]=j[j.length-1],j.pop(),z=e,X=Math.floor(e/3),Y=e%3,J=S[e],A[e]=1,X===T){Q=e;break}const n=X%_,i=Math.floor(X/_);Z=C[n],G=D[i],n>0&&K(n-1,i,1),n<_-1&&K(n+1,i,1),i>0&&K(n,i-1,2),i<w-1&&K(n,i+1,2)}if(Q<0)return 1/0;const V=[];let $=Q;for(;$>=0;){const t=Math.floor($/3);if(V.push(C[t%_],D[Math.floor(t/_)]),$===W)break;$=R[$]}if($!==W)return 1/0;for(let e=V.length-4;e>=0;e-=2)t.push(V[e],V[e+1]);return S[Q]}(t,c,d,i,o,r,s,a,w,D,_,h,u);return H===1/0?H:(t.push(n.x,n.y),L(t,u)?H+D+_:1/0)}function v(t,e,n,i,o,r,s,a){const h=p(n,t,e,o,void 0===i?void 0:r),u=void 0===i?[void 0]:p(i,e,t,r,o);let c=[],d=[],f=1/0;for(let n=s?0:1;n<3&&!d.length;n++){const i=n?0:s;for(let s=0;s<h.length;s++)for(let l=0;l<u.length;l++){const p=N(c,t,e,h[s],u[l],o,r,i,n<2,a);if(p<f){f=p;const t=d;d=c,c=t}}}if(!d.length)return function(t,e,n,i,o){const{x:r,y:s}=t,{x:a,y:h}=e;if(r===a||s===h)return[r,s,a,h];const u=!(n>>1),c=(t,e)=>{let n=0;return x(r,s,t,e,i,0)&&n++,x(t,e,a,h,i,0)&&n++,x(r,s,t,e,o,0)&&n++,x(t,e,a,h,o,0)&&n++,n},d=c(a,s),l=c(r,h);return d<l||d===l&&u?[r,s,a,s,a,h]:[r,s,r,h,a,h]}(t,e,h[0],o,r);!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,u=Math.abs(n-r)<=l&&Math.abs(r-i)<=l&&(s-a)*(o-s)>=0;if(h||u){t[e-2]=i,t[e-1]=o;continue}}t[e++]=i,t[e++]=o}}t.length=e}(d);const y=d.length-2;return d[y]===e.x&&d[y+1]===e.y||d.push(e.x,e.y),d}function C(t,e,n,i,o,r,s,a,h){if(t.x===e.x&&t.y===e.y)return[];let u;for(let t=a+h;t>=0&&t<s.length;t+=h){const n=s[t]-e.x,i=s[t+1]-e.y;if(!(Math.abs(n)<=l&&Math.abs(i)<=l)){Math.abs(i)<=l?u=n>0?0:1:Math.abs(n)<=l&&(u=i>0?2:3);break}}const c=v(t,e,n,void 0,i,o,r,u);return c.length-=2,c}function D(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;if(a=Number.isFinite(a)?Math.max(0,a):8,null==h?void 0:h.length)return function(t,e,n,i,o,r,s,a,h){const u=h.length,l=u-2;if(u%2)return!1;for(let t=0;t<u;t++)if(!Number.isFinite(h[t]))return!1;const f=C(e,{x:h[0],y:h[1]},i,r,s,a,h,0,2),p=C(n,{x:h[l],y:h[l+1]},o,s,r,a,h,l,-2),y=f.length?f:h;c(t,y[0],y[1]);for(let e=2;e<f.length;e+=2)d(t,f[e],f[e+1]);for(let e=f.length?0:2;e<u;e+=2)d(t,h[e],h[e+1]);for(let e=p.length-2;e>=0;e-=2)d(t,p[e],p[e+1]);return!0}(t,e,n,i,o,r,s,a,h);const u=v(e,n,i,o,r,s,a);c(t,u[0],u[1]);for(let e=2;e<u.length;e+=2)d(t,u[e],u[e+1]);return!0}const{moveTo:_,lineTo:w,bezierCurveTo:B,drawPoints:F}=e.PathCommandDataHelper,{isEmpty:H,getPoint:E}=e.BoundsHelper,{getDistance:I}=e.PointHelper,{getCtrlPoint:T,getDirectionForFromPoint:O,isOppositeDirection:S}=a,{max:R,min:A,abs:W}=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,u="end"===t?a||i:s||n;if(h){const{worldRenderBounds:t}=h;return H(t)&&e.LeafHelper.updateBounds(h),E(h.worldRenderBounds,"center")}return u&&e.isObject(u.point)&&this.getWorldPointByLocal(u.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=O(o,r)),n.auto=!0}!a&&e.isString(h)&&(a=h),n.direction=a;const u="end"===t?this.endNode:this.startNode;let c;if(u){if(h||(h=a),h){const{boxBounds:t}=u;H(t)&&e.LeafHelper.updateBounds(u),c=E(t,h,!0),u.getWorldPointByBox(c,this,!1,!0),"polyline"===o&&(n.bounds=u.getBounds("box",this.parent))}}else e.isObject(h)&&(c=h);if(c&&s){const t=Object.assign({},s);s.x||(t.x=0),s.y||(t.y=0),u&&u.getWorldPoint(t,this,!0,!0),e.PointHelper.move(c,t)}n.point=c,"end"===t?this.endData=c&&n:this.startData=c&&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,u=r.point,c=o.direction,d=r.direction,l=8*this.__.strokeWidth;switch(t.lineType){case"straight":_(n,h.x,h.y),w(n,u.x,u.y);break;case"polyline":D(n,h,u,c,d,o.bounds,r.bounds,l,i&&e.PointHelper.toNumberPoints(t.points));break;default:const f={x:W((h.x-u.x)/2),y:W((h.y-u.y)/2)};let p;if(this.__.__useArrow){const t=A(I(h,u)/(25*l),1);p=R(l*t*12,3*l)}else p=2*l;if(d&&S(c,d)&&c===O(h,u)&&(p=2*l),f.x=R(p,f.x),f.y=R(p,f.y),i){p*=.6;const i=e.PointHelper.toNumberPoints(t.points);if(F(n,[h.x,h.y,...i,u.x,u.y],t.curve,!1,t),c){const t=n[4],e=n[5];f.x=R(p,W(t-h.x)),f.y=R(p,W(e-h.y));const i=T(this,s,h,c,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=R(p,W(t-u.x)),f.y=R(p,W(e-u.y));const i=T(this,a,u,d,f);n[o-4]=i.x,n[o-3]=i.y}else n[o-4]=u.x,n[o-3]=u.y}else{const t=c?T(this,s,h,c,f):h,e=d?T(this,a,u,d,f):u;_(n,h.x,h.y),B(n,t.x,t.y,e.x,e.y,u.x,u.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,u="edge"===h||!h,c="four"===h,d="free"===h;if(!("auto"===h))if(c)o.point=a.getDirection(r,s,c);else if(o.direction=a.getDirection(r,s,u),o.point=a.getPointDirection(r,s,u)||o.direction,o.point===o.direction&&delete o.direction,d||u){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(u&&(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:j}=n.PointHelper,{M:q,L:U,C:z,Z:X}=n.PathCommandMap;return e.Plugin.add("linker"),e.registerPointsCurve("C",function(t,e,n,i){const o=j(e),r=o.length>>1;if(r<2)return;if(t.push(q,o[0],o[1]),!n||r<3){for(let e=1;e<r;e++)t.push(U,o[2*e],o[2*e+1]);return void(i&&t.push(X))}let s=!0===n?.5:n;s<0?s=0:s>1&&(s=1);const a=i?r:r-1;let h=o[0],u=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,u=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,d=n+1===r?0:n+1;let l=o[2*c]-i,f=o[2*c+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 u=Math.sqrt(Math.sqrt(Math.max(0,1-h*h)));u<.15&&(u=.15);let c=g*s*u,d=x*s*u;const k=.5*Math.min(g||x,x||g);c>k&&(c=k),d>k&&(d=k),b=i-o*c,M=a-r*c,m=i+o*d,P=a+r*d}t.push(z,h,u,b,M,i,a),h=m,u=P}i&&t.push(X)}),t.LinkerData=o,t}({},LeaferUI,LeaferUI);
|
|
2
2
|
//# sourceMappingURL=linker.min.js.map
|