From 218b1b59228003e768c1bdb65c02f50204ec8fcc Mon Sep 17 00:00:00 2001 From: Yuan Date: Tue, 12 Dec 2023 15:29:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B5=8B=E8=AF=95=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintignore | 7 - .eslintrc | 21 + .eslintrc.js | 89 - .vscode/extensions.json | 15 - .vscode/settings.json | 16 - index.html | 21 - lib/index.js | 8051 +++++++++++++++++ package.json | 43 +- postcss.config.js | 27 - public/favicon.ico | Bin 64483 -> 0 bytes public/icons/favicon-128x128.png | Bin 12324 -> 0 bytes public/icons/favicon-16x16.png | Bin 859 -> 0 bytes public/icons/favicon-32x32.png | Bin 2039 -> 0 bytes public/icons/favicon-96x96.png | Bin 9643 -> 0 bytes quasar.config.js | 208 - rollup.config.ts | 18 + scripts/proto.cjs | 95 - src/App.vue | 7 - src/app/index.ts | 0 src/assets/quasar-logo-vertical.svg | 15 - src/boot/.gitkeep | 0 src/boot/@pixi/graphics-extras.ts | 7 - src/boot/axios.ts | 111 - src/components/EssentialLink.vue | 34 - src/components/ExampleComponent.vue | 37 - src/components/draw-app/DrawProperties.vue | 92 - .../draw-app/properties/CanvasProperty.vue | 74 - .../draw-app/properties/IscsFanProperty.vue | 42 - .../draw-app/properties/LinkProperty.vue | 103 - .../draw-app/properties/PlatformProperty.vue | 112 - .../draw-app/properties/RectProperty.vue | 74 - .../draw-app/properties/SignalProperty.vue | 62 - .../draw-app/properties/StationProperty.vue | 200 - .../draw-app/properties/TrainProperty.vue | 198 - .../draw-app/templates/LinkTemplate.vue | 96 - .../draw-app/templates/PlatformTemplate.vue | 76 - .../draw-app/templates/RectTemplate.vue | 76 - .../draw-app/templates/StationTemplate.vue | 70 - .../draw-app/templates/TrainTemplate.vue | 69 - src/components/models.ts | 8 - src/css/app.scss | 1 - src/css/quasar.variables.scss | 25 - src/env.d.ts | 9 - src/examples/app/api/ApiCommon.ts | 42 - src/examples/app/api/UserApi.ts | 77 - .../protoc-22.2/bin/linux-x86_64/protoc | Bin 7868336 -> 0 bytes .../protoc-22.2/bin/win64/protoc.exe | Bin 10064368 -> 0 bytes .../include/google/protobuf/any.proto | 161 - .../include/google/protobuf/api.proto | 207 - .../google/protobuf/compiler/plugin.proto | 180 - .../include/google/protobuf/descriptor.proto | 975 -- .../include/google/protobuf/duration.proto | 115 - .../include/google/protobuf/empty.proto | 51 - .../include/google/protobuf/field_mask.proto | 245 - .../google/protobuf/source_context.proto | 48 - .../include/google/protobuf/struct.proto | 95 - .../include/google/protobuf/timestamp.proto | 144 - .../include/google/protobuf/type.proto | 187 - .../include/google/protobuf/wrappers.proto | 123 - .../app/app_message/protoc-22.2/readme.txt | 12 - .../protos/draw_data_storage.proto | 134 - .../app_message/protos/graphic_states.proto | 14 - src/examples/app/configs/TokenManage.ts | 13 - src/examples/app/configs/UrlManage.ts | 16 - src/examples/app/graphics/GraphicDataBase.ts | 141 - .../app/graphics/IscsFanInteraction.ts | 72 - src/examples/app/graphics/LinkInteraction.ts | 77 - .../app/graphics/PlatformInteraction.ts | 88 - src/examples/app/graphics/RectInteraction.ts | 77 - .../app/graphics/SignalInteraction.ts | 37 - .../app/graphics/StationInteraction.ts | 92 - src/examples/app/graphics/TrainInteraction.ts | 92 - src/examples/app/index.ts | 342 - src/examples/app/protos/draw_data_storage.ts | 2425 ----- src/examples/app/protos/graphic_states.ts | 191 - src/layouts/DrawLayout.vue | 236 - src/pages/ErrorNotFound.vue | 27 - src/pages/IndexPage.vue | 42 - src/pages/UserLogin.vue | 93 - src/pages/UserRegister.vue | 97 - src/quasar.d.ts | 9 - src/router/index.ts | 36 - src/router/routes.ts | 30 - src/shims-vue.d.ts | 10 - src/stores/draw-store.ts | 97 - src/stores/example-store.ts | 15 - src/stores/index.ts | 32 - src/stores/store-flag.d.ts | 10 - tsconfig.json | 21 +- yarn.lock | 3330 ++----- 90 files changed, 8865 insertions(+), 11902 deletions(-) delete mode 100644 .eslintignore create mode 100644 .eslintrc delete mode 100644 .eslintrc.js delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/settings.json delete mode 100644 index.html create mode 100644 lib/index.js delete mode 100644 postcss.config.js delete mode 100644 public/favicon.ico delete mode 100644 public/icons/favicon-128x128.png delete mode 100644 public/icons/favicon-16x16.png delete mode 100644 public/icons/favicon-32x32.png delete mode 100644 public/icons/favicon-96x96.png delete mode 100644 quasar.config.js create mode 100644 rollup.config.ts delete mode 100644 scripts/proto.cjs delete mode 100644 src/App.vue delete mode 100644 src/app/index.ts delete mode 100644 src/assets/quasar-logo-vertical.svg delete mode 100644 src/boot/.gitkeep delete mode 100644 src/boot/@pixi/graphics-extras.ts delete mode 100644 src/boot/axios.ts delete mode 100644 src/components/EssentialLink.vue delete mode 100644 src/components/ExampleComponent.vue delete mode 100644 src/components/draw-app/DrawProperties.vue delete mode 100644 src/components/draw-app/properties/CanvasProperty.vue delete mode 100644 src/components/draw-app/properties/IscsFanProperty.vue delete mode 100644 src/components/draw-app/properties/LinkProperty.vue delete mode 100644 src/components/draw-app/properties/PlatformProperty.vue delete mode 100644 src/components/draw-app/properties/RectProperty.vue delete mode 100644 src/components/draw-app/properties/SignalProperty.vue delete mode 100644 src/components/draw-app/properties/StationProperty.vue delete mode 100644 src/components/draw-app/properties/TrainProperty.vue delete mode 100644 src/components/draw-app/templates/LinkTemplate.vue delete mode 100644 src/components/draw-app/templates/PlatformTemplate.vue delete mode 100644 src/components/draw-app/templates/RectTemplate.vue delete mode 100644 src/components/draw-app/templates/StationTemplate.vue delete mode 100644 src/components/draw-app/templates/TrainTemplate.vue delete mode 100644 src/components/models.ts delete mode 100644 src/css/app.scss delete mode 100644 src/css/quasar.variables.scss delete mode 100644 src/env.d.ts delete mode 100644 src/examples/app/api/ApiCommon.ts delete mode 100644 src/examples/app/api/UserApi.ts delete mode 100755 src/examples/app/app_message/protoc-22.2/bin/linux-x86_64/protoc delete mode 100644 src/examples/app/app_message/protoc-22.2/bin/win64/protoc.exe delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/any.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/api.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/compiler/plugin.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/descriptor.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/duration.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/empty.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/field_mask.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/source_context.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/struct.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/timestamp.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/type.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/include/google/protobuf/wrappers.proto delete mode 100644 src/examples/app/app_message/protoc-22.2/readme.txt delete mode 100644 src/examples/app/app_message/protos/draw_data_storage.proto delete mode 100644 src/examples/app/app_message/protos/graphic_states.proto delete mode 100644 src/examples/app/configs/TokenManage.ts delete mode 100644 src/examples/app/configs/UrlManage.ts delete mode 100644 src/examples/app/graphics/GraphicDataBase.ts delete mode 100644 src/examples/app/graphics/IscsFanInteraction.ts delete mode 100644 src/examples/app/graphics/LinkInteraction.ts delete mode 100644 src/examples/app/graphics/PlatformInteraction.ts delete mode 100644 src/examples/app/graphics/RectInteraction.ts delete mode 100644 src/examples/app/graphics/SignalInteraction.ts delete mode 100644 src/examples/app/graphics/StationInteraction.ts delete mode 100644 src/examples/app/graphics/TrainInteraction.ts delete mode 100644 src/examples/app/index.ts delete mode 100644 src/examples/app/protos/draw_data_storage.ts delete mode 100644 src/examples/app/protos/graphic_states.ts delete mode 100644 src/layouts/DrawLayout.vue delete mode 100644 src/pages/ErrorNotFound.vue delete mode 100644 src/pages/IndexPage.vue delete mode 100644 src/pages/UserLogin.vue delete mode 100644 src/pages/UserRegister.vue delete mode 100644 src/quasar.d.ts delete mode 100644 src/router/index.ts delete mode 100644 src/router/routes.ts delete mode 100644 src/shims-vue.d.ts delete mode 100644 src/stores/draw-store.ts delete mode 100644 src/stores/example-store.ts delete mode 100644 src/stores/index.ts delete mode 100644 src/stores/store-flag.d.ts diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 7b59e09..0000000 --- a/.eslintignore +++ /dev/null @@ -1,7 +0,0 @@ -/dist -/src-capacitor -/src-cordova -/.quasar -/node_modules -.eslintrc.js -/src-ssr diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..078ede2 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,21 @@ +{ + "root": true, + "env": { + "browser": true, + "es2021": true + }, + "plugins": ["@typescript-eslint", "prettier"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + "prettier/prettier": "error" + } +} diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 765228b..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,89 +0,0 @@ -module.exports = { - // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy - // This option interrupts the configuration hierarchy at this file - // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos) - root: true, - - // https://eslint.vuejs.org/user-guide/#how-to-use-a-custom-parser - // Must use parserOptions instead of "parser" to allow vue-eslint-parser to keep working - // `parser: 'vue-eslint-parser'` is already included with any 'plugin:vue/**' config and should be omitted - parserOptions: { - parser: require.resolve('@typescript-eslint/parser'), - extraFileExtensions: ['.vue'], - }, - - env: { - browser: true, - es2021: true, - node: true, - 'vue/setup-compiler-macros': true, - }, - - // Rules order is important, please avoid shuffling them - extends: [ - // Base ESLint recommended rules - // 'eslint:recommended', - - // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage - // ESLint typescript rules - 'plugin:@typescript-eslint/recommended', - - // Uncomment any of the lines below to choose desired strictness, - // but leave only one uncommented! - // See https://eslint.vuejs.org/rules/#available-rules - 'plugin:vue/vue3-essential', // Priority A: Essential (Error Prevention) - // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability) - // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead) - - // https://github.com/prettier/eslint-config-prettier#installation - // usage with Prettier, provided by 'eslint-config-prettier'. - 'prettier', - ], - - plugins: [ - // required to apply rules which need type information - '@typescript-eslint', - - // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files - // required to lint *.vue files - 'vue', - - // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674 - // Prettier has not been included as plugin to avoid performance impact - // add it as an extension for your IDE - ], - - globals: { - ga: 'readonly', // Google Analytics - cordova: 'readonly', - __statics: 'readonly', - __QUASAR_SSR__: 'readonly', - __QUASAR_SSR_SERVER__: 'readonly', - __QUASAR_SSR_CLIENT__: 'readonly', - __QUASAR_SSR_PWA__: 'readonly', - process: 'readonly', - Capacitor: 'readonly', - chrome: 'readonly', - }, - - // add your custom rules here - rules: { - 'prefer-promise-reject-errors': 'off', - - quotes: ['warn', 'single', { avoidEscape: true }], - - // this rule, if on, would require explicit return type on the `render` function - '@typescript-eslint/explicit-function-return-type': 'off', - - // in plain CommonJS modules, you can't use `import foo = require('foo')` to pass this rule, so it has to be disabled - '@typescript-eslint/no-var-requires': 'off', - '@typescript-eslint/no-namespace': 'off', - - // The core 'no-unused-vars' rules (in the eslint:recommended ruleset) - // does not work with type definitions - 'no-unused-vars': 'off', - - // allow debugger during development only - 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', - }, -}; diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index fe38802..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "recommendations": [ - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "editorconfig.editorconfig", - "vue.volar", - "wayou.vscode-todo-highlight" - ], - "unwantedRecommendations": [ - "octref.vetur", - "hookyqr.beautify", - "dbaeumer.jshint", - "ms-vscode.vscode-typescript-tslint-plugin" - ] -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 746cf57..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "editor.bracketPairColorization.enabled": true, - "editor.guides.bracketPairs": true, - "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.codeActionsOnSave": [ - "source.fixAll.eslint" - ], - "eslint.validate": [ - "javascript", - "javascriptreact", - "typescript", - "vue" - ], - "typescript.tsdk": "node_modules/typescript/lib" -} \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index 3c8c78f..0000000 --- a/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - <%= productName %> - - - - - - - - - - - - - - - - - diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..96a33c2 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,8051 @@ +'use strict'; + +var pixi_js = require('pixi.js'); +var EventEmitter = require('eventemitter3'); +var pixiViewport = require('pixi-viewport'); +var stompjs = require('@stomp/stompjs'); +var mqtt = require('mqtt'); + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + 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; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; + +/** + * ID生成器 + */ +var IdGenerator = /** @class */ (function () { + function IdGenerator(type) { + this.serial = 0; + this.type = type; + } + IdGenerator.prototype.next = function () { + ++this.serial; + // console.log(this.getType() + this.serial) + return this.getType() + this.serial; + }; + IdGenerator.prototype.getType = function () { + return this.type; + }; + IdGenerator.prototype.initSerial = function (serial) { + // console.log(serial) + this.serial = serial; + }; + return IdGenerator; +}()); +var GraphicIdGenerator = new IdGenerator(''); + +exports.InteractionPluginType = void 0; +(function (InteractionPluginType) { + InteractionPluginType["App"] = "app"; + InteractionPluginType["Graphic"] = "graphic"; + InteractionPluginType["Other"] = "other"; +})(exports.InteractionPluginType || (exports.InteractionPluginType = {})); +var InteractionPluginBase = /** @class */ (function () { + function InteractionPluginBase(app, name, type) { + this._type = type; + this.app = app; + this.name = name; + this._pause = true; + app.registerInteractionPlugin(this); + } + /** + * 恢复 + */ + InteractionPluginBase.prototype.resume = function () { + this.bind(); + this._pause = false; + this.app.emit('interaction-plugin-resume', this); + }; + /** + * 停止 + */ + InteractionPluginBase.prototype.pause = function () { + this.unbind(); + this._pause = true; + this.app.emit('interaction-plugin-pause', this); + }; + /** + * 是否生效 + */ + InteractionPluginBase.prototype.isActive = function () { + return !this._pause; + }; + InteractionPluginBase.prototype.isGraphicPlugin = function () { + return this._type === exports.InteractionPluginType.Graphic; + }; + InteractionPluginBase.prototype.isAppPlugin = function () { + return this._type === exports.InteractionPluginType.App; + }; + InteractionPluginBase.prototype.isOtherPlugin = function () { + return this._type === exports.InteractionPluginType.Other; + }; + return InteractionPluginBase; +}()); +var OtherInteractionPlugin = /** @class */ (function (_super) { + __extends(OtherInteractionPlugin, _super); + function OtherInteractionPlugin(app, name) { + return _super.call(this, app, name, exports.InteractionPluginType.Other) || this; + } + return OtherInteractionPlugin; +}(InteractionPluginBase)); +var AppDragEvent = /** @class */ (function () { + function AppDragEvent(app, type, target, original, start) { + this.app = app; + this.type = type; + this.target = target; + this.original = original; + this.start = start; + } + Object.defineProperty(AppDragEvent.prototype, "isMouse", { + get: function () { + return this.original.pointerType === 'mouse'; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(AppDragEvent.prototype, "isLeftButton", { + get: function () { + return (this.isMouse && + ((this.original.button === -1 && this.original.buttons === 1) || + (this.original.button === 0 && this.original.buttons === 0))); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(AppDragEvent.prototype, "isRightButton", { + get: function () { + return (this.isMouse && + ((this.original.button === -1 && this.original.buttons === 2) || + (this.original.button === 2 && this.original.buttons === 0))); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(AppDragEvent.prototype, "isMiddleButton", { + get: function () { + return (this.isMouse && + ((this.original.button === -1 && this.original.buttons === 4) || + (this.original.button === 1 && this.original.buttons === 0))); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(AppDragEvent.prototype, "isTouch", { + get: function () { + return this.original.pointerType === 'touch'; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(AppDragEvent.prototype, "end", { + /** + * 终点坐标(画布坐标) + */ + get: function () { + return this.app.toCanvasCoordinates(this.original.global); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(AppDragEvent.prototype, "dx", { + get: function () { + var move = this.original.movement; + return move.x / this.app.viewport.scaled; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(AppDragEvent.prototype, "dy", { + get: function () { + var move = this.original.movement; + return move.y / this.app.viewport.scaled; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(AppDragEvent.prototype, "dsx", { + get: function () { + return this.end.x - this.start.x; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(AppDragEvent.prototype, "dsy", { + get: function () { + return this.end.y - this.start.y; + }, + enumerable: false, + configurable: true + }); + /** + * 转换为目标对象的位移距离 + */ + AppDragEvent.prototype.toTargetShiftLen = function (target) { + var sl = target.canvasToLocalPoint(this.start); + var el = target.canvasToLocalPoint(this.end); + return { dx: el.x - sl.x, dy: el.y - sl.y }; + }; + return AppDragEvent; +}()); +/** + * 拖拽操作插件 + */ +var DragPlugin = /** @class */ (function (_super) { + __extends(DragPlugin, _super); + function DragPlugin(app) { + var _this = _super.call(this, app, DragPlugin.Name) || this; + _this.threshold = 3; + _this.target = null; + _this.start = null; + _this.startClientPoint = null; + _this.drag = false; + app.on('options-update', function (options) { + if (options.threshold !== undefined) { + _this.threshold = options.threshold; + } + }); + return _this; + } + DragPlugin.new = function (app) { + return new DragPlugin(app); + }; + DragPlugin.prototype.bind = function () { + var canvas = this.app.canvas; + canvas.on('pointerdown', this.onPointerDown, this); + }; + DragPlugin.prototype.unbind = function () { + var canvas = this.app.canvas; + canvas.off('pointerdown', this.onPointerDown, this); + canvas.off('pointerup', this.onPointerUp, this); + canvas.off('pointerupoutside', this.onPointerUp, this); + }; + DragPlugin.prototype.onPointerDown = function (e) { + this.target = e.target; + this.start = this.app.toCanvasCoordinates(e.global); + this.startClientPoint = e.global.clone(); + var canvas = this.app.canvas; + canvas.on('pointermove', this.onPointerMove, this); + canvas.on('pointerup', this.onPointerUp, this); + canvas.on('pointerupoutside', this.onPointerUp, this); + }; + DragPlugin.prototype.onPointerMove = function (e) { + if (this.start && this.startClientPoint) { + var current = e.global; + var sgp = this.startClientPoint; + var dragStart = Math.abs(current.x - sgp.x) > this.threshold || + Math.abs(current.y - sgp.y) > this.threshold; + if (this.target && this.start && !this.drag && dragStart) { + this.app.emit('drag_op_start', new AppDragEvent(this.app, 'start', this.target, e, this.start)); + this.drag = true; + } + // drag移动处理 + if (this.target && this.drag && this.start) { + // console.log('drag move', e.movement); + this.app.emit('drag_op_move', new AppDragEvent(this.app, 'move', this.target, e, this.start)); + } + } + }; + DragPlugin.prototype.onPointerUp = function (e) { + if (this.target && this.drag && this.start) { + // console.log('drag end'); + this.app.emit('drag_op_end', new AppDragEvent(this.app, 'end', this.target, e, this.start)); + } + else if (this.target && this.start && !this.drag) { + // this.target.emit('click', this.target); + var ade = new AppDragEvent(this.app, 'end', this.target, e, this.start); + var graphic = this.target.getGraphic(); + if (ade.isRightButton) { + this.target.emit('_rightclick', e); + if (graphic != null) { + graphic.emit('_rightclick', e); + } + } + else if (ade.isLeftButton) { + this.target.emit('_leftclick', e); + if (graphic != null) { + graphic.emit('_leftclick', e); + } + } + } + var canvas = this.app.canvas; + canvas.off('mousemove', this.onPointerMove, this); + canvas.off('mouseup', this.onPointerUp, this); + canvas.off('mouseupoutside', this.onPointerUp, this); + this.clearCache(); + }; + /** + * 清理缓存 + */ + DragPlugin.prototype.clearCache = function () { + this.drag = false; + this.start = null; + this.startClientPoint = null; + this.target = null; + }; + DragPlugin.Name = '__drag_operation_plugin'; + return DragPlugin; +}(OtherInteractionPlugin)); +/** + * 视口移动插件 + */ +var ViewportMovePlugin = /** @class */ (function (_super) { + __extends(ViewportMovePlugin, _super); + function ViewportMovePlugin(app) { + var _this = _super.call(this, app, ViewportMovePlugin.Name) || this; + _this.moveHandler = null; + _this.moveSpeedx = 0; + _this.moveSpeedy = 0; + return _this; + } + ViewportMovePlugin.new = function (app) { + return new ViewportMovePlugin(app); + }; + ViewportMovePlugin.prototype.pause = function () { + _super.prototype.pause.call(this); + this.stopMove(); + }; + ViewportMovePlugin.prototype.bind = function () { + this.app.canvas.on('pointermove', this.viewportMove, this); + }; + ViewportMovePlugin.prototype.unbind = function () { + this.app.canvas.off('pointermove', this.viewportMove, this); + }; + ViewportMovePlugin.prototype.startMove = function (moveSpeedx, moveSpeedy) { + var _this = this; + this.moveSpeedx = moveSpeedx; + this.moveSpeedy = moveSpeedy; + if (this.moveHandler == null) { + var viewport_1 = this.app.viewport; + this.moveHandler = setInterval(function () { + viewport_1.moveCorner(viewport_1.corner.x + _this.moveSpeedx, viewport_1.corner.y + _this.moveSpeedy); + }, ViewportMovePlugin.MoveInterval); + } + }; + ViewportMovePlugin.prototype.stopMove = function () { + if (this.moveHandler != null) { + clearInterval(this.moveHandler); + this.moveHandler = null; + this.app.canvas.cursor = 'auto'; + } + }; + ViewportMovePlugin.prototype.calculateBoundaryMoveSpeed = function (sp) { + var moveSpeedx = 0; + var moveSpeedy = 0; + var range = ViewportMovePlugin.TriggerRange; + var viewport = this.app.viewport; + if (sp.x < range) { + moveSpeedx = this.calculateMoveSpeed(sp.x - range); + } + else if (sp.x > viewport.screenWidth - range) { + moveSpeedx = this.calculateMoveSpeed(sp.x + range - viewport.screenWidth); + } + else { + moveSpeedx = 0; + } + if (sp.y < range) { + moveSpeedy = this.calculateMoveSpeed(sp.y - range); + } + else if (sp.y > viewport.screenHeight - range) { + moveSpeedy = this.calculateMoveSpeed(sp.y + range - viewport.screenHeight); + } + else { + moveSpeedy = 0; + } + return { moveSpeedx: moveSpeedx, moveSpeedy: moveSpeedy }; + }; + ViewportMovePlugin.prototype.calculateMoveSpeed = function (dd) { + return ((dd / ViewportMovePlugin.TriggerRange) * + ViewportMovePlugin.DefaultMoveSpeed); + }; + ViewportMovePlugin.prototype.viewportMove = function (e) { + var sp = e.global; + var _a = this.calculateBoundaryMoveSpeed(sp), moveSpeedx = _a.moveSpeedx, moveSpeedy = _a.moveSpeedy; + if (moveSpeedx == 0 && moveSpeedy == 0) { + this.app.canvas.cursor = 'auto'; + this.stopMove(); + } + else { + this.app.canvas.cursor = 'grab'; + this.startMove(moveSpeedx, moveSpeedy); + } + }; + ViewportMovePlugin.Name = '__viewport_move_plugin'; + ViewportMovePlugin.MoveInterval = 20; // 移动间隔,单位ms + ViewportMovePlugin.TriggerRange = 100; // 边界触发范围,单位px + ViewportMovePlugin.DefaultMoveSpeed = 200 / ViewportMovePlugin.MoveInterval; // 默认移动速度 + return ViewportMovePlugin; +}(OtherInteractionPlugin)); +/** + * 应用交互插件,同时只能生效一个 + */ +var AppInteractionPlugin = /** @class */ (function (_super) { + __extends(AppInteractionPlugin, _super); + function AppInteractionPlugin(name, app) { + return _super.call(this, app, name, exports.InteractionPluginType.App) || this; + } + /** + * 恢复,app交互插件同时只能生效一个 + */ + AppInteractionPlugin.prototype.resume = function () { + this.app.pauseAppInteractionPlugins(); + _super.prototype.resume.call(this); + }; + return AppInteractionPlugin; +}(InteractionPluginBase)); +/** + * 图形交互插件,可同时生效 + */ +var GraphicInteractionPlugin = /** @class */ (function () { + function GraphicInteractionPlugin(name, app) { + var _this = this; + this._type = exports.InteractionPluginType.Graphic; + this.app = app; + this.name = name; + this._pause = true; + app.registerInteractionPlugin(this); + this.resume(); + // 新增的图形对象绑定 + this.app.on('graphicstored', function (g) { + if (_this.isActive()) { + _this.binds(_this.filter(g)); + } + }); + this.app.on('graphicdeleted', function (g) { + if (_this.isActive()) { + _this.unbinds(_this.filter(g)); + } + }); + } + GraphicInteractionPlugin.prototype.isActive = function () { + return !this._pause; + }; + GraphicInteractionPlugin.prototype.isAppPlugin = function () { + return false; + }; + GraphicInteractionPlugin.prototype.isOtherPlugin = function () { + return false; + }; + GraphicInteractionPlugin.prototype.isGraphicPlugin = function () { + return true; + }; + GraphicInteractionPlugin.prototype.resume = function () { + var list = this.filter.apply(this, this.app.queryStore.getAllGraphics()); + this.binds(list); + this._pause = false; + this.app.emit('interaction-plugin-resume', this); + }; + GraphicInteractionPlugin.prototype.pause = function () { + var list = this.filter.apply(this, this.app.queryStore.getAllGraphics()); + this.unbinds(list); + this._pause = true; + this.app.emit('interaction-plugin-pause', this); + }; + GraphicInteractionPlugin.prototype.binds = function (list) { + var _this = this; + if (list) { + list.forEach(function (g) { return _this.bind(g); }); + } + }; + GraphicInteractionPlugin.prototype.unbinds = function (list) { + var _this = this; + if (list) { + list.forEach(function (g) { return _this.unbind(g); }); + } + }; + return GraphicInteractionPlugin; +}()); + +var CompleteMouseToolOptions = /** @class */ (function () { + function CompleteMouseToolOptions() { + this.boxSelect = true; + this.viewportDrag = true; + this.wheelZoom = true; + this.viewportDragLeft = false; + } + CompleteMouseToolOptions.prototype.update = function (options) { + if (options.boxSelect != undefined) { + this.boxSelect = options.boxSelect; + } + if (options.viewportDrag != undefined) { + this.viewportDrag = options.viewportDrag; + } + if (options.viewportDragLeft != undefined) { + this.viewportDragLeft = options.viewportDragLeft; + } + if (options.wheelZoom != undefined) { + this.wheelZoom = options.wheelZoom; + } + this.selectFilter = options.selectFilter; + }; + return CompleteMouseToolOptions; +}()); +/** + * 通用交互工具 + */ +var CommonMouseTool = /** @class */ (function (_super) { + __extends(CommonMouseTool, _super); + function CommonMouseTool(scene) { + var _this = _super.call(this, CommonMouseTool.Name, scene) || this; + _this.leftDownTarget = null; + _this.drag = false; + _this.graphicSelect = false; + _this.rightTarget = null; + _this.options = new CompleteMouseToolOptions(); + _this.box = new pixi_js.Graphics(); + _this.box.name = CommonMouseTool.SelectBox; + _this.box.visible = false; + _this.app.canvas.addAssistantAppends(_this.box); + scene.on('options-update', function (options) { + if (options.mouseToolOptions) { + _this.options.update(options.mouseToolOptions); + if (_this.isActive()) { + _this.pause(); + _this.resume(); + } + } + }); + return _this; + } + CommonMouseTool.new = function (app) { + return new CommonMouseTool(app); + }; + CommonMouseTool.prototype.bind = function () { + var canvas = this.app.canvas; + canvas.on('mousedown', this.onMouseDown, this); + canvas.on('mouseup', this.onMouseUp, this); + this.app.on('drag_op_start', this.onDragStart, this); + this.app.on('drag_op_move', this.onDragMove, this); + this.app.on('drag_op_end', this.onDragEnd, this); + if (this.options.viewportDrag) { + if (this.options.viewportDragLeft) { + this.app.viewport.drag({ + mouseButtons: 'left', + }); + canvas.on('mousedown', this.setLeftCursor, this); + canvas.on('mouseup', this.resumeLeftCursor, this); + canvas.on('mouseupoutside', this.resumeLeftCursor, this); + } + else { + this.app.viewport.drag({ + mouseButtons: 'right', + }); + canvas.on('rightdown', this.setCursor, this); + canvas.on('rightup', this.resumeCursor, this); + canvas.on('rightupoutside', this.resumeCursor, this); + } + } + if (this.options.wheelZoom) { + this.app.viewport.wheel({ + percent: 0.01, + }); + } + }; + CommonMouseTool.prototype.unbind = function () { + var canvas = this.app.canvas; + // 确保所有事件取消监听 + canvas.off('mousedown', this.onMouseDown, this); + canvas.off('mouseup', this.onMouseUp, this); + this.app.off('drag_op_start', this.onDragStart, this); + this.app.off('drag_op_move', this.onDragMove, this); + this.app.off('drag_op_end', this.onDragEnd, this); + this.app.viewport.plugins.remove('drag'); + canvas.off('mousedown', this.setLeftCursor, this); + canvas.off('mouseup', this.resumeLeftCursor, this); + canvas.off('mouseupoutside', this.resumeLeftCursor, this); + canvas.off('rightdown', this.setCursor, this); + canvas.off('rightup', this.resumeCursor, this); + canvas.off('rightupoutside', this.resumeCursor, this); + this.app.viewport.plugins.remove('wheel'); + this.clearCache(); + }; + CommonMouseTool.prototype.onDragStart = function (event) { + // console.log( + // 'start', + // `pointerType:${event.original.pointerType},pointerId:${event.original.pointerId},button: ${event.original.button},buttons:${event.original.buttons}` + // ); + if (this.boxSelect && event.target.isCanvas() && event.isLeftButton) { + this.box.visible = true; + this.app.interactionPlugin(ViewportMovePlugin.Name).resume(); + } + this.drag = true; + }; + CommonMouseTool.prototype.onDragMove = function (event) { + // console.log( + // 'moving', + // `pointerType:${event.original.pointerType},pointerId:${event.original.pointerId},button: ${event.original.button},buttons:${event.original.buttons}` + // ); + if (this.boxSelect && event.target.isCanvas()) { + this.boxSelectDraw(event.start, event.end); + } + }; + CommonMouseTool.prototype.onDragEnd = function (event) { + // console.log( + // 'end', + // `pointerType:${event.original.pointerType},pointerId:${event.original.pointerId},button: ${event.original.button},buttons:${event.original.buttons}` + // ); + if (this.boxSelect && event.target.isCanvas() && event.isLeftButton) { + this.boxSelectDraw(event.start, event.end); + this.boxSelectGraphicCheck(); + this.app.interactionPlugin(ViewportMovePlugin.Name).pause(); + this.box.clear(); + this.box.visible = false; + } + }; + CommonMouseTool.prototype.setLeftCursor = function (e) { + var target = e.target; + this.leftDownTarget = target; + if (target.isCanvas() && this.app.pixi.view.style) { + this.app.pixi.view.style.cursor = 'grab'; + } + }; + CommonMouseTool.prototype.resumeLeftCursor = function () { + if (this.leftDownTarget && + this.leftDownTarget.isCanvas() && + this.app.pixi.view.style) { + this.app.pixi.view.style.cursor = 'inherit'; + } + this.leftDownTarget = null; + }; + CommonMouseTool.prototype.setCursor = function (e) { + var target = e.target; + this.rightTarget = target; + if (target.isCanvas() && this.app.pixi.view.style) { + this.app.pixi.view.style.cursor = 'grab'; + } + }; + CommonMouseTool.prototype.resumeCursor = function () { + if (this.rightTarget && + this.rightTarget.isCanvas() && + this.app.pixi.view.style) { + this.app.pixi.view.style.cursor = 'inherit'; + } + this.rightTarget = null; + }; + CommonMouseTool.prototype.onMouseDown = function (e) { + this.leftDownTarget = e.target; + this.graphicSelect = false; + // 图形 + var graphic = this.leftDownTarget.getGraphic(); + if (graphic) { + var app = this.app; + // console.log(this.leftDownTarget.isGraphic()); + // 图形选中 + if (!e.ctrlKey && !graphic.selected && graphic.selectable) { + app.updateSelected(graphic); + graphic.childEdit = false; + this.graphicSelect = true; + } + else if (!e.ctrlKey && graphic.selected && graphic.childEdit) { + if (this.leftDownTarget.isGraphicChild() && + this.leftDownTarget.selectable) { + graphic.setChildSelected(this.leftDownTarget); + } + else { + graphic.exitChildEdit(); + } + } + } + }; + /** + * 选中处理 + * @param e + */ + CommonMouseTool.prototype.onMouseUp = function (e) { + var app = this.app; + if (!this.drag) { + var target = e.target; + var graphic = e.target.getGraphic(); + if (graphic && + graphic.selected && + !this.graphicSelect && + app.selectedGraphics.length == 1 && + target === this.leftDownTarget && + target.isGraphicChild() && + target.selectable) { + graphic.childEdit = true; + } + if (e.ctrlKey) { + // 多选 + if (graphic) { + if (graphic.childEdit && target === this.leftDownTarget) { + graphic.invertChildSelected(target); + } + else { + graphic.invertSelected(); + } + } + } + else { + // 非多选 + if (e.target.isCanvas()) { + this.app.updateSelected(); + } + else { + if (graphic && + graphic.childEdit && + app.selectedGraphics.length === 1 && + target === this.leftDownTarget) { + graphic.setChildSelected(target); + } + } + } + // 多个图形选中,退出子元素编辑模式 + var selecteds = this.app.selectedGraphics; + if (selecteds.length > 1) { + selecteds.forEach(function (g) { return g.exitChildEdit(); }); + } + } + this.clearCache(); + }; + /** + * 清理缓存 + */ + CommonMouseTool.prototype.clearCache = function () { + this.drag = false; + this.leftDownTarget = null; + }; + Object.defineProperty(CommonMouseTool.prototype, "boxSelect", { + get: function () { + return this.options.boxSelect; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CommonMouseTool.prototype, "selectFilter", { + get: function () { + return this.options.selectFilter; + }, + enumerable: false, + configurable: true + }); + /** + * 框选图形绘制并检查 + */ + CommonMouseTool.prototype.boxSelectDraw = function (start, end) { + if (!this.drag) + return; + // 绘制框选矩形框 + this.box.clear(); + this.box.lineStyle({ + width: 2, + color: this.app.appOptions.assistantElementColor || + AppConsts.assistantElementColor, + }); + var dsx = end.x - start.x; + var dsy = end.y - start.y; + var x = start.x, y = start.y; + if (dsx < 0) { + x += dsx; + } + if (dsy < 0) { + y += dsy; + } + var width = Math.abs(dsx); + var height = Math.abs(dsy); + this.box.drawRect(x, y, width, height); + }; + /** + * 框选图形判断 + * @returns + */ + CommonMouseTool.prototype.boxSelectGraphicCheck = function () { + var _this = this; + if (!this.drag) + return; + // 遍历筛选 + var boxRect = this.box.getLocalBounds(); + var app = this.app; + var selects = []; + app.queryStore.getAllGraphics().forEach(function (g) { + if ((_this.selectFilter == undefined && g.visible) || + (!!_this.selectFilter && _this.selectFilter(g))) { + // 选择过滤器 + if (g.boxIntersectCheck(boxRect)) { + selects.push(g); + } + } + }); + app.updateSelected.apply(app, selects); + }; + CommonMouseTool.Name = 'mouse-tool'; + CommonMouseTool.SelectBox = '__select_box'; + return CommonMouseTool; +}(AppInteractionPlugin)); + +var target; +var GlobalKeyboardHelper = /** @class */ (function () { + function GlobalKeyboardHelper() { + var _this = this; + this.appKeyboardPluginMap = []; + window.onkeydown = function (e) { + _this.appKeyboardPluginMap.forEach(function (plugin) { + var listenerMap = plugin.getKeyListener(e); + listenerMap === null || listenerMap === void 0 ? void 0 : listenerMap.forEach(function (listener) { + if (listener.global) { + listener.press(e, plugin.app); + } + }); + }); + if (e.ctrlKey) { + if (e.code == 'KeyS') { + // 屏蔽全局Ctrl+S保存操作 + // console.log('屏蔽全局Ctrl+S') + return false; + } + } + if (target && target.nodeName == 'CANVAS') { + // 事件的目标是画布时,屏蔽总的键盘操作操作 + if (e.ctrlKey) { + if (e.code == 'KeyA' || e.code == 'KeyS') { + // 屏蔽Canvas上的Ctrl+A、Ctrl+S操作 + return false; + } + } + } + return true; + }; + window.onkeyup = function (e) { + _this.appKeyboardPluginMap.forEach(function (plugin) { + var listenerMap = plugin.getKeyListener(e); + listenerMap === null || listenerMap === void 0 ? void 0 : listenerMap.forEach(function (listener) { + if (listener.global) { + listener.release(e, plugin.app); + } + }); + }); + }; + } + GlobalKeyboardHelper.prototype.registerGAKPlugin = function (plugin) { + if (!this.appKeyboardPluginMap.find(function (pg) { return pg == plugin; })) { + this.appKeyboardPluginMap.push(plugin); + } + }; + GlobalKeyboardHelper.prototype.removeGAKPlugin = function (plugin) { + var index = this.appKeyboardPluginMap.findIndex(function (pg) { return pg == plugin; }); + if (index >= 0) { + this.appKeyboardPluginMap.splice(index, 1); + } + }; + return GlobalKeyboardHelper; +}()); +var GlobalKeyboardPlugin = new GlobalKeyboardHelper(); +var JlGraphicAppKeyboardPlugin = /** @class */ (function () { + function JlGraphicAppKeyboardPlugin(app) { + var _this = this; + /** + * 结构为Map> + */ + this.keyListenerMap = new Map(); // 键值监听map + this.keyListenerStackMap = new Map(); // 键值监听栈(多次注册相同的监听会把之前注册的监听器入栈,移除最新的监听会从栈中弹出一个作为指定事件监听处理器) + this.app = app; + GlobalKeyboardPlugin.registerGAKPlugin(this); + var onMouseUpdateTarget = function (e) { + var node = e.target; + target = node; + // console.log('Mousedown Event', node.nodeName, node.nodeType, node.nodeValue) + }; + var keydownHandle = function (e) { + var _a; + // console.debug(e.key, e.code, e.keyCode); + if (target && target == ((_a = _this.app.dom) === null || _a === void 0 ? void 0 : _a.getElementsByTagName('canvas')[0])) { + var listenerMap = _this.getKeyListener(e); + listenerMap === null || listenerMap === void 0 ? void 0 : listenerMap.forEach(function (listener) { + if (!listener.global) { + listener.press(e, _this.app); + } + }); + } + }; + var keyupHandle = function (e) { + var _a; + if (target && target == ((_a = _this.app.dom) === null || _a === void 0 ? void 0 : _a.getElementsByTagName('canvas')[0])) { + var listenerMap = _this.getKeyListener(e); + listenerMap === null || listenerMap === void 0 ? void 0 : listenerMap.forEach(function (listener) { + if (!listener.global) { + listener.release(e, _this.app); + } + }); + } + }; + document.addEventListener('mousedown', onMouseUpdateTarget, false); + document.addEventListener('keydown', keydownHandle, false); + document.addEventListener('keyup', keyupHandle, false); + this.app.on('destroy', function () { + document.removeEventListener('mousedown', onMouseUpdateTarget, false); + document.removeEventListener('keydown', keydownHandle, false); + document.removeEventListener('keyup', keyupHandle, false); + GlobalKeyboardPlugin.removeGAKPlugin(_this); + }); + } + JlGraphicAppKeyboardPlugin.prototype.getOrInit = function (key) { + var map = this.keyListenerMap.get(key); + if (map === undefined) { + map = new Map(); + this.keyListenerMap.set(key, map); + } + return map; + }; + JlGraphicAppKeyboardPlugin.prototype.getOrInitStack = function (key) { + var stack = this.keyListenerStackMap.get(key); + if (stack === undefined) { + stack = []; + this.keyListenerStackMap.set(key, stack); + } + return stack; + }; + /** + * 注册按键监听,若有旧的,旧的入栈 + * @param keyListener + */ + JlGraphicAppKeyboardPlugin.prototype.addKeyListener = function (keyListener) { + var map = this.getOrInit(keyListener.value); + // 查询是否有旧的监听,若有入栈 + var old = map.get(keyListener.identifier); + if (old) { + var stack = this.getOrInitStack(keyListener.identifier); + stack.push(old); + } + map.set(keyListener.identifier, keyListener); + // console.log(this.getAllListenedKeys()); + }; + /** + * 移除按键监听,若是当前注册的监听,尝试从栈中取出作为按键监听器,若是旧的,则同时移除栈中的监听 + * @param keyListener + */ + JlGraphicAppKeyboardPlugin.prototype.removeKeyListener = function (keyListener) { + keyListener.onRemove(); + var map = this.getOrInit(keyListener.value); + var old = map.get(keyListener.identifier); + map.delete(keyListener.identifier); + var stack = this.getOrInitStack(keyListener.identifier); + if (old && old === keyListener) { + // 是旧的监听 + var listener = stack.pop(); + if (listener) { + map.set(keyListener.identifier, listener); + } + } + else { + // 移除栈中的 + var index = stack.findIndex(function (ls) { return ls === keyListener; }); + if (index >= 0) { + stack.splice(index, 1); + } + } + // console.log(this); + }; + JlGraphicAppKeyboardPlugin.prototype.getKeyListenerBy = function (key) { + return this.keyListenerMap.get(key); + }; + JlGraphicAppKeyboardPlugin.prototype.getKeyListener = function (e) { + return (this.getKeyListenerBy(e.key) || + this.getKeyListenerBy(e.code) || + this.getKeyListenerBy(e.keyCode)); + }; + JlGraphicAppKeyboardPlugin.prototype.isKeyListened = function (key) { + return this.getOrInit(key).size > 0; + }; + /** + * 获取所有注册监听的键值(组合键) + */ + JlGraphicAppKeyboardPlugin.prototype.getAllListenedKeys = function () { + var keys = []; + this.keyListenerMap.forEach(function (v) { + return v.forEach(function (_listener, ck) { return keys.push(ck); }); + }); + return keys; + }; + return JlGraphicAppKeyboardPlugin; +}()); +exports.CombinationKey = void 0; +(function (CombinationKey) { + CombinationKey["Ctrl"] = "Ctrl"; + CombinationKey["Alt"] = "Alt"; + CombinationKey["Shift"] = "Shift"; +})(exports.CombinationKey || (exports.CombinationKey = {})); +var DefaultKeyListenerOptions = { + value: '', + combinations: [], + global: false, + onPress: undefined, + pressTriggerAsOriginalEvent: false, + onRelease: undefined, +}; +var KeyListener = /** @class */ (function () { + function KeyListener(options) { + this.isPress = false; + this.options = Object.assign({}, DefaultKeyListenerOptions, options); + } + KeyListener.create = function (options) { + return new KeyListener(options); + }; + Object.defineProperty(KeyListener.prototype, "value", { + get: function () { + return this.options.value; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(KeyListener.prototype, "combinations", { + get: function () { + return this.options.combinations; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(KeyListener.prototype, "identifier", { + get: function () { + return this.options.combinations.join('+') + '+' + this.options.value; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(KeyListener.prototype, "global", { + get: function () { + return this.options.global; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(KeyListener.prototype, "onPress", { + get: function () { + return this.options.onPress; + }, + set: function (v) { + this.options.onPress = v; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(KeyListener.prototype, "onRelease", { + get: function () { + return this.options.onRelease; + }, + set: function (v) { + this.options.onRelease = v; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(KeyListener.prototype, "pressTriggerEveryTime", { + get: function () { + return this.options.pressTriggerAsOriginalEvent; + }, + set: function (v) { + this.options.pressTriggerAsOriginalEvent = v; + }, + enumerable: false, + configurable: true + }); + KeyListener.prototype.press = function (e, app) { + if (!this.checkCombinations(e)) { + console.debug('组合键不匹配, 不执行press', e, this); + return; + } + if (this.pressTriggerEveryTime || !this.isPress) { + // console.log('Keydown: ', e, this.onPress); + this.isPress = true; + if (this.onPress) { + this.onPress(e, app); + } + } + }; + /** + * 检查组合键是否匹配 + */ + KeyListener.prototype.checkCombinations = function (e) { + var cbs = this.combinations; + if (cbs.length > 0) { + if (((e.altKey && cbs.includes(exports.CombinationKey.Alt)) || + (!e.altKey && !cbs.includes(exports.CombinationKey.Alt))) && + ((e.ctrlKey && cbs.includes(exports.CombinationKey.Ctrl)) || + (!e.ctrlKey && !cbs.includes(exports.CombinationKey.Ctrl))) && + ((e.shiftKey && cbs.includes(exports.CombinationKey.Shift)) || + (!e.shiftKey && !cbs.includes(exports.CombinationKey.Shift)))) { + return true; + } + } + else { + return !e.altKey && !e.ctrlKey && !e.shiftKey; + } + return false; + }; + KeyListener.prototype.release = function (e, app) { + if (this.isPress) { + // console.log('Keyup : ', e.key, e); + this.isPress = false; + if (this.onRelease) { + this.onRelease(e, app); + } + } + }; + KeyListener.prototype.onRemove = function () { + // 重置按下状态 + this.isPress = false; + }; + return KeyListener; +}()); + +/** + * 图形复制插件 + */ +var GraphicCopyPlugin = /** @class */ (function () { + function GraphicCopyPlugin(scene) { + var _this = this; + this.running = false; + this.scene = scene; + this.container = new pixi_js.Container(); + this.copys = []; + this.keyListeners = []; + this.keyListeners.push(new KeyListener({ + // ESC 用于取消复制操作 + value: 'Escape', + global: true, + // combinations: [CombinationKey.Ctrl], + onPress: function () { + _this.cancle(); + }, + }), new KeyListener({ + // X 限制只能在x轴移动 + value: 'KeyX', + global: true, + // combinations: [CombinationKey.Ctrl], + onPress: function () { + _this.updateMoveLimit('x'); + }, + }), new KeyListener({ + // Y 限制只能在y轴移动 + value: 'KeyY', + global: true, + // combinations: [CombinationKey.Ctrl], + onPress: function () { + _this.updateMoveLimit('y'); + }, + })); + } + GraphicCopyPlugin.prototype.updateMoveLimit = function (limit) { + if (this.moveLimit === limit) { + this.moveLimit = undefined; + } + else { + this.moveLimit = limit; + } + }; + GraphicCopyPlugin.prototype.init = function () { + var _this = this; + if (this.running) + return; + if (this.scene.selectedGraphics.length === 0) { + throw new Error('没有选中图形,复制取消'); + } + this.running = true; + this.copys = []; + this.container.alpha = 0.5; + this.scene.canvas.addChild(this.container); + var app = this.scene; + this.scene.selectedGraphics.forEach(function (g) { + var template = app.getGraphicTemplatesByType(g.type); + var clone = template.clone(g); + _this.copys.push(clone); + _this.container.position.set(0, 0); + _this.container.addChild(clone); + clone.repaint(); + }); + this.scene.canvas.on('mousemove', this.onPointerMove, this); + this.scene.canvas.on('mouseup', this.onFinish, this); + this.scene.canvas.on('rightup', this.cancle, this); + this.keyListeners.forEach(function (kl) { + _this.scene.app.addKeyboardListener(kl); + }); + }; + GraphicCopyPlugin.prototype.clear = function () { + var _this = this; + this.running = false; + this.start = undefined; + this.moveLimit = undefined; + this.copys = []; + this.container.removeChildren(); + this.scene.canvas.removeChild(this.container); + this.scene.canvas.off('mousemove', this.onPointerMove, this); + this.scene.canvas.off('mouseup', this.onFinish, this); + this.scene.canvas.off('rightup', this.cancle, this); + this.keyListeners.forEach(function (kl) { + _this.scene.app.removeKeyboardListener(kl); + }); + }; + GraphicCopyPlugin.prototype.onPointerMove = function (e) { + var cp = this.scene.toCanvasCoordinates(e.global); + if (!this.start) { + this.start = cp; + } + else { + if (this.moveLimit === 'x') { + var dx = cp.x - this.start.x; + this.container.position.x = dx; + this.container.position.y = 0; + } + else if (this.moveLimit === 'y') { + var dy = cp.y - this.start.y; + this.container.position.x = 0; + this.container.position.y = dy; + } + else { + var dx = cp.x - this.start.x; + var dy = cp.y - this.start.y; + this.container.position.x = dx; + this.container.position.y = dy; + } + } + }; + GraphicCopyPlugin.prototype.onFinish = function () { + var _a, _b; + var _this = this; + console.log('复制确认'); + // 将图形添加到app + this.copys.forEach(function (g) { + g.position.x += _this.container.position.x; + g.position.y += _this.container.position.y; + }); + (_a = this.scene.app).addGraphicAndRecord.apply(_a, this.copys); + this.scene.detectRelations(); + (_b = this.scene).updateSelected.apply(_b, this.copys); + this.clear(); + }; + GraphicCopyPlugin.prototype.cancle = function () { + console.log('复制操作取消'); + this.scene.canvas.removeChild(this.container); + this.clear(); + }; + return GraphicCopyPlugin; +}()); + +var VectorGraphicUtil = /** @class */ (function () { + function VectorGraphicUtil() { + } + VectorGraphicUtil.handle = function (obj) { + var vg = obj; + var onScaleChange = function (obj) { + if (vg.isParent(obj)) { + vg.updateOnScaled(); + } + }; + var registerScaleChange = function registerScaleChange(obj) { + if (!obj.scaledListenerOn) { + obj.scaledListenerOn = true; + obj.getGraphicApp().on('viewport-scaled', onScaleChange); + } + }; + var unregisterScaleChange = function unregisterScaleChange(obj) { + obj.scaledListenerOn = false; + obj.getGraphicApp().off('viewport-scaled', onScaleChange); + }; + obj.onAddToCanvas = function onAddToCanvas() { + obj.updateOnScaled(); + registerScaleChange(obj); + }; + obj.onRemoveFromCanvas = function onRemoveFromCanvas() { + // console.debug('矢量图像onRemoveFromCanvas'); + unregisterScaleChange(obj); + }; + obj.on('added', function (container) { + if (container.isInCanvas()) { + obj.onAddToCanvas(container.getCanvas()); + } + }); + }; + return VectorGraphicUtil; +}()); + +/** + * 矢量文字.实现原理:在缩放发生变化时,更新fontSize + */ +var VectorText = /** @class */ (function (_super) { + __extends(VectorText, _super); + function VectorText(text, style, canvas) { + var _this = _super.call(this, text, style, canvas) || this; + _this.vectorFontSize = 8; + _this.scaled = 1; + _this.scaledListenerOn = false; + VectorGraphicUtil.handle(_this); + return _this; + } + VectorText.prototype.updateOnScaled = function () { + var scaled = this.getAllParentScaled(); + var scale = Math.max(scaled.x, scaled.y); + this.style.fontSize = this.vectorFontSize * scale; + this.scale.set(1 / scale, 1 / scale); + }; + /** + * 设置矢量文字的字体大小 + */ + VectorText.prototype.setVectorFontSize = function (fontSize) { + if (this.vectorFontSize !== fontSize) { + this.vectorFontSize = fontSize; + this.updateOnScaled(); + } + }; + return VectorText; +}(pixi_js.Text)); + +/** + * 拖拽点参数 + */ +var DraggablePointParam = { + lineWidth: 1, + lineColor: 0x000000, + fillColor: 0xffffff, + radius: 5, // 半径 +}; +var DraggablePointGraphic = new pixi_js.Graphics(); +DraggablePointGraphic.lineStyle(DraggablePointParam.lineWidth, DraggablePointParam.lineColor); +DraggablePointGraphic.beginFill(DraggablePointParam.fillColor); +DraggablePointGraphic.drawCircle(0, 0, DraggablePointParam.radius); +DraggablePointGraphic.endFill(); +/** + * 拖拽点,用于更新图形属性 + */ +var DraggablePoint = /** @class */ (function (_super) { + __extends(DraggablePoint, _super); + /** + * + * @param point 画布坐标点 + */ + function DraggablePoint(point) { + var _this = _super.call(this, DraggablePointGraphic.geometry) || this; + _this.scaledListenerOn = false; + _this.position.copyFrom(point); + _this.eventMode = 'static'; + _this.draggable = true; + _this.cursor = 'crosshair'; + VectorGraphicUtil.handle(_this); + return _this; + } + DraggablePoint.prototype.updateOnScaled = function () { + var scaled = this.getAllParentScaled(); + var scale = Math.max(scaled.x, scaled.y); + this.scale.set(1 / scale, 1 / scale); + }; + return DraggablePoint; +}(pixi_js.Graphics)); + +/** + * 浮点数相等判断误差值 + */ +var epsilon = 0.00001; +/** + * 判断浮点数是不是0 + * @param v + * @returns + */ +function isZero(v) { + if (Math.abs(v) < epsilon) { + return true; + } + return false; +} +/** + * 两浮点数是否相等 + * @param f1 + * @param f2 + * @returns + */ +function floatEquals(f1, f2) { + return isZero(f1 - f2); +} + +/* eslint-disable @typescript-eslint/no-this-alias */ +var Vector2 = /** @class */ (function () { + function Vector2(values) { + this.values = new Float32Array(2); + if (values !== undefined) { + this.xy = values; + } + } + Vector2.from = function (p) { + return new Vector2([p.x, p.y]); + }; + Object.defineProperty(Vector2.prototype, "x", { + get: function () { + return this.values[0]; + }, + set: function (value) { + this.values[0] = value; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Vector2.prototype, "y", { + get: function () { + return this.values[1]; + }, + set: function (value) { + this.values[1] = value; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Vector2.prototype, "xy", { + get: function () { + return [this.values[0], this.values[1]]; + }, + set: function (values) { + this.values[0] = values[0]; + this.values[1] = values[1]; + }, + enumerable: false, + configurable: true + }); + Vector2.prototype.at = function (index) { + return this.values[index]; + }; + Vector2.prototype.reset = function () { + this.x = 0; + this.y = 0; + }; + Vector2.prototype.copy = function (dest) { + if (!dest) { + dest = new Vector2(); + } + dest.x = this.x; + dest.y = this.y; + return dest; + }; + Vector2.prototype.negate = function (dest) { + if (!dest) { + dest = this; + } + dest.x = -this.x; + dest.y = -this.y; + return dest; + }; + Vector2.prototype.equals = function (vector, threshold) { + if (threshold === void 0) { threshold = epsilon; } + if (Math.abs(this.x - vector.x) > threshold) { + return false; + } + if (Math.abs(this.y - vector.y) > threshold) { + return false; + } + return true; + }; + Vector2.prototype.length = function () { + return Math.sqrt(this.squaredLength()); + }; + Vector2.prototype.squaredLength = function () { + var x = this.x; + var y = this.y; + return x * x + y * y; + }; + Vector2.prototype.add = function (vector) { + this.x += vector.x; + this.y += vector.y; + return this; + }; + Vector2.prototype.subtract = function (vector) { + this.x -= vector.x; + this.y -= vector.y; + return this; + }; + Vector2.prototype.multiply = function (vector) { + this.x *= vector.x; + this.y *= vector.y; + return this; + }; + Vector2.prototype.divide = function (vector) { + this.x /= vector.x; + this.y /= vector.y; + return this; + }; + Vector2.prototype.scale = function (value, dest) { + if (!dest) { + dest = this; + } + dest.x *= value; + dest.y *= value; + return dest; + }; + Vector2.prototype.normalize = function (dest) { + if (!dest) { + dest = this; + } + var length = this.length(); + if (length === 1) { + return this; + } + if (length === 0) { + dest.x = 0; + dest.y = 0; + return dest; + } + length = 1.0 / length; + dest.x *= length; + dest.y *= length; + return dest; + }; + // multiplyMat2(matrix: mat2, dest?: Vector2): Vector2 { + // if (!dest) { + // dest = this; + // } + // return matrix.multiplyVec2(this, dest); + // } + // multiplyMat3(matrix: mat3, dest?: Vector2): Vector2 { + // if (!dest) { + // dest = this; + // } + // return matrix.multiplyVec2(this, dest); + // } + // static cross(vector: Vector2, vector2: Vector2, dest?: vec3): vec3 { + // if (!dest) { + // dest = new vec3(); + // } + // const x = vector.x; + // const y = vector.y; + // const x2 = vector2.x; + // const y2 = vector2.y; + // const z = x * y2 - y * x2; + // dest.x = 0; + // dest.y = 0; + // dest.z = z; + // return dest; + // } + /** + * 向量点乘 + * @param vector + * @param vector2 + * @returns + */ + Vector2.dot = function (vector, vector2) { + return vector.x * vector2.x + vector.y * vector2.y; + }; + /** + * 向量长度 + * @param vector + * @param vector2 + * @returns + */ + Vector2.distance = function (vector, vector2) { + return Math.sqrt(this.squaredDistance(vector, vector2)); + }; + /** + * 向量长度平方 + * @param vector + * @param vector2 + * @returns + */ + Vector2.squaredDistance = function (vector, vector2) { + var x = vector2.x - vector.x; + var y = vector2.y - vector.y; + return x * x + y * y; + }; + /** + * v2->v1的方向的单位向量 + * @param v1 + * @param v2 + * @param dest + * @returns + */ + Vector2.direction = function (v1, v2, dest) { + if (!dest) { + dest = new Vector2(); + } + var x = v1.x - v2.x; + var y = v1.y - v2.y; + var length = Math.sqrt(x * x + y * y); + if (length === 0) { + dest.x = 0; + dest.y = 0; + return dest; + } + length = 1 / length; + dest.x = x * length; + dest.y = y * length; + return dest; + }; + Vector2.mix = function (vector, vector2, time, dest) { + if (!dest) { + dest = new Vector2(); + } + var x = vector.x; + var y = vector.y; + var x2 = vector2.x; + var y2 = vector2.y; + dest.x = x + time * (x2 - x); + dest.y = y + time * (y2 - y); + return dest; + }; + /** + * 向量加法 + * @param vector + * @param vector2 + * @param dest + * @returns + */ + Vector2.sum = function (vector, vector2, dest) { + if (!dest) { + dest = new Vector2(); + } + dest.x = vector.x + vector2.x; + dest.y = vector.y + vector2.y; + return dest; + }; + /** + * 向量减法 + * @param vector + * @param vector2 + * @param dest + * @returns + */ + Vector2.difference = function (vector, vector2, dest) { + if (!dest) { + dest = new Vector2(); + } + dest.x = vector.x - vector2.x; + dest.y = vector.y - vector2.y; + return dest; + }; + /** + * 向量乘法 + * @param vector + * @param vector2 + * @param dest + * @returns + */ + Vector2.product = function (vector, vector2, dest) { + if (!dest) { + dest = new Vector2(); + } + dest.x = vector.x * vector2.x; + dest.y = vector.y * vector2.y; + return dest; + }; + /** + * 向量除法 + * @param vector + * @param vector2 + * @param dest + * @returns + */ + Vector2.quotient = function (vector, vector2, dest) { + if (!dest) { + dest = new Vector2(); + } + dest.x = vector.x / vector2.x; + dest.y = vector.y / vector2.y; + return dest; + }; + Vector2.zero = new Vector2([0, 0]); + Vector2.one = new Vector2([1, 1]); + return Vector2; +}()); + +/** + * 递归父节点执行逻辑 + * @param obj + * @param handler + */ +function recursiveParents(obj, handler) { + if (obj.parent) { + handler(obj.parent); + recursiveParents(obj.parent, handler); + } +} +/** + * 递归父节点查询父节点对象 + * @param obj + * @param finder + * @returns + */ +function recursiveFindParent(obj, finder) { + if (obj.parent) { + if (finder(obj.parent)) { + return obj.parent; + } + else { + return recursiveFindParent(obj.parent, finder); + } + } + return null; +} +/** + * 递归子节点执行逻辑 + * @param container + * @param handler + */ +function recursiveChildren(container, handler) { + container.children.forEach(function (child) { + handler(child); + if (child.children) { + recursiveChildren(child, handler); + } + }); +} +/** + * 递归子节点查询子节点对象 + */ +function recursiveFindChild(container, finder) { + var result = null; + for (var i = 0; i < container.children.length; i++) { + var child = container.children[i]; + if (finder(child)) { + return child; + } + else if (child.children) { + result = recursiveFindChild(child, finder); + } + } + return result; +} +/** + * 判断贝塞尔曲线数据是否正确 + * @param points + */ +function assertBezierPoints(points) { + if (points.length < 4 || points.length % 3 !== 1) { + throw new Error("bezierCurve \u6570\u636E\u9519\u8BEF: ".concat(points)); + } +} +/** + * 转换为贝塞尔曲线参数 + * @param points + * @returns + */ +function convertToBezierParams(points) { + assertBezierPoints(points); + var bps = []; + for (var i = 0; i < points.length - 3; i += 3) { + var p1 = new pixi_js.Point(points[i].x, points[i].y); + var p2 = new pixi_js.Point(points[i + 3].x, points[i + 3].y); + var cp1 = new pixi_js.Point(points[i + 1].x, points[i + 1].y); + var cp2 = new pixi_js.Point(points[i + 2].x, points[i + 2].y); + bps.push({ + p1: p1, + p2: p2, + cp1: cp1, + cp2: cp2, + }); + } + return bps; +} +/** + * 根据分段数计算贝塞尔曲线所有点坐标 + * @param basePoints + * @param segmentsCount + * @returns + */ +function calculateBezierPoints(basePoints, segmentsCount) { + var bps = convertToBezierParams(basePoints); + var points = []; + bps.forEach(function (bp) { + points.push.apply(points, calculateOneBezierPoints(bp.p1, bp.p2, bp.cp1, bp.cp2, segmentsCount)); + }); + return points; +} +/** + * 根据分段数计算贝塞尔曲线所有点坐标 + * @param basePoints + * @param segmentsCount + * @returns + */ +function calculateOneBezierPoints(p1, p2, cp1, cp2, segmentsCount) { + var points = []; + var fromX = p1.x; + var fromY = p1.y; + var n = segmentsCount; + var dt = 0; + var dt2 = 0; + var dt3 = 0; + var t2 = 0; + var t3 = 0; + var cpX = cp1.x; + var cpY = cp1.y; + var cpX2 = cp2.x; + var cpY2 = cp2.y; + var toX = p2.x; + var toY = p2.y; + points.push(new pixi_js.Point(p1.x, p1.y)); + for (var i = 1, j = 0; i <= n; ++i) { + j = i / n; + dt = 1 - j; + dt2 = dt * dt; + dt3 = dt2 * dt; + t2 = j * j; + t3 = t2 * j; + var px = dt3 * fromX + 3 * dt2 * j * cpX + 3 * dt * t2 * cpX2 + t3 * toX; + var py = dt3 * fromY + 3 * dt2 * j * cpY + 3 * dt * t2 * cpY2 + t3 * toY; + points.push(new pixi_js.Point(px, py)); + } + return points; +} +/** + * 计算矩形中点 + */ +function getRectangleCenter(rectangle) { + return new pixi_js.Point(rectangle.x + rectangle.width / 2, rectangle.y + rectangle.height / 2); +} +/** + * 计算两个矩形中心对齐的坐标, PS: 计算的是较大包围框的中心 + * @param rect1 + * @param rect2 + * @returns + */ +function getCenterOfTwoRectangle(rect1, rect2) { + var x = Math.abs(rect1.width - rect2.width) / 2; + var y = Math.abs(rect1.height - rect2.height) / 2; + return new pixi_js.Point(x, y); +} +/** + * 序列化图形变换 + * @param obj + * @returns + */ +function serializeTransform(obj) { + var position = obj.position; + var scale = obj.scale; + var angle = obj.angle; + var skew = obj.skew; + return [position.x, position.y, scale.x, scale.y, angle, skew.x, skew.y]; +} +/** + * 反序列化变换数据到图形对象 + * @param obj + * @param transform + */ +function deserializeTransformInto(obj, transform) { + if (transform.length === 7) { + obj.position.set(transform[0], transform[1]); + obj.scale.set(transform[2], transform[3]); + obj.angle = transform[4]; + obj.skew.set(transform[5], transform[6]); + } + else if (transform.length > 0) { + console.warn('错误的变换数据', transform); + } +} +/** + * 将直线转换为多边形 + * @param p1 + * @param p2 + * @param thick + * @returns + */ +function convertLineToPolygonPoints(p1, p2, thick) { + var angle = Math.atan2(p2.y - p1.y, p2.x - p1.x) - Math.PI / 2; + var half = thick / 2; + var cos = Math.cos(angle) * half; + var sin = Math.sin(angle) * half; + return [ + new pixi_js.Point(p1.x - cos, p1.y - sin), + new pixi_js.Point(p2.x - cos, p2.y - sin), + new pixi_js.Point(p2.x + cos, p2.y + sin), + new pixi_js.Point(p1.x + cos, p1.y + sin), + ]; +} +/** + * 转换矩形为多边形点坐标 + * @param rect 矩形 + * @returns + */ +function convertRectangleToPolygonPoints(rect) { + return [ + new pixi_js.Point(rect.x, rect.y), + new pixi_js.Point(rect.x + rect.width, rect.y), + new pixi_js.Point(rect.x + rect.width, rect.y + rect.height), + new pixi_js.Point(rect.x, rect.y + rect.height), + ]; +} +/** + * 计算线段中点坐标 + * @param p1 + * @param p2 + * @returns + */ +function calculateLineMidpoint(p1, p2) { + var x = (p1.x + p2.x) / 2; + var y = (p1.y + p2.y) / 2; + return new pixi_js.Point(x, y); +} +/** + * 计算线段细分坐标--线段分成几份 + * @param p1 + * @param p2 + * @param knife + * @returns + */ +function calculateLineSegmentingPoint(p1, p2, knife) { + var segmentingPoints = []; + var x = p1.x < p2.x ? p1.x : p2.x; + var y = p1.y < p2.y ? p1.y : p2.y; + var w = Math.abs(p1.x - p2.x); + var h = Math.abs(p1.y - p2.y); + for (var i = 0; i < knife - 1; i++) { + var pointX = x + (w * (i + 1)) / knife; + var pointy = y + (h * (i + 1)) / knife; + segmentingPoints.push(new pixi_js.Point(pointX, pointy)); + } + return segmentingPoints; +} +/** + * 计算点到直线距离 + * @param p1 + * @param p2 + * @param p + */ +function calculateDistanceFromPointToLine(p1, p2, p) { + // 求直线的一般方程参数ABC,直线的一般式方程AX+BY+C=0 + var A = p1.y - p2.y; + var B = p2.x - p1.x; + var C = p1.x * p2.y - p1.y * p2.x; + // 计算点到直线垂直距离: d = |Ax+By+C|/sqrt(A*A+B*B),其中x,y为点坐标 + var dl = Math.abs(A * p.x + B * p.y + C) / Math.sqrt(A * A + B * B); + return dl; +} +/** + * 计算点到直线的垂足坐标 + * @param p + * @param p1 + * @param p2 + */ +function calculateFootPointFromPointToLine(p1, p2, p) { + if (p1.x == p2.x && p1.y == p2.y) { + throw new Error("\u76F4\u7EBF\u4E24\u5750\u6807\u70B9\u76F8\u7B49:".concat(p1)); + } + var k = -(((p1.x - p.x) * (p2.x - p1.x) + (p1.y - p.y) * (p2.y - p1.y)) / + (Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2))); + if (isZero(k)) { + return new pixi_js.Point(p.x, p.y); + } + var xf = k * (p2.x - p1.x) + p1.x; + var yf = k * (p2.y - p1.y) + p1.y; + return new pixi_js.Point(xf, yf); +} +/** + * 计算直线与圆的交点 + * 1用直线到圆心的距离和半径相比,判断是否和圆有交点; + * 2求出圆心在直线上面的垂点; + * 3算出直线的单位向量e; + * 4求出一侧交点(Intersection)到projectPoint的长度(sideLength); + * 5求出sideLength和这侧端点到projectPoint距离的比例(ratio); + * 6projectPoint +/- ratio * e = 两侧交点; + * @param p0 圆心坐标 + * @param radius 圆半径 + * @param p1 直线坐标1 + * @param p2 直线坐标2 + * @returns 交点坐标,可能2/1/0个 + */ +function calculateIntersectionPointOfCircleAndLine(p0, radius, p1, p2) { + var distance = calculateDistanceFromPointToLine(p1, p2, p0); + if (distance <= radius) { + // 有交点 + // 计算垂点 + var pr = calculateFootPointFromPointToLine(p1, p2, p0); + if (floatEquals(distance, radius)) { + // 切线 + return [pr]; + } + var vpr = new Vector2([pr.x, pr.y]); + var vc = new Vector2([p0.x, p0.y]); + // 计算直线单位向量 + var v1 = new Vector2([p1.x, p1.y]); + var v2 = new Vector2([p2.x, p2.y]); + var ve = Vector2.direction(v2, v1); + var base = Math.sqrt(Math.abs(radius * radius - Vector2.difference(vpr, vc).squaredLength())); + var vl = ve.scale(base); + var ip1 = Vector2.sum(vpr, vl); + var ip2 = Vector2.difference(vpr, vl); + return [new pixi_js.Point(ip1.x, ip1.y), new pixi_js.Point(ip2.x, ip2.y)]; + } + else { + // 无交点 + return []; + } +} +/** + * 计算圆心与圆心外一点与圆的交点(取圆心到点的向量与圆的交点) + * @param p0 圆心坐标 + * @param radius 圆半径 + * @param p 点坐标 + * @returns + */ +function calculateIntersectionPointOfCircleAndPoint(p0, radius, p) { + var points = calculateIntersectionPointOfCircleAndLine(p0, radius, p0, p); + var vc = new Vector2([p0.x, p0.y]); + var vp = new Vector2([p.x, p.y]); + var vecp = Vector2.direction(vp, vc); + for (var i = 0; i < points.length; i++) { + var ip = points[i]; + var ve = Vector2.direction(new Vector2([ip.x, ip.y]), vc); + if (ve.equals(vecp)) { + return ip; + } + } + throw new Error('计算圆心与圆心外一点与圆的交点逻辑错误'); +} +/** + * 计算点基于点的镜像点坐标 + * @param bp 基准点 + * @param p 待镜像的点坐标 + * @param distance 镜像点到基准点的距离,默认为p到基准点的距离,即对称 + * @returns + */ +function calculateMirrorPoint(bp, p, distance) { + var vbp = Vector2.from(bp); + var vp = Vector2.from(p); + var direction = Vector2.direction(vbp, vp); + if (distance == undefined) { + distance = Vector2.distance(vbp, vp); + } + var vmp = Vector2.sum(vbp, direction.scale(distance)); + return new pixi_js.Point(vmp.x, vmp.y); +} +/** + * 计算基于给定轴的给定点的镜像点坐标 + * @param pa 给定轴线的坐标 + * @param pb 给定轴线的坐标 + * @param p 待镜像点坐标 + * @param distance + * @returns + */ +function calculateMirrorPointBasedOnAxis(pa, pb, p, distance) { + var fp = calculateFootPointFromPointToLine(pa, pb, p); + if (fp.equals(p)) { + return fp; + } + else { + return calculateMirrorPoint(fp, p, distance); + } +} +/** + * 计算直线与水平夹角,角度按顺时针,从0开始 + * @param p1 + * @param p2 + * @returns 角度,范围[0, 360) + */ +function angleToAxisx(p1, p2) { + if (p1.x == p2.x && p1.y == p2.y) { + throw new Error('一个点无法计算角度'); + } + var dx = Math.abs(p1.x - p2.x); + var dy = Math.abs(p1.y - p2.y); + if (p2.x == p1.x) { + if (p2.y > p1.y) { + return 90; + } + else { + return 270; + } + } + if (p2.y == p1.y) { + if (p2.x > p1.x) { + return 0; + } + else { + return 180; + } + } + var angle = (Math.atan2(dy, dx) * 180) / Math.PI; + if (p2.x > p1.x) { + if (p2.y > p1.y) { + return angle; + } + else if (p2.y < p1.y) { + return 360 - angle; + } + } + else if (p2.x < p1.x) { + if (p2.y > p1.y) { + return 180 - angle; + } + else { + return 180 + angle; + } + } + return angle; +} +/** + * 计算两线夹角,pc与pa,pb的夹角,顺时针为正,逆时针为负 + * @param pa 交点 + * @param pb 锚定 + * @param pc + * @returns 夹角, [-180, 180] + */ +function angleOfIncludedAngle(pa, pb, pc) { + var abAngle = angleToAxisx(pa, pb); + var acAngle = angleToAxisx(pa, pc); + var angle = acAngle - abAngle; + if (angle < -180) { + angle = 360 + angle; + } + else if (angle > 180) { + angle = -(360 - angle); + } + return angle; +} +/** + * 计算两点连线的法向量 + * @param point1 + * @param point2 + * @returns 单位法向量 + */ +function getNormalVector(point1, point2) { + var x1 = point1.x, y1 = point1.y; + var x2 = point2.x, y2 = point2.y; + var length = Math.sqrt(Math.pow((y2 - y1), 2) + Math.pow((x2 - x1), 2)); + return [(y2 - y1) / length, (x1 - x2) / length]; +} +/** + * 点延向量方向移动 + * @param point + * @param normal 单位向量 + * @param length 平移长度 + * @returns 移动后的点 + */ +function movePointAlongNormal(point, normal, length) { + var newPoint = new pixi_js.Point(point.x + length * normal[0], point.y + length * normal[1]); + return newPoint; +} +/** + * 计算两组点各自组成直线的相交点(若两线平行 返回第一组坐标第一个点) + * @param line1 两点坐标列表 + * @param line2 两点坐标列表 + * @returns 相交点 + */ +function getIntersectionPoint(line1, line2) { + var a1 = line1[0], b1 = line1[1]; + var a2 = line1[2], b2 = line1[3]; + var a3 = line2[0], b3 = line2[1]; + var a4 = line2[2], b4 = line2[3]; + var denominator = (a3 - a4) * (b1 - b2) - (a1 - a2) * (b3 - b4); + if (denominator === 0) { + return new pixi_js.Point(a1, b1); + } + var x = ((a3 - a4) * (a2 * b1 - a1 * b2) - (a1 - a2) * (a4 * b3 - a3 * b4)) / + denominator; + var y = ((b3 - b4) * (b2 * a1 - b1 * a2) - (b1 - b2) * (b4 * a3 - b3 * a4)) / + -denominator; + return new pixi_js.Point(x, y); +} +/** + * 是否平行线 + * @param p1 + * @param p2 + * @param pa + * @param pb + * @returns + */ +function isParallelLines(p1, p2, pa, pb) { + var vle1 = Vector2.direction(Vector2.from(p1), Vector2.from(p2)); + var vle2 = Vector2.direction(Vector2.from(pa), Vector2.from(pb)); + if (vle2.equals(vle1)) { + return true; + } + return vle1.equals(Vector2.direction(Vector2.from(pb), Vector2.from(pa))); +} +/** + * 点是否在线段上 + * @param p1 + * @param p2 + * @param p + * @returns + */ +function isPointOnLine(p1, p2, p) { + var vp1 = Vector2.from(p1); + var vp2 = Vector2.from(p2); + var vp = Vector2.from(p); + if (vp1.equals(vp) || vp2.equals(vp)) { + return true; + } + var vle = Vector2.direction(vp1, Vector2.from(p2)); + var vpe = Vector2.direction(vp1, vp); + if (vle.equals(vpe)) { + return (Vector2.difference(vp1, vp2).squaredLength() >= + Vector2.difference(vp1, vp).squaredLength()); + } + return false; +} +/** + * 两条线段是否存在包含关系 + * @param line1 + * @param line2 + * @returns + */ +function isLineContainOther(line1, line2) { + return ((isPointOnLine(line1.p1, line1.p2, line2.p1) && + isPointOnLine(line1.p1, line1.p2, line2.p2)) || + (isPointOnLine(line2.p1, line2.p2, line1.p1) && + isPointOnLine(line2.p1, line2.p2, line1.p2))); +} +/** 均分线段, 返回各线段端点 */ +function splitLineEvenly(p1, p2, count) { + var _a = [(p2.x - p1.x) / count, (p2.y - p1.y) / count], stepX = _a[0], stepY = _a[1]; + return Array(count) + .fill(1) + .map(function (_, i) { + return [ + { x: p1.x + stepX * i, y: p1.y + stepY * i }, + { x: p1.x + stepX * (i + 1), y: p1.y + stepY * (i + 1) }, + ]; + }); +} +function splitPolyline(points, count) { + if (points.length !== 2) { + var totalLen_1 = 0; + var lengths = []; + for (var i = 1; i < points.length; i++) { + var _a = points[i - 1], x1 = _a.x, y1 = _a.y, _b = points[i], x2 = _b.x, y2 = _b.y; + var len = new Vector2([x2 - x1, y2 - y1]).length(); + totalLen_1 += len; + lengths.push(len); + } + var counts = lengths.map(function (length) { + return Math.round((count * length) / totalLen_1); + }); + if (counts.reduce(function (p, c) { return p + c; }, 0) !== count) { + var intersection = counts.reduce(function (p, c) { return p + c; }, 0) - count; + var maxCountIndex_1 = 0, maxCount_1 = 0; + counts.forEach(function (c, i) { + if (c > maxCount_1) { + maxCount_1 = c; + maxCountIndex_1 = i; + } + }); + counts[maxCountIndex_1] + intersection; + } + return counts + .map(function (count, i) { + return splitLineEvenly(points[i], points[i + 1], count); + }) + .flat(); + } + else { + return splitLineEvenly(points[0], points[points.length - 1], count); + } +} +function getParallelOfPolyline(points, offset, side) { + var PI = Math.PI, cos = Math.cos, acos = Math.acos; + var angleBase = side === 'L' ? -PI / 2 : PI / 2; + return points.map(function (p, i) { + var baseUnitVec; //上一段的基准单位向量 + var angle; //偏转角度 + var len; //结合偏转角度的实际偏移量 + if (!points[i - 1] || !points[i + 1]) { + angle = angleBase; + len = offset; + baseUnitVec = points[i - 1] + ? new Vector2([ + p.x - points[i - 1].x, + p.y - points[i - 1].y, + ]).normalize() + : new Vector2([ + points[i + 1].x - p.x, + points[i + 1].y - p.y, + ]).normalize(); + } + else { + var vp = new Vector2([p.x - points[i - 1].x, p.y - points[i - 1].y]); + var vn = new Vector2([points[i + 1].x - p.x, points[i + 1].y - p.y]); + var cosTheta = Vector2.dot(vn, vp) / (vp.length() * vn.length()); + var direction = vp.x * vn.y - vp.y * vn.x > 0; //det(vp|vn)>0? + var theta = direction ? acos(cosTheta) : -acos(cosTheta); + angle = angleBase + theta / 2; + len = offset / cos(theta / 2); + baseUnitVec = Vector2.from(vp).normalize(); + } + return new pixi_js.Matrix() + .scale(len, len) + .rotate(angle) + .translate(p.x, p.y) + .apply(baseUnitVec); + }); +} + +// /** +// * 点线碰撞检测 +// * @param pa 线段a端坐标 +// * @param pb 线段b端坐标 +// * @param p 点坐标 +// * @param tolerance 容忍度,越大检测范围越大 +// * @returns +// */ +// export function linePoint(pa: Point, pb: Point, p: Point, tolerance: number): boolean { +// return (Math.abs(distanceSquared(pa.x, pa.y, pb.x, pb.y) - (distanceSquared(pa.x, pa.y, p.x, p.y) + distanceSquared(pb.x, pb.y, p.x, p.y))) <= tolerance) +// } +/** + * 根据点到直线的垂直距离计算碰撞 + * @param pa 线段a端坐标 + * @param pb 线段b端坐标 + * @param p 点坐标 + * @param lineWidth 线宽 + * @param exact 是否精确(使用给定线宽,否则线宽会设置为8) + * @returns + */ +function linePoint(pa, pb, p, lineWidth, exact) { + if (exact === void 0) { exact = false; } + if (!exact && lineWidth < 6) { + lineWidth = 6; + } + // 求直线的一般方程参数ABC,直线的一般式方程AX+BY+C=0 + var A = pa.y - pb.y; + var B = pb.x - pa.x; + var C = pa.x * pb.y - pa.y * pb.x; + // 计算点到直线垂直距离: d = |Ax+By+C|/sqrt(A*A+B*B),其中x,y为点坐标 + var dl = Math.abs(A * p.x + B * p.y + C) / Math.sqrt(A * A + B * B); + var intersect = dl <= lineWidth / 2; + if (intersect) { + // 距离在线宽范围内,再判断点是否超过线段两端点范围外(两端点外会有一点误差,两端点线宽一半半径的圆范围内) + var da = distance(pa.x, pa.y, p.x, p.y); + var db = distance(pb.x, pb.y, p.x, p.y); + var dab = distance(pa.x, pa.y, pb.x, pb.y); + return da <= dl + dab && db <= dl + dab; + } + return false; +} +/** + * 折线与点碰撞 + * @param points 折线端点列表 + * @param p 点座标 + * @param lineWidth 线宽 + */ +function polylinePoint(points, p, lineWidth) { + var len = points.length; + for (var i = 0; i < len - 1; i++) { + if (linePoint(points[i], points[i + 1], p, lineWidth)) { + return true; + } + } + return false; +} +/** + * 线线碰撞检测 + * @param pa 线段1a端坐标 + * @param pb 线段1b端坐标 + * @param p1 线段2a端坐标 + * @param p2 线段2b端坐标 + * @returns + */ +function lineLine(pa, pb, p1, p2) { + var x1 = pa.x; + var y1 = pa.y; + var x2 = pb.x; + var y2 = pb.y; + var x3 = p1.x; + var y3 = p1.y; + var x4 = p2.x; + var y4 = p2.y; + var s1_x = x2 - x1; + var s1_y = y2 - y1; + var s2_x = x4 - x3; + var s2_y = y4 - y3; + var s = (-s1_y * (x1 - x3) + s1_x * (y1 - y3)) / (-s2_x * s1_y + s1_x * s2_y); + var t = (s2_x * (y1 - y3) - s2_y * (x1 - x3)) / (-s2_x * s1_y + s1_x * s2_y); + return s >= 0 && s <= 1 && t >= 0 && t <= 1; +} +/** + * 点和矩形碰撞检测 + * @param p 点作弊 + * @param rect 矩形 + * @returns + */ +function pointBox(p, rect) { + var x = rect.x, y = rect.y, width = rect.width, height = rect.height; + var x2 = p.x; + var y2 = p.y; + return x2 >= x && x2 <= x + width && y2 >= y && y2 <= y + height; +} +/** + * 线和矩形碰撞检测 + * @param pa 线段a端坐标 + * @param pb 线段b端坐标 + * @param rect 矩形 + * @returns + */ +function lineBox(pa, pb, rect) { + if (pointBox(pa, rect) || pointBox(pb, rect)) { + return true; + } + var x = rect.x, y = rect.y, width = rect.width, height = rect.height; + var rp1 = new pixi_js.Point(x, y); + var rp2 = new pixi_js.Point(x + width, y); + var rp3 = new pixi_js.Point(x + width, y + height); + var rp4 = new pixi_js.Point(x, y + height); + return (lineLine(pa, pb, rp1, rp2) || + lineLine(pa, pb, rp2, rp3) || + lineLine(pa, pb, rp3, rp4) || + lineLine(pa, pb, rp1, rp4)); +} +/** + * 多线段和矩形碰撞检测 + * @param points + * @param rect + * @returns false / 碰撞的线段序号 + */ +function polylineBox(points, rect) { + if (points.length < 2) { + return false; + } + for (var i = 0; i < points.length - 1; i++) { + var p1 = points[i]; + var p2 = points[i + 1]; + if (lineBox(p1, p2, rect)) { + return true; + } + } + return false; +} +/** + * 两点碰撞检测 + * @param p1 + * @param p2 + * @param tolerance + * @returns + */ +function pointPoint2(p1, p2, tolerance) { + return pointPoint(p1.x, p1.y, p2.x, p2.y, tolerance); +} +/** + * 两点碰撞检测 + * @param x1 + * @param y1 + * @param x2 + * @param y2 + * @param tolerance 容忍度/两点半径和 + * @returns + */ +function pointPoint(x1, y1, x2, y2, tolerance) { + return distance(x1, y1, x2, y2) <= tolerance; +} +/** + * 两点距离 + * @param x1 + * @param y1 + * @param x2 + * @param y2 + * @returns + */ +function distance(x1, y1, x2, y2) { + return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); +} +/** + * 两点距离 + * @param p1 + * @param p2 + * @returns + */ +function distance2(p1, p2) { + return distance(p1.x, p1.y, p2.x, p2.y); +} +/** + * 圆和点的碰撞检测 + * @param x1 圆心x + * @param y1 圆心y + * @param r1 圆半径 + * @param x2 点x + * @param y2 点y + * @returns + */ +function circlePoint(x1, y1, r1, x2, y2) { + var x = x2 - x1; + var y = y2 - y1; + return x * x + y * y <= r1 * r1; +} +/** + * 圆和点的碰撞检测--不包括圆内部 + */ +function circlePoint2(x1, y1, r1, x2, y2, tolerance) { + var x = x2 - x1; + var y = y2 - y1; + return (x * x + y * y <= (r1 + tolerance) * (r1 + tolerance) && + x * x + y * y >= (r1 - tolerance) * (r1 - tolerance)); +} +/** + * 点和多边形碰撞检测 + */ +function pointPolygon(p, points, lineWidth) { + var x = p.x, y = p.y; + var length = points.length; + var c = false; + var i, j; + for (i = 0, j = length - 1; i < length; i++) { + if (points[i].y > y !== points[j].y > y && + x < + ((points[j].x - points[i].x) * (y - points[i].y)) / + (points[j].y - points[i].y) + + points[i].x) { + c = !c; + } + j = i; + } + if (c) { + return true; + } + for (i = 0; i < length - 1; i++) { + var p1 = void 0, p2 = void 0; + if (i === length - 1) { + p1 = points[i]; + p2 = points[0]; + } + else { + p1 = points[i]; + p2 = points[i + 1]; + } + if (linePoint(p1, p2, p, lineWidth)) { + return true; + } + } + return false; +} +/** + * 线和多边形碰撞检测 + * @param p1 + * @param p2 + * @param points + * @param tolerance 多边形包围线宽 + * @returns + */ +function linePolygon(p1, p2, points, lineWidth, polygonWidth) { + if (pointPolygon(p1, points, polygonWidth)) { + return true; + } + var length = points.length; + for (var i = 0; i < length; i++) { + var pa = void 0, pb = void 0; + if (i === length - 1) { + pa = points[i]; + pb = points[0]; + } + else { + pa = points[i]; + pb = points[i + 1]; + } + // TODO:此处后续需考虑有线宽的情况 + if (lineLine(pa, pb, p1, p2)) { + return true; + } + } + return false; +} +/** + * 多边线与多边形碰撞检测 + * @param polylinePoints 多边线所有点坐标 + * @param polygonPoints 多边形所有点坐标 + * @param polylineWidth 多边线的线宽 + * @param polygonWidth 多边形线宽 + * @returns + */ +function polylinePolygon(polylinePoints, polygonPoints, polylineWidth, polygonWidth) { + var length = polylinePoints.length; + for (var i = 0; i < length - 1; i++) { + var p1 = polylinePoints[i]; + var p2 = polylinePoints[i + 1]; + if (linePolygon(p1, p2, polygonPoints, polylineWidth, polygonWidth)) { + return true; + } + } + return false; +} + +function debounce(fn, waitMs) { + if (waitMs === void 0) { waitMs = 250; } + var timeoutId; + var debouncedFunction = function (context) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var invokeFunction = function () { + timeoutId = undefined; + fn.apply(context, args); + }; + if (timeoutId !== undefined) { + console.debug('debounce clear timeout', fn); + clearTimeout(timeoutId); + } + timeoutId = setTimeout(invokeFunction, waitMs); + }; + debouncedFunction.cancel = function () { + if (timeoutId !== undefined) { + clearTimeout(timeoutId); + } + }; + return debouncedFunction; +} + +var UP = new pixi_js.Point(0, -1); +var DOWN = new pixi_js.Point(0, 1); +var LEFT = new pixi_js.Point(-1, 0); +var RIGHT = new pixi_js.Point(1, 0); +/** + * 越界结果 + */ +var OutOfBound = /** @class */ (function () { + function OutOfBound(left, top, right, bottom) { + this.left = left; + this.top = top; + this.right = right; + this.bottom = bottom; + } + OutOfBound.check = function (rect, bound) { + var left = rect.left < bound.left; + var top = rect.top < bound.top; + var right = rect.right > bound.right; + var bottom = rect.bottom > bound.bottom; + return new OutOfBound(left, top, right, bottom); + }; + OutOfBound.none = function () { + return new OutOfBound(false, false, false, false); + }; + OutOfBound.leftOut = function () { + return new OutOfBound(true, false, false, false); + }; + OutOfBound.topOut = function () { + return new OutOfBound(false, true, false, false); + }; + OutOfBound.rightOut = function () { + return new OutOfBound(false, false, true, false); + }; + OutOfBound.bottomOut = function () { + return new OutOfBound(false, false, false, true); + }; + OutOfBound.leftTopOut = function () { + return new OutOfBound(true, true, false, false); + }; + OutOfBound.rightBottomOut = function () { + return new OutOfBound(false, false, true, true); + }; + return OutOfBound; +}()); + +/** + * 可吸附点图形参数 + */ +var AbsorbablePointParam = { + lineWidth: 1, + lineColor: '#000000', + fillColor: '#E77E0E', + radius: 5, // 半径 +}; +var AbsorbablePointGraphic = new pixi_js.Graphics(); +// AbsorbablePointGraphic.lineStyle( +// AbsorbablePointParam.lineWidth, +// AbsorbablePointParam.lineColor +// ); +AbsorbablePointGraphic.beginFill(AbsorbablePointParam.fillColor); +AbsorbablePointGraphic.drawCircle(0, 0, AbsorbablePointParam.radius); +AbsorbablePointGraphic.endFill(); +/** + * 可吸附点 + */ +/** @class */ ((function (_super) { + __extends(AbsorbablePoint, _super); + /** + * + * @param point 画布坐标 + * @param absorbRange + */ + function AbsorbablePoint(point, absorbRange) { + if (absorbRange === void 0) { absorbRange = 10; } + var _this = _super.call(this, AbsorbablePointGraphic.geometry) || this; + _this.scaledListenerOn = false; + _this._point = new pixi_js.Point(point.x, point.y); + _this.absorbRange = absorbRange; + _this.position.copyFrom(_this._point); + _this.interactive; + VectorGraphicUtil.handle(_this); + return _this; + } + AbsorbablePoint.prototype.compareTo = function (other) { + if (other instanceof AbsorbablePoint) { + return this.absorbRange - other.absorbRange; + } + throw new Error('非可吸附点'); + }; + AbsorbablePoint.prototype.isOverlapping = function (other) { + if (other instanceof AbsorbablePoint) { + return (this._point.equals(other._point) && + this.absorbRange === other.absorbRange); + } + return false; + }; + AbsorbablePoint.prototype.tryAbsorb = function () { + var objs = []; + for (var _i = 0; _i < arguments.length; _i++) { + objs[_i] = arguments[_i]; + } + for (var i = 0; i < objs.length; i++) { + var obj = objs[i]; + var canvasPosition = obj.getPositionOnCanvas(); + if (distance(this._point.x, this._point.y, canvasPosition.x, canvasPosition.y) < this.absorbRange) { + obj.updatePositionByCanvasPosition(this._point); + } + } + }; + AbsorbablePoint.prototype.updateOnScaled = function () { + var scaled = this.getAllParentScaled(); + var scale = Math.max(scaled.x, scaled.y); + this.scale.set(1 / scale, 1 / scale); + }; + return AbsorbablePoint; +})(pixi_js.Graphics)); +/** + * 可吸附线 + */ +var AbsorbableLine = /** @class */ (function (_super) { + __extends(AbsorbableLine, _super); + /** + * + * @param p1 画布坐标 + * @param p2 画布坐标 + * @param absorbRange + */ + function AbsorbableLine(p1, p2, absorbRange) { + if (absorbRange === void 0) { absorbRange = 20; } + var _this = _super.call(this) || this; + _this._color = '#E77E0E'; + _this.p1 = new pixi_js.Point(p1.x, p1.y); + _this.p2 = new pixi_js.Point(p2.x, p2.y); + _this.absorbRange = absorbRange; + _this.redraw(); + return _this; + } + AbsorbableLine.prototype.isOverlapping = function (other) { + if (other instanceof AbsorbableLine) { + var contain = isLineContainOther({ p1: this.p1, p2: this.p2 }, { p1: other.p1, p2: other.p2 }); + return contain; + } + return false; + }; + AbsorbableLine.prototype.compareTo = function (other) { + if (other instanceof AbsorbableLine) { + return distance2(this.p1, this.p2) - distance2(other.p1, other.p2); + } + throw new Error('非可吸附线'); + }; + AbsorbableLine.prototype.redraw = function () { + this.clear(); + this.lineStyle(1, new pixi_js.Color(this._color)); + this.moveTo(this.p1.x, this.p1.y); + this.lineTo(this.p2.x, this.p2.y); + }; + AbsorbableLine.prototype.tryAbsorb = function () { + var objs = []; + for (var _i = 0; _i < arguments.length; _i++) { + objs[_i] = arguments[_i]; + } + for (var i = 0; i < objs.length; i++) { + var obj = objs[i]; + var canvasPosition = obj.getPositionOnCanvas(); + if (linePoint(this.p1, this.p2, canvasPosition, this.absorbRange, true)) { + var fp = calculateFootPointFromPointToLine(this.p1, this.p2, canvasPosition); + obj.updatePositionByCanvasPosition(fp); + } + } + }; + return AbsorbableLine; +}(pixi_js.Graphics)); +/** + * 可吸附圆 + */ +var AbsorbableCircle = /** @class */ (function (_super) { + __extends(AbsorbableCircle, _super); + /** + * + * @param p 画布坐标 + * @param radius + * @param absorbRange + */ + function AbsorbableCircle(p, radius, absorbRange) { + if (absorbRange === void 0) { absorbRange = 10; } + var _this = _super.call(this) || this; + _this._color = '#E77E0E'; + _this.p0 = new pixi_js.Point(p.x, p.y); + _this.radius = radius; + _this.absorbRange = absorbRange; + _this.redraw(); + return _this; + } + AbsorbableCircle.prototype.isOverlapping = function (other) { + if (other instanceof AbsorbableCircle) { + return this.p0.equals(other.p0) && this.radius === other.radius; + } + return false; + }; + AbsorbableCircle.prototype.compareTo = function (other) { + if (other instanceof AbsorbableCircle) { + return this.absorbRange - other.absorbRange; + } + throw new Error('非可吸附圆'); + }; + AbsorbableCircle.prototype.redraw = function () { + this.clear(); + this.lineStyle(1, new pixi_js.Color(this._color)); + this.drawCircle(this.p0.x, this.p0.y, this.radius); + }; + AbsorbableCircle.prototype.tryAbsorb = function () { + var objs = []; + for (var _i = 0; _i < arguments.length; _i++) { + objs[_i] = arguments[_i]; + } + for (var i = 0; i < objs.length; i++) { + var obj = objs[i]; + var canvasPosition = obj.getPositionOnCanvas(); + var len = distance(this.p0.x, this.p0.y, canvasPosition.x, canvasPosition.y); + if (len > this.radius - this.absorbRange && + len < this.radius + this.absorbRange) { + // 吸附,计算直线与圆交点,更新对象坐标 + var p = calculateIntersectionPointOfCircleAndPoint(this.p0, this.radius, canvasPosition); + obj.updatePositionByCanvasPosition(p); + } + } + }; + return AbsorbableCircle; +}(pixi_js.Graphics)); + +var DefaultDashedLineOptions = { + length: 4, + startSpace: 0, + space: 4, + lineWidth: 1, + color: '#0000ff', +}; +var DashedLine = /** @class */ (function (_super) { + __extends(DashedLine, _super); + function DashedLine(p1, p2, options) { + var _this = _super.call(this) || this; + var config = Object.assign({}, DefaultDashedLineOptions, options); + _this._options = config; + _this.p1 = new pixi_js.Point(p1.x, p1.y); + _this.p2 = new pixi_js.Point(p2.x, p2.y); + _this.redraw(); + return _this; + } + DashedLine.prototype.setOptions = function (options) { + if (options.startSpace != undefined) { + this._options.startSpace = options.startSpace; + } + if (options.length != undefined) { + this._options.length = options.length; + } + if (options.space != undefined) { + this._options.space = options.space; + } + if (options.lineWidth != undefined) { + this._options.lineWidth = options.lineWidth; + } + if (options.color != undefined) { + this._options.color = options.color; + } + this.redraw(); + }; + DashedLine.prototype.redraw = function () { + this.removeChildren(); + var p1 = this.p1; + var p2 = this.p2; + var option = this._options; + var total = Math.pow(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2), 0.5); + var len = option.startSpace; + while (len < total) { + var dashedLen = option.length; + if (len + option.length > total) { + dashedLen = total - len; + } + var line = new pixi_js.Graphics(); + line.lineStyle(option.lineWidth, option.color); + line.moveTo(len, 0); + line.lineTo(len + dashedLen, 0); + this.addChild(line); + len = len + dashedLen + option.space; + } + this.pivot.set(0, option.lineWidth / 2); + this.position.set(p1.x, p1.y); + this.angle = angleToAxisx(p1, p2); + }; + return DashedLine; +}(pixi_js.Container)); + +var ShiftData = /** @class */ (function () { + function ShiftData(startPosition, currentPosition, lastPosition) { + this.startPosition = startPosition; + this.lastPosition = lastPosition; + this.currentPosition = currentPosition; + } + ShiftData.new = function (startPosition, currentPosition, lastPosition) { + return new ShiftData(startPosition, currentPosition, lastPosition); + }; + Object.defineProperty(ShiftData.prototype, "dx", { + get: function () { + if (!this.lastPosition || !this.currentPosition) { + throw new Error('错误的位移数据或阶段'); + } + return this.currentPosition.x - this.lastPosition.x; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ShiftData.prototype, "dy", { + get: function () { + if (!this.lastPosition || !this.currentPosition) { + throw new Error('错误的位移数据或阶段'); + } + return this.currentPosition.y - this.lastPosition.y; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ShiftData.prototype, "dsx", { + get: function () { + if (!this.currentPosition) { + throw new Error('错误的位移数据或阶段'); + } + return this.currentPosition.x - this.startPosition.x; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ShiftData.prototype, "dsy", { + get: function () { + if (!this.currentPosition) { + throw new Error('错误的位移数据或阶段'); + } + return this.currentPosition.y - this.startPosition.y; + }, + enumerable: false, + configurable: true + }); + return ShiftData; +}()); +var ScaleData = /** @class */ (function () { + function ScaleData(start, current, last) { + this.start = start; + this.current = current; + this.last = last; + } + ScaleData.new = function (start, current, last) { + return new ScaleData(start, current, last); + }; + return ScaleData; +}()); +/** + * 图形平移事件 + */ +var GraphicTransformEvent = /** @class */ (function () { + function GraphicTransformEvent(target, type, data) { + this.target = target; + this.type = type; + this.data = data; + } + GraphicTransformEvent.prototype.getData = function () { + return this.data; + }; + GraphicTransformEvent.shift = function (target, data) { + return new GraphicTransformEvent(target, 'shift', data); + }; + GraphicTransformEvent.scale = function (target) { + return new GraphicTransformEvent(target, 'scale', null); + }; + GraphicTransformEvent.rotate = function (target) { + return new GraphicTransformEvent(target, 'rotate', null); + }; + GraphicTransformEvent.skew = function (target) { + return new GraphicTransformEvent(target, 'skew', null); + }; + GraphicTransformEvent.prototype.isShift = function () { + return this.type === 'shift'; + }; + GraphicTransformEvent.prototype.isRotate = function () { + return this.type === 'rotate'; + }; + GraphicTransformEvent.prototype.isScale = function () { + return this.type === 'scale'; + }; + GraphicTransformEvent.prototype.isSkew = function () { + return this.type === 'skew'; + }; + return GraphicTransformEvent; +}()); +var GraphicTransformPlugin = /** @class */ (function (_super) { + __extends(GraphicTransformPlugin, _super); + function GraphicTransformPlugin(app) { + var _this = _super.call(this, app, GraphicTransformPlugin.Name, exports.InteractionPluginType.Other) || this; + _this.apContainer = new pixi_js.Container(); + _this.apContainer.name = GraphicTransformPlugin.AbsorbablePosisiontsName; + _this.app.canvas.addAssistantAppend(_this.apContainer); + app.on('options-update', function (options) { + if (options.absorbablePositions) { + _this.absorbablePositions = _this.filterAbsorbablePositions(options.absorbablePositions); + } + }); + return _this; + } + /** + * 过滤重复的吸附位置 + * @param positions + * @returns + */ + GraphicTransformPlugin.prototype.filterAbsorbablePositions = function (positions) { + var aps = []; + for (var i = 0; i < positions.length; i++) { + var ap1 = positions[i]; + var ap = ap1; + for (var j = positions.length - 1; j > i; j--) { + var ap2 = positions[j]; + if (ap.isOverlapping(ap2) && ap.compareTo(ap2) <= 0) { + ap = null; + break; + } + } + if (ap != null) { + aps.push(ap); + } + } + // console.log(positions, aps); + return aps; + }; + GraphicTransformPlugin.new = function (app) { + return new GraphicTransformPlugin(app); + }; + GraphicTransformPlugin.prototype.bind = function () { + this.app.on('drag_op_start', this.onDragStart, this); + this.app.on('drag_op_move', this.onDragMove, this); + this.app.on('drag_op_end', this.onDragEnd, this); + this.app.on('graphicselectedchange', this.onGraphicSelectedChange, this); + this.app.on('graphicchildselectedchange', this.onGraphicSelectedChange, this); + }; + GraphicTransformPlugin.prototype.unbind = function () { + this.app.off('drag_op_start', this.onDragStart, this); + this.app.off('drag_op_move', this.onDragMove, this); + this.app.off('drag_op_end', this.onDragEnd, this); + this.app.off('graphicselectedchange', this.onGraphicSelectedChange, this); + this.app.off('graphicchildselectedchange', this.onGraphicSelectedChange, this); + }; + GraphicTransformPlugin.prototype.getDraggedTargets = function (e) { + var _a; + var targets = []; + if (e.target.isGraphicChild() && e.target.selected && e.target.draggable) { + var graphic = e.target.getGraphic(); + // 图形子元素 + recursiveChildren(graphic, function (child) { + if (child.selected && child.draggable) { + targets.push(child); + } + }); + } + else if ((e.target.isGraphic() || e.target.isGraphicChild()) && + ((_a = e.target.getGraphic()) === null || _a === void 0 ? void 0 : _a.draggable)) { + // 图形对象 + targets.push.apply(targets, this.app.selectedGraphics); + } + else if (e.target.draggable) { + targets.push(e.target); + } + return targets; + }; + GraphicTransformPlugin.prototype.onDragStart = function (e) { + var _a; + if (!e.target.isCanvas() && e.isLeftButton) { + var targets = this.getDraggedTargets(e); + if (targets.length > 0) { + targets.forEach(function (target) { + target.shiftStartPoint = target.position.clone(); + target.emit('transformstart', GraphicTransformEvent.shift(target, ShiftData.new(target.shiftStartPoint))); + }); + // 显示吸附图形 + if (this.absorbablePositions && this.absorbablePositions.length > 0) { + this.apContainer.removeChildren(); + (_a = this.apContainer).addChild.apply(_a, this.absorbablePositions); + } + } + } + }; + GraphicTransformPlugin.prototype.onDragMove = function (e) { + if (!e.target.isCanvas() && e.isLeftButton) { + var targets = this.getDraggedTargets(e); + if (targets.length > 0) { + // 处理位移 + targets.forEach(function (target) { + if (target.shiftStartPoint) { + target.shiftLastPoint = target.position.clone(); + var _a = e.toTargetShiftLen(target.parent), dx = _a.dx, dy = _a.dy; + target.position.set(target.shiftStartPoint.x + dx, target.shiftStartPoint.y + dy); + } + }); + // 处理吸附 + if (this.absorbablePositions) { + for (var i = 0; i < this.absorbablePositions.length; i++) { + var ap = this.absorbablePositions[i]; + ap.tryAbsorb.apply(ap, targets); + } + } + // const start = new Date().getTime(); + // 事件发布 + targets.forEach(function (target) { + if (target.shiftStartPoint && target.shiftLastPoint) { + target.emit('transforming', GraphicTransformEvent.shift(target, ShiftData.new(target.shiftStartPoint, target.position.clone(), target.shiftLastPoint))); + } + }); + // const dt = new Date().getTime() - start; + // console.log('拖拽耗时', `${dt}ms`, targets); + } + } + }; + GraphicTransformPlugin.prototype.onDragEnd = function (e) { + if (!e.target.isCanvas() && e.isLeftButton) { + var targets = this.getDraggedTargets(e); + targets.forEach(function (target) { + if (target.shiftStartPoint) { + target.emit('transformend', GraphicTransformEvent.shift(target, ShiftData.new(target.shiftStartPoint, target.position.clone()))); + } + target.shiftStartPoint = null; + }); + } + this.clearCache(); + }; + /** + * 清理缓存 + */ + GraphicTransformPlugin.prototype.clearCache = function () { + // 移除吸附图形 + this.absorbablePositions = []; + this.apContainer.removeChildren(); + }; + GraphicTransformPlugin.prototype.onGraphicSelectedChange = function (g, selected) { + var br = g.getAssistantAppend(BoundsGraphic.Name); + if (!br) { + // 绘制辅助包围框 + br = new BoundsGraphic(g); + } + if (selected) { + if (br) { + br.redraw(); + br.visible = true; + } + } + else { + if (br) { + br.visible = false; + } + } + if (g.scalable || g.rotatable) { + // 缩放点 + var sp = g.getAssistantAppend(TransformPoints.Name); + if (!sp) { + sp = new TransformPoints(g); + } + if (selected) { + sp.update(); + sp.visible = true; + } + else { + sp.visible = false; + } + } + }; + GraphicTransformPlugin.Name = '__graphic_transform_plugin'; + GraphicTransformPlugin.AbsorbablePosisiontsName = '__AbsorbablePosisionts'; + return GraphicTransformPlugin; +}(InteractionPluginBase)); +/** + * 缩放、旋转辅助 + */ +var TransformPoints = /** @class */ (function (_super) { + __extends(TransformPoints, _super); + function TransformPoints(obj) { + var _this = _super.call(this) || this; + _this.ltLocal = new pixi_js.Point(); + _this.tLocal = new pixi_js.Point(); + _this.tCanvas = new pixi_js.Point(); + _this.rtLocal = new pixi_js.Point(); + _this.rLocal = new pixi_js.Point(); + _this.rbLocal = new pixi_js.Point(); + _this.bLocal = new pixi_js.Point(); + _this.lbLocal = new pixi_js.Point(); + _this.lLocal = new pixi_js.Point(); + _this.originScale = new pixi_js.Point(); + _this.scalePivot = new pixi_js.Point(); + /** + * 起始图形角度 + */ + _this.startAngle = 0; + /** + * 旋转角度步长 + */ + _this.angleStep = 1; + /** + * 修改旋转步长键盘监听 + */ + _this.rotateAngleStepKeyListeners = []; + _this.obj = obj; + _this.name = TransformPoints.Name; + _this.angleAssistantText = new VectorText('', { + fill: AppConsts.assistantElementColor, + }); + _this.angleAssistantText.setVectorFontSize(16); + _this.angleAssistantText.anchor.set(0.5); + // 创建缩放拖拽点 + _this.ltScalePoint = new DraggablePoint(new pixi_js.Point()); + _this.ltScalePoint.name = TransformPoints.LeftTopName; + _this.addChild(_this.ltScalePoint); + _this.tScalePoint = new DraggablePoint(new pixi_js.Point()); + _this.tScalePoint.name = TransformPoints.TopName; + _this.addChild(_this.tScalePoint); + _this.rtScalePoint = new DraggablePoint(new pixi_js.Point()); + _this.rtScalePoint.name = TransformPoints.RightTopName; + _this.addChild(_this.rtScalePoint); + _this.rScalePoint = new DraggablePoint(new pixi_js.Point()); + _this.rScalePoint.name = TransformPoints.RightName; + _this.addChild(_this.rScalePoint); + _this.rbScalePoint = new DraggablePoint(new pixi_js.Point()); + _this.rbScalePoint.name = TransformPoints.RightBottomName; + _this.addChild(_this.rbScalePoint); + _this.bScalePoint = new DraggablePoint(new pixi_js.Point()); + _this.bScalePoint.name = TransformPoints.BottomName; + _this.addChild(_this.bScalePoint); + _this.lbScalePoint = new DraggablePoint(new pixi_js.Point()); + _this.lbScalePoint.name = TransformPoints.LeftBottomName; + _this.addChild(_this.lbScalePoint); + _this.lScalePoint = new DraggablePoint(new pixi_js.Point()); + _this.lScalePoint.name = TransformPoints.LeftName; + _this.addChild(_this.lScalePoint); + _this.obj.on('transformstart', _this.onObjTransformStart, _this); + _this.obj.on('transformend', _this.onObjTransformEnd, _this); + if (_this.obj.children && _this.obj.children.length > 0) { + recursiveChildren(_this.obj, function (child) { + child.on('transformstart', _this.onObjTransformStart, _this); + child.on('transformend', _this.onObjTransformEnd, _this); + }); + } + var pg = _this.obj.getGraphic(); + if (pg != null) { + pg.on('transformstart', _this.onObjTransformStart, _this); + pg.on('transformend', _this.onObjTransformEnd, _this); + } + _this.obj.on('repaint', _this.onGraphicRepaint, _this); + _this.children.forEach(function (dp) { + dp.on('transformstart', _this.onScaleDragStart, _this); + dp.on('transforming', _this.onScaleDragMove, _this); + dp.on('transformend', _this.onScaleDragEnd, _this); + }); + // 创建旋转拖拽点 + _this.rotatePoint = new DraggablePoint(new pixi_js.Point()); + _this.addChild(_this.rotatePoint); + _this.rotatePoint.on('transformstart', _this.onRotateStart, _this); + _this.rotatePoint.on('transforming', _this.onRotateMove, _this); + _this.rotatePoint.on('transformend', _this.onRotateEnd, _this); + _this.rotatePivot = new pixi_js.Point(); + _this.rotateLastPoint = new pixi_js.Point(); + var _loop_1 = function (i) { + this_1.rotateAngleStepKeyListeners.push(KeyListener.create({ + value: '' + i, + onPress: function () { + // console.log('修改角度step'); + _this.angleStep = i; + }, + })); + }; + var this_1 = this; + // 初始化旋转角度修改键盘监听器 + for (var i = 1; i < 10; i++) { + _loop_1(i); + } + _this.obj.addAssistantAppend(_this); + return _this; + } + TransformPoints.prototype.onObjTransformStart = function () { + this.visible = false; + }; + TransformPoints.prototype.onObjTransformEnd = function () { + this.update(); + this.visible = true; + }; + TransformPoints.prototype.onGraphicRepaint = function () { + if (this.visible) { + this.update(); + } + }; + /** + * 旋转开始 + * @param de + */ + TransformPoints.prototype.onRotateStart = function (de) { + this.hideAll(); + var assistantPoint = this.obj.localToCanvasPoint(this.obj.pivot); + this.rotatePivot.copyFrom(assistantPoint); + this.rotateLastPoint.copyFrom(de.target.position); + this.startAngle = this.obj.angle; + var app = this.obj.getGraphicApp(); + this.rotateAngleStepKeyListeners.forEach(function (listener) { + return app.addKeyboardListener(listener); + }); + this.obj.emit('transformstart', GraphicTransformEvent.rotate(this.obj)); + // app.emit('transformstart', app.selectedGraphics); + this.obj.getCanvas().addAssistantAppends(this.angleAssistantText); + this.updateAngleAssistantText(de); + }; + TransformPoints.prototype.updateAngleAssistantText = function (de) { + var _a, _b, _c; + this.angleAssistantText.text = this.obj.angle + '°'; + var cursorPoint = (_a = de.data) === null || _a === void 0 ? void 0 : _a.startPosition; + if ((_b = de.data) === null || _b === void 0 ? void 0 : _b.currentPosition) { + cursorPoint = (_c = de.data) === null || _c === void 0 ? void 0 : _c.currentPosition; + } + if (cursorPoint) { + this.angleAssistantText.position.x = cursorPoint.x; + this.angleAssistantText.position.y = cursorPoint.y - 10; + } + }; + /** + * 旋转移动 + * @param de + */ + TransformPoints.prototype.onRotateMove = function (de) { + // 旋转角度计算逻辑:取锚点y负方向一点作为旋转点,求旋转点和锚点所形成的直线与x轴角度,此角度+90°即为最终旋转角度,再将旋转角度限制到(-180,180]之间 + var angle = angleToAxisx(this.rotatePivot, de.target.position); + angle = Math.floor(angle / this.angleStep) * this.angleStep; + var parentAngle = this.obj.parent.worldAngle; + angle = (angle + 90 - parentAngle) % 360; + if (angle > 180) { + angle = angle - 360; + } + this.obj.angle = angle; + this.updateAngleAssistantText(de); + // this.obj.emit('rotatemove', this.obj); + }; + /** + * 旋转结束 + * @param de + */ + TransformPoints.prototype.onRotateEnd = function () { + var _this = this; + this.showAll(); + this.obj.getCanvas().removeAssistantAppends(this.angleAssistantText); + this.rotateAngleStepKeyListeners.forEach(function (listener) { + return _this.obj.getGraphicApp().removeKeyboardListener(listener); + }); + this.obj.emit('transformend', GraphicTransformEvent.rotate(this.obj)); + }; + /** + * 缩放开始 + */ + TransformPoints.prototype.onScaleDragStart = function () { + this.hideAll(); + var points = convertRectangleToPolygonPoints(this.obj.getLocalBounds()); + var p0 = points[0]; + var p1 = points[1]; + var p2 = points[2]; + var p3 = points[3]; + this.scalePivot = this.obj.pivot.clone(); + this.ltLocal.copyFrom(p0); + this.tCanvas.copyFrom(this.obj.localToCanvasPoint(calculateLineMidpoint(p0, p1))); + this.tLocal.copyFrom(calculateLineMidpoint(p0, p1)); + this.rtLocal.copyFrom(p1); + this.rLocal.copyFrom(calculateLineMidpoint(p1, p2)); + this.rbLocal.copyFrom(p2); + this.bLocal.copyFrom(calculateLineMidpoint(p2, p3)); + this.lbLocal.copyFrom(p3); + this.lLocal.copyFrom(calculateLineMidpoint(p0, p3)); + this.originScale = this.obj.scale.clone(); + this.obj.emit('transformstart', GraphicTransformEvent.scale(this.obj)); + }; + TransformPoints.prototype.onScaleDragMove = function (e) { + // 缩放计算逻辑:共8个方向缩放点,根据所拖拽的方向: + // 1,计算缩放为1时的此点在拖拽开始时的位置到锚点x、y距离, + // 2,计算拖拽点的当前位置到锚点的x、y方向距离, + // PS:以上两个计算都是在local(也就是图形对象本地)坐标系, + // 用当前距离除以原始距离即为缩放比例 + var defaultScale = new pixi_js.Point(1, 1); + var originWidth = 0; + var originHeight = 0; + var width = 0; + var height = 0; + this.obj.scale.copyFrom(defaultScale); + var point = this.obj.toLocal(e.target.parent.localToScreenPoint(e.target.position)); + if (e.target === this.ltScalePoint) { + // 左上角 + originWidth = Math.abs(this.ltLocal.x - this.scalePivot.x); + originHeight = Math.abs(this.ltLocal.y - this.scalePivot.y); + width = Math.abs(point.x - this.scalePivot.x); + height = Math.abs(point.y - this.scalePivot.y); + } + else if (e.target == this.tScalePoint) { + // 上 + originHeight = Math.abs(this.tLocal.y - this.scalePivot.y); + height = Math.abs(point.y - this.scalePivot.y); + } + else if (e.target == this.rtScalePoint) { + // 右上 + originWidth = Math.abs(this.rtLocal.x - this.scalePivot.x); + originHeight = Math.abs(this.rtLocal.y - this.scalePivot.y); + width = Math.abs(point.x - this.scalePivot.x); + height = Math.abs(point.y - this.scalePivot.y); + } + else if (e.target == this.rScalePoint) { + // 右 + originWidth = Math.abs(this.rLocal.x - this.scalePivot.x); + width = Math.abs(point.x - this.scalePivot.x); + } + else if (e.target == this.rbScalePoint) { + // 右下 + originWidth = Math.abs(this.rbLocal.x - this.scalePivot.x); + originHeight = Math.abs(this.rbLocal.y - this.scalePivot.y); + width = Math.abs(point.x - this.scalePivot.x); + height = Math.abs(point.y - this.scalePivot.y); + } + else if (e.target == this.bScalePoint) { + // 下 + originHeight = Math.abs(this.bLocal.y - this.scalePivot.y); + height = Math.abs(point.y - this.scalePivot.y); + } + else if (e.target == this.lbScalePoint) { + // 左下 + originWidth = Math.abs(this.lbLocal.x - this.scalePivot.x); + originHeight = Math.abs(this.lbLocal.y - this.scalePivot.y); + width = Math.abs(point.x - this.scalePivot.x); + height = Math.abs(point.y - this.scalePivot.y); + } + else { + // 左 + originWidth = Math.abs(this.lLocal.x - this.scalePivot.x); + width = Math.abs(point.x - this.scalePivot.x); + } + // 计算缩放比例,并根据是否保持纵横比两种情况进行缩放处理 + var sx = originWidth == 0 ? this.originScale.x : width / originWidth; + var sy = originHeight == 0 ? this.originScale.y : height / originHeight; + // console.log(originWidth, originHeight, width, height, sx, sy); + if (this.obj.keepAspectRatio) { + var max = Math.max(sx, sy); + if (originWidth == 0) { + max = sy; + } + else if (originHeight == 0) { + max = sx; + } + this.obj.scale.set(max, max); + } + else { + this.obj.scale.x = sx; + this.obj.scale.y = sy; + } + }; + TransformPoints.prototype.onScaleDragEnd = function () { + this.showAll(); + this.obj.emit('transformend', GraphicTransformEvent.scale(this.obj)); + }; + TransformPoints.prototype.hideOthers = function (dg) { + this.children.forEach(function (child) { + if (child.name !== dg.name) { + child.visible = false; + } + }); + }; + TransformPoints.prototype.hideAll = function () { + this.children.forEach(function (child) { return (child.visible = false); }); + }; + TransformPoints.prototype.showAll = function () { + this.update(); + this.children.forEach(function (child) { return (child.visible = true); }); + }; + TransformPoints.prototype.getObjBounds = function () { + var points = this.obj.localBoundsToCanvasPoints(); + var p0 = points[0]; + var p1 = points[1]; + var p3 = points[3]; + var width = distance(p0.x, p0.y, p1.x, p1.y); + var height = distance(p0.x, p0.y, p3.x, p3.y); + return { width: width, height: height }; + }; + /** + * 更新位置和cursor + * @returns + */ + TransformPoints.prototype.update = function () { + if (this.obj.scalable) { + this.updateScalePoints(); + } + if (this.obj.rotatable) { + this.updateRotatePoint(); + } + }; + TransformPoints.prototype.updateRotatePoint = function () { + var rect = this.obj.getLocalBounds(); + var lp = this.obj.pivot.clone(); + var dy = 10 / this.obj.scale.y; + lp.y = rect.y - dy; + var p = this.obj.localToCanvasPoint(lp); + this.rotatePoint.position.copyFrom(p); + }; + TransformPoints.prototype.updateScalePoints = function () { + var points = this.obj.localBoundsToCanvasPoints(); + this.ltScalePoint.position.copyFrom(points[0]); + this.tScalePoint.position.copyFrom(calculateLineMidpoint(points[0], points[1])); + this.rtScalePoint.position.copyFrom(points[1]); + this.rScalePoint.position.copyFrom(calculateLineMidpoint(points[1], points[2])); + this.rbScalePoint.position.copyFrom(points[2]); + this.bScalePoint.position.copyFrom(calculateLineMidpoint(points[2], points[3])); + this.lbScalePoint.position.copyFrom(points[3]); + this.lScalePoint.position.copyFrom(calculateLineMidpoint(points[3], points[0])); + var angle = this.obj.worldAngle; + var angle360 = (360 + angle) % 360; + if ((angle >= -22.5 && angle <= 22.5) || + (angle360 >= 180 - 22.5 && angle360 <= 180 + 22.5)) { + this.ltScalePoint.cursor = 'nw-resize'; + this.tScalePoint.cursor = 'n-resize'; + this.rtScalePoint.cursor = 'ne-resize'; + this.rScalePoint.cursor = 'e-resize'; + this.rbScalePoint.cursor = 'se-resize'; + this.bScalePoint.cursor = 's-resize'; + this.lbScalePoint.cursor = 'sw-resize'; + this.lScalePoint.cursor = 'w-resize'; + } + else if ((angle >= 22.5 && angle <= 67.5) || + (angle360 >= 180 + 22.5 && angle360 <= 180 + 67.5)) { + this.ltScalePoint.cursor = 'n-resize'; + this.tScalePoint.cursor = 'ne-resize'; + this.rtScalePoint.cursor = 'e-resize'; + this.rScalePoint.cursor = 'se-resize'; + this.rbScalePoint.cursor = 's-resize'; + this.bScalePoint.cursor = 'sw-resize'; + this.lbScalePoint.cursor = 'w-resize'; + this.lScalePoint.cursor = 'nw-resize'; + } + else if ((angle >= 67.5 && angle < 112.5) || + (angle360 >= 180 + 67.5 && angle360 <= 180 + 112.5)) { + this.ltScalePoint.cursor = 'ne-resize'; + this.tScalePoint.cursor = 'e-resize'; + this.rtScalePoint.cursor = 'se-resize'; + this.rScalePoint.cursor = 's-resize'; + this.rbScalePoint.cursor = 'sw-resize'; + this.bScalePoint.cursor = 'w-resize'; + this.lbScalePoint.cursor = 'nw-resize'; + this.lScalePoint.cursor = 'n-resize'; + } + else { + this.ltScalePoint.cursor = 'e-resize'; + this.tScalePoint.cursor = 'se-resize'; + this.rtScalePoint.cursor = 's-resize'; + this.rScalePoint.cursor = 'sw-resize'; + this.rbScalePoint.cursor = 'w-resize'; + this.bScalePoint.cursor = 'nw-resize'; + this.lbScalePoint.cursor = 'n-resize'; + this.lScalePoint.cursor = 'ne-resize'; + } + }; + TransformPoints.Name = 'transformPoints'; + TransformPoints.MinLength = 40; + TransformPoints.LeftTopName = 'lt-scale-point'; + TransformPoints.TopName = 't-scale-point'; + TransformPoints.RightTopName = 'rt-scale-point'; + TransformPoints.RightName = 'r-scale-point'; + TransformPoints.RightBottomName = 'rb-scale-point'; + TransformPoints.BottomName = 'b-scale-point'; + TransformPoints.LeftBottomName = 'lb-scale-point'; + TransformPoints.LeftName = 'l-scale-point'; + TransformPoints.RotateName = 'rotate-point'; + return TransformPoints; +}(pixi_js.Container)); +/** + * 包围盒矩形图形,现使用外边框转画布多边形实现 + */ +var BoundsGraphic = /** @class */ (function (_super) { + __extends(BoundsGraphic, _super); + function BoundsGraphic(graphic) { + var _this = _super.call(this) || this; + _this.obj = graphic; + _this.name = BoundsGraphic.Name; + _this.visible = false; + _this.debouncedRedraw = debounce(_this.doRedraw, 50); + _this.obj.on('transformstart', _this.onObjTransformStart, _this); + _this.obj.on('transformend', _this.onObjTransformEnd, _this); + if (_this.obj.children && _this.obj.children.length > 0) { + recursiveChildren(_this.obj, function (child) { + child.on('transformstart', _this.onObjTransformStart, _this); + child.on('transformend', _this.onObjTransformEnd, _this); + }); + } + var pg = _this.obj.getGraphic(); + if (pg != null) { + pg.on('transformstart', _this.onObjTransformStart, _this); + pg.on('transformend', _this.onObjTransformEnd, _this); + } + _this.obj.on('repaint', _this.onGraphicRepaint, _this); + graphic.addAssistantAppend(_this); + return _this; + } + BoundsGraphic.prototype.onObjTransformStart = function () { + this.visible = false; + }; + BoundsGraphic.prototype.onObjTransformEnd = function () { + this.redraw(); + this.visible = true; + }; + BoundsGraphic.prototype.onGraphicRepaint = function () { + if (this.visible) { + this.redraw(); + } + }; + BoundsGraphic.prototype.destroy = function (options) { + if (this.obj.isGraphic()) { + this.obj.off('repaint', this.onGraphicRepaint, this); + } + _super.prototype.destroy.call(this, options); + }; + BoundsGraphic.prototype.redraw = function () { + this.debouncedRedraw(this); + }; + BoundsGraphic.prototype.doRedraw = function () { + var visible = this.visible; + this.visible = false; // 屏蔽包围框本身 + var bounds = new pixi_js.Polygon(this.obj.localBoundsToCanvasPoints()); + this.clear().lineStyle(BoundsGraphic.BoundsLineStyle).drawShape(bounds); + this.visible = visible; + }; + BoundsGraphic.Name = '_BoundsRect'; + BoundsGraphic.BoundsLineStyle = { + width: 1, + color: '#1976d2', + alpha: 1, + }; + return BoundsGraphic; +}(pixi_js.Graphics)); + +/** + * 图形动画管理 + */ +var AnimationManager = /** @class */ (function () { + function AnimationManager(app) { + this.app = app; + this._pause = false; + this.graphicAnimationMap = new Map(); + // 动画控制 + app.pixi.ticker.add(this.run, this); + } + AnimationManager.prototype.run = function (dt) { + if (this._pause) { + // 暂停 + return; + } + this.graphicAnimationMap.forEach(function (map) { + map.forEach(function (animation) { + if (animation.running) { + animation.run(dt); + } + }); + }); + }; + AnimationManager.prototype.pause = function () { + this._pause = true; + }; + AnimationManager.prototype.resume = function () { + this._pause = false; + }; + AnimationManager.prototype.destroy = function () { + this.app.pixi.ticker.remove(this.run, this); + }; + /** + * 图形对象的所有动画map + * @param graphic + * @returns + */ + AnimationManager.prototype.animationMap = function (graphic) { + var map = this.graphicAnimationMap.get(graphic.id); + if (!map) { + map = new Map(); + this.graphicAnimationMap.set(graphic.id, map); + } + return map; + }; + /** + * 注册图形动画 + * @param graphic + * @param animation + */ + AnimationManager.prototype.registerAnimation = function (graphic, animation) { + this.animationMap(graphic).set(animation.name, animation); + }; + /** + * 删除图形动画 + * @param graphic + * @param name + */ + AnimationManager.prototype.unregisterAnimation = function (graphic, name) { + this.animationMap(graphic).delete(name); + }; + /** + * 删除所有图形动画 + * @param graphic + */ + AnimationManager.prototype.unregisterGraphicAnimations = function (graphic) { + this.animationMap(graphic).clear(); + }; + /** + * 获取图形指定名称动画 + * @param graphic + * @param name + * @returns + */ + AnimationManager.prototype.animation = function (graphic, name) { + return this.animationMap(graphic).get(name); + }; + return AnimationManager; +}()); + +/** + * 操作 + */ +var JlOperation = /** @class */ (function () { + function JlOperation(app, type) { + this.description = ''; // 操作描述 + this.app = app; + this.type = type; + } + JlOperation.prototype.undo1 = function () { + var _a; + var updates = this.undo(); + if (updates) { + (_a = this.app).updateSelected.apply(_a, updates); + } + }; + JlOperation.prototype.redo1 = function () { + var _a; + var updates = this.redo(); + if (updates) { + (_a = this.app).updateSelected.apply(_a, updates); + } + }; + return JlOperation; +}()); +/** + * 操作记录 + */ +var OperationRecord = /** @class */ (function () { + function OperationRecord(maxLen) { + if (maxLen === void 0) { maxLen = 100; } + this.undoStack = []; + this.redoStack = []; + this.maxLen = maxLen; + } + Object.defineProperty(OperationRecord.prototype, "hasUndo", { + get: function () { + return this.undoStack.length > 0; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(OperationRecord.prototype, "hasRedo", { + get: function () { + return this.redoStack.length > 0; + }, + enumerable: false, + configurable: true + }); + OperationRecord.prototype.setMaxLen = function (v) { + this.maxLen = v; + var len = this.undoStack.length; + if (len > v) { + var removeCount = len - v; + this.undoStack.splice(0, removeCount); + } + }; + /** + * 记录 + * @param op + */ + OperationRecord.prototype.record = function (op) { + if (this.undoStack.length >= this.maxLen) { + this.undoStack.shift(); + } + // console.log('operation record', op) + this.undoStack.push(op); + this.redoStack.splice(0, this.redoStack.length); + }; + /** + * 撤销 + */ + OperationRecord.prototype.undo = function () { + var op = this.undoStack.pop(); + // console.log('撤销', op); + if (op) { + op.undo1(); + this.redoStack.push(op); + } + }; + /** + * 重做 + */ + OperationRecord.prototype.redo = function () { + var op = this.redoStack.pop(); + // console.log('重做', op); + if (op) { + op.redo1(); + this.undoStack.push(op); + } + }; + return OperationRecord; +}()); + +/** + * 更新画布操作 + */ +var UpdateCanvasOperation = /** @class */ (function (_super) { + __extends(UpdateCanvasOperation, _super); + function UpdateCanvasOperation(app, obj, old, data) { + var _this = _super.call(this, app, 'update-canvas') || this; + _this.description = ''; + _this.app = app; + _this.obj = obj; + _this.old = old; + _this.data = data; + return _this; + } + UpdateCanvasOperation.prototype.undo = function () { + this.obj.update(this.old); + return []; + }; + UpdateCanvasOperation.prototype.redo = function () { + this.obj.update(this.data); + return []; + }; + return UpdateCanvasOperation; +}(JlOperation)); +/** + * 创建图形操作 + */ +var GraphicCreateOperation = /** @class */ (function (_super) { + __extends(GraphicCreateOperation, _super); + function GraphicCreateOperation(app, obj) { + var _this = _super.call(this, app, 'graphic-create') || this; + _this.description = ''; + _this.app = app; + _this.obj = obj; + return _this; + } + GraphicCreateOperation.prototype.undo = function () { + var _a; + (_a = this.app).deleteGraphics.apply(_a, this.obj); + }; + GraphicCreateOperation.prototype.redo = function () { + var _a; + (_a = this.app).addGraphics.apply(_a, this.obj); + return this.obj; + }; + return GraphicCreateOperation; +}(JlOperation)); +/** + * 删除图形操作 + */ +var GraphicDeleteOperation = /** @class */ (function (_super) { + __extends(GraphicDeleteOperation, _super); + function GraphicDeleteOperation(app, obj) { + var _this = _super.call(this, app, 'graphic-delete') || this; + _this.app = app; + _this.obj = obj; + return _this; + } + GraphicDeleteOperation.prototype.undo = function () { + var _a; + (_a = this.app).addGraphics.apply(_a, this.obj); + return this.obj; + }; + GraphicDeleteOperation.prototype.redo = function () { + var _a; + (_a = this.app).deleteGraphics.apply(_a, this.obj); + }; + return GraphicDeleteOperation; +}(JlOperation)); +var GraphicDataUpdateOperation = /** @class */ (function (_super) { + __extends(GraphicDataUpdateOperation, _super); + function GraphicDataUpdateOperation(app, obj, oldData, newData) { + var _this = _super.call(this, app, 'graphic-drag') || this; + _this.obj = __spreadArray([], obj, true); + _this.oldData = oldData; + _this.newData = newData; + return _this; + } + GraphicDataUpdateOperation.prototype.undo = function () { + for (var i = 0; i < this.obj.length; i++) { + var g = this.obj[i]; + // g.exitChildEdit(); + g.updateData(this.oldData[i]); + } + return this.obj; + }; + GraphicDataUpdateOperation.prototype.redo = function () { + for (var i = 0; i < this.obj.length; i++) { + var g = this.obj[i]; + // g.exitChildEdit(); + g.updateData(this.newData[i]); + } + return this.obj; + }; + return GraphicDataUpdateOperation; +}(JlOperation)); + +/** + * 图形关系数据 + */ +var GraphicRelationParam = /** @class */ (function () { + function GraphicRelationParam(g, param) { + if (param === void 0) { param = null; } + this.g = g; + this.param = param; + } + GraphicRelationParam.prototype.isTheGraphic = function (g) { + return this.g.id === g.id; + }; + GraphicRelationParam.prototype.getGraphic = function () { + return this.g; + }; + GraphicRelationParam.prototype.getParam = function () { + return this.param; + }; + GraphicRelationParam.prototype.equals = function (other) { + return this.isTheGraphic(other.g) && this.param === other.param; + }; + return GraphicRelationParam; +}()); +/** + * 图形关系 + */ +var GraphicRelation = /** @class */ (function () { + function GraphicRelation(rp1, rp2) { + this.rp1 = rp1; + this.rp2 = rp2; + } + GraphicRelation.prototype.contains = function (g) { + return this.rp1.isTheGraphic(g) || this.rp2.isTheGraphic(g); + }; + /** + * 获取给定图形的关系参数 + * @param g + * @returns + */ + GraphicRelation.prototype.getRelationParam = function (g) { + if (!this.contains(g)) { + throw new Error("\u56FE\u5F62\u5173\u7CFB".concat(this.rp1.g.id, "-").concat(this.rp2.g.id, "\u4E2D\u4E0D\u5305\u542B\u7ED9\u5B9A\u56FE\u5F62").concat(g.id)); + } + if (this.rp1.isTheGraphic(g)) { + return this.rp1; + } + else { + return this.rp2; + } + }; + /** + * 获取关联的另一个图形的关系参数 + * @param g + * @returns + */ + GraphicRelation.prototype.getOtherRelationParam = function (g) { + if (!this.contains(g)) { + throw new Error("\u56FE\u5F62\u5173\u7CFB".concat(this.rp1.g.id, "-").concat(this.rp2.g.id, "\u4E2D\u4E0D\u5305\u542B\u7ED9\u5B9A\u56FE\u5F62").concat(g.id)); + } + if (this.rp1.isTheGraphic(g)) { + return this.rp2; + } + else { + return this.rp1; + } + }; + /** + * 获取关联的另一个图形对象 + * @param g + * @returns graphic + */ + GraphicRelation.prototype.getOtherGraphic = function (g) { + return this.getOtherRelationParam(g).g; + }; + GraphicRelation.prototype.equals = function (orp1, orp2) { + if (this.rp1.isTheGraphic(orp1.g)) { + return this.rp1.equals(orp1) && this.rp2.equals(orp2); + } + else if (this.rp1.isTheGraphic(orp2.g)) { + return this.rp1.equals(orp2) && this.rp2.equals(orp1); + } + return false; + }; + GraphicRelation.prototype.isEqualOther = function (other) { + return this.equals(other.rp1, other.rp2); + }; + return GraphicRelation; +}()); +/** + * 图形关系管理 + */ +var RelationManage = /** @class */ (function () { + function RelationManage() { + this.relations = []; + } + RelationManage.prototype.isContainsRelation = function (rp1, rp2) { + var relation = this.relations.find(function (relation) { + return relation.equals(rp1, rp2); + }); + return !!relation; + }; + RelationManage.prototype.addRelation = function (rp1, rp2) { + if (!(rp1 instanceof GraphicRelationParam)) { + rp1 = new GraphicRelationParam(rp1); + } + if (!(rp2 instanceof GraphicRelationParam)) { + rp2 = new GraphicRelationParam(rp2); + } + if (!this.isContainsRelation(rp1, rp2)) { + var relation = new GraphicRelation(rp1, rp2); + this.relations.push(relation); + } + }; + /** + * 获取图形的所有关系 + * @param g + * @returns + */ + RelationManage.prototype.getRelationsOfGraphic = function (g) { + return this.relations.filter(function (rl) { return rl.contains(g); }); + }; + /** + * 获取指定图形的指定关系图形类型的所有关系 + * @param g 指定图形 + * @param type 关联图形的类型 + * @returns + */ + RelationManage.prototype.getRelationsOfGraphicAndOtherType = function (g, type) { + return this.relations.filter(function (rl) { return rl.contains(g) && rl.getOtherGraphic(g).type === type; }); + }; + /** + * 删除关系 + * @param relation + */ + RelationManage.prototype.deleteRelation = function (relation) { + var index = this.relations.findIndex(function (rl) { return rl.isEqualOther(relation); }); + if (index >= 0) { + this.relations.splice(index, 1); + } + }; + /** + * 删除指定图形的所有关系 + * @param g + */ + RelationManage.prototype.deleteRelationOfGraphic = function (g) { + var _this = this; + var relations = this.getRelationsOfGraphic(g); + relations.forEach(function (rl) { return _this.deleteRelation(rl); }); + }; + /** + * 删除指定图形的所有关系 + * @param g + */ + RelationManage.prototype.deleteRelationOfGraphicAndOtherType = function (g, type) { + var _this = this; + var relations = this.getRelationsOfGraphicAndOtherType(g, type); + relations.forEach(function (rl) { return _this.deleteRelation(rl); }); + }; + /** + * 清空 + */ + RelationManage.prototype.clear = function () { + this.relations.splice(0, this.relations.length); + }; + return RelationManage; +}()); + +/** + * 图形存储 + */ +var GraphicStore = /** @class */ (function () { + function GraphicStore() { + this.store = new Map(); + this.relationManage = new RelationManage(); + } + /** + * 获取所有图形对象 + */ + GraphicStore.prototype.getAllGraphics = function () { + return __spreadArray([], this.store.values(), true); + }; + GraphicStore.prototype.queryById = function (id) { + var graphic = this.store.get(id); + if (!graphic) + throw Error("\u672A\u627E\u5230id\u4E3A [".concat(id, "] \u7684\u56FE\u5F62.")); + return this.store.get(id); + }; + GraphicStore.prototype.queryByIdAmbiguous = function (id) { + var list = []; + this.store.forEach(function (g) { + if (g.id.search(id) >= 0) { + list.push(g); + } + }); + return list; + }; + GraphicStore.prototype.queryByType = function (type) { + var list = []; + this.store.forEach(function (g) { + if (g.type === type) { + list.push(g); + } + }); + return list; + }; + GraphicStore.prototype.queryByCode = function (code) { + var list = []; + this.store.forEach(function (g) { + if (g.code === code) { + list.push(g); + } + }); + return list; + }; + GraphicStore.prototype.queryByCodeAmbiguous = function (code) { + var list = []; + this.store.forEach(function (g) { + if (g.code.search(code) >= 0) { + list.push(g); + } + }); + return list; + }; + GraphicStore.prototype.queryByIdOrCode = function (s) { + var list = []; + this.store.forEach(function (g) { + if (g.isIdOrCode(s)) { + list.push(g); + } + }); + return list; + }; + GraphicStore.prototype.queryByIdOrCodeAndType = function (s, type) { + var list = []; + this.store.forEach(function (g) { + if (g.isIdOrCode(s) && g.type === type) { + list.push(g); + } + }); + return list; + }; + GraphicStore.prototype.queryByCodeAndType = function (code, type) { + for (var _i = 0, _a = this.store.values(); _i < _a.length; _i++) { + var item = _a[_i]; + if (item.code === code && item.type === type) { + return item; + } + } + }; + GraphicStore.prototype.queryByCodeAndTypeAmbiguous = function (code, type) { + var list = []; + this.store.forEach(function (g) { + if (g.type === type && g.code.search(code) >= 0) { + list.push(g); + } + }); + return list; + }; + /** + * 存储图形对象 + * @param graphics 要存储的图形 + */ + GraphicStore.prototype.storeGraphics = function (graphic) { + if (!graphic.id || graphic.id.trim() === '') { + throw new Error("\u5B58\u50A8\u56FE\u5F62\u5BF9\u8C61\u5F02\u5E38: id\u4E3A\u7A7A, ".concat(graphic)); + } + if (this.store.has(graphic.id)) { + // 已经存在 + var exist = this.store.get(graphic.id); + console.error("\u5DF2\u7ECF\u5B58\u5728id=".concat(graphic.id, "\u7684\u8BBE\u5907").concat(exist)); + return false; + } + else { + this.store.set(graphic.id, graphic); + graphic.queryStore = this; + graphic.relationManage = this.relationManage; + return true; + } + }; + /** + * 删除图形 + * @param graph 要删除的图形 + */ + GraphicStore.prototype.deleteGraphics = function (graphic) { + var id = graphic.id; + var remove = this.store.get(id); + if (remove) { + this.store.delete(id); + // 删除图形关系 + this.relationManage.deleteRelationOfGraphic(remove); + } + return remove; + }; + /** + * 清空 + */ + GraphicStore.prototype.clear = function () { + this.relationManage.clear(); + this.store.clear(); + }; + return GraphicStore; +}()); + +var MessageClient = /** @class */ (function (_super) { + __extends(MessageClient, _super); + function MessageClient(options) { + var _this = _super.call(this) || this; + _this.subClients = []; // 订阅客户端 + _this.options = options; + return _this; + } + MessageClient.prototype.unsubscribe = function (destination) { + this.unsubscribe0(destination); + var idx = this.subClients.findIndex(function (cli) { return cli.destination === destination; }); + if (idx >= 0) { + this.subClients.splice(idx, 1); + } + }; + MessageClient.prototype.getOrNewSubClient = function (destination) { + var cli = this.subClients.find(function (cli) { return cli.destination === destination; }); + if (!cli) { + // 不存在,新建 + cli = new SubscriptionClient(this, destination, this.options.protocol); + this.subClients.push(cli); + } + return cli; + }; + MessageClient.prototype.addSubscription = function (destination, handler) { + var cli = this.getOrNewSubClient(destination); + cli.addHandler(handler); + }; + MessageClient.prototype.removeSubscription = function (destination, handle) { + this.getOrNewSubClient(destination).removeHandler(handle); + }; + return MessageClient; +}(EventEmitter)); +var SubscriptionClient = /** @class */ (function () { + function SubscriptionClient(mc, destination, protocal) { + this.handlers = []; + this.subscripted = false; + this.mc = mc; + this.destination = destination; + this.protocol = protocal; + this.mc.on('disconnected', this.onDisconnect, this); + this.mc.on('connected', this.trySubscribe, this); + } + SubscriptionClient.prototype.addHandler = function (handler) { + if (this.handlers.filter(function (h) { return h.App === handler.App; }).length == 0) { + this.handlers.push(handler); + } + if (!this.subscripted) { + this.trySubscribe(); + } + }; + SubscriptionClient.prototype.removeHandler = function (handler) { + var idx = this.handlers.findIndex(function (h) { return h.App === handler.App; }); + if (idx >= 0) { + this.handlers.splice(idx, 1); + } + if (this.handlers.length == 0) { + console.log("\u8BA2\u9605".concat(this.destination, "\u6CA1\u6709\u6D88\u606F\u76D1\u542C\u5904\u7406,\u79FB\u9664\u8BA2\u9605")); + this.unsubscribe(); + } + }; + SubscriptionClient.prototype.trySubscribe = function () { + var _this = this; + if (this.mc.connected) { + this.subscripted = this.mc.subscribe(this.destination, function (data) { + _this.handleMessage(data); + }); + } + }; + SubscriptionClient.prototype.unsubscribe = function () { + this.mc.unsubscribe(this.destination); + }; + SubscriptionClient.prototype.handleMessage = function (data) { + if (this.protocol === 'json') { + console.debug('收到消息:', data); + } + this.handlers.forEach(function (handler) { + try { + handler.handle(data); + } + catch (error) { + console.error('图形应用状态消息处理异常', error); + } + }); + }; + SubscriptionClient.prototype.onDisconnect = function () { + this.subscripted = false; + }; + return SubscriptionClient; +}()); + +var ReconnectDelay = 3000; +var HeartbeatIncoming = 30000; +var HeartbeatOutgoing = 30000; +var StompMessagingClient = /** @class */ (function (_super) { + __extends(StompMessagingClient, _super); + function StompMessagingClient(options) { + var _this = _super.call(this, options) || this; + _this.options = options; + _this.cli = new stompjs.Client({ + brokerURL: options.wsUrl, + connectHeaders: { + Authorization: options.token ? options.token : '', + }, + reconnectDelay: ReconnectDelay, + heartbeatIncoming: HeartbeatIncoming, + heartbeatOutgoing: HeartbeatOutgoing, + }); + _this.cli.onConnect = function () { + // this.subClients.forEach((cli) => { + // this.subscribe(cli.destination, cli.handleMessage); + // }); + _this.emit('connected', ''); + }; + _this.cli.onStompError = function (frame) { + var errMsg = frame.headers['message']; + if (errMsg === '401') { + console.warn('认证失败,断开WebSocket连接'); + _this.cli.deactivate(); + } + else { + console.error('收到Stomp错误消息', frame); + } + }; + _this.cli.onDisconnect = function (frame) { + console.log('Stomp 断开连接', frame); + _this.emit('disconnected', frame); + }; + // websocket错误处理 + _this.cli.onWebSocketError = function (err) { + console.error('websocket错误', err); + }; + _this.cli.activate(); + return _this; + } + Object.defineProperty(StompMessagingClient.prototype, "connected", { + get: function () { + return this.cli.connected; + }, + enumerable: false, + configurable: true + }); + StompMessagingClient.prototype.subscribe = function (destination, handle) { + var _this = this; + this.cli.subscribe(destination, function (frame) { + if (_this.options.protocol === 'json') { + var data = JSON.parse(frame.body); + handle(data); + } + else { + handle(frame.binaryBody); + } + }, { + id: destination, + }); + return true; + }; + StompMessagingClient.prototype.unsubscribe0 = function (destination) { + this.cli.unsubscribe(destination); + }; + StompMessagingClient.prototype.close = function () { + this.cli.deactivate(); + }; + return StompMessagingClient; +}(MessageClient)); + +var MqttMsgClient = /** @class */ (function (_super) { + __extends(MqttMsgClient, _super); + function MqttMsgClient(options) { + var _this = _super.call(this, options) || this; + _this.retryTimes = 0; + _this.subMsgHandler = new Map(); + _this.options = options; + try { + _this.cli = mqtt.connect(options.wsUrl, { + protocolVersion: 5, + clean: true, + resubscribe: false, + keepalive: options.heartbeat, //ms,心跳 + connectTimeout: options.connectTimeout, // ms,连接超时 + reconnectPeriod: options.retryPeriod, // ms,重连间隔 + username: options.clientName || '', + password: options.token, + }); + _this.cli.on('connect', function (packet) { + console.log('MQTT 连接成功!'); + _this.retryTimes = 0; // 连接成功,重置 + _this.emit('connected', packet); + }); + _this.cli.on('disconnect', function (packet) { + console.log('MQTT 连接断开!'); + _this.emit('disconnected', packet); + }); + _this.cli.on('close', function () { + console.log('MQTT 关闭!'); + _this.emit('disconnected', 'close'); + }); + _this.cli.on('reconnect', function () { + _this.retryTimes += 1; + console.log("MQTT\u7B2C ".concat(_this.retryTimes, " \u6B21\u5C1D\u8BD5\u91CD\u8FDE")); + if (_this.retryTimes > options.retryTimes) { + try { + _this.cli.end(); + console.error('MQTT 达到重连最大尝试次数,停止重试'); + } + catch (error) { + console.error(error); + } + } + }); + _this.cli.on('error', function (error) { + console.log('MQTT 出现错误', error); + console.warn(error); + _this.emit('error', error); + }); + _this.cli.on('message', function (topic, message) { + var handle = _this.subMsgHandler.get(topic); + if (handle) { + if (_this.options.protocol === 'json') { + var data = JSON.parse(message.toString()); + handle(data); + } + else { + // 字节流 + handle(message); + } + } + }); + } + catch (err) { + console.error('MQTT connect error', err); + _this.emit('error', err); + throw err; + } + return _this; + } + MqttMsgClient.prototype.subscribe = function (destination, handle) { + console.debug('MQTT订阅执行', destination); + this.cli.subscribe(destination, { qos: 0 }, function (error, res) { + if (error) { + console.warn('MQTT 订阅失败', error); + return; + } + console.debug('MQTT 订阅成功', res); + return false; + }); + this.subMsgHandler.set(destination, handle); + return true; + }; + MqttMsgClient.prototype.unsubscribe0 = function (destination) { + var _this = this; + console.debug('MQTT取消订阅执行', destination); + this.cli.unsubscribe(destination, function (error, packet) { + if (error) { + console.warn('MQTT 取消订阅失败', error); + } + else { + console.debug('MQTT 取消订阅成功', packet); + _this.subMsgHandler.delete(destination); + } + }); + }; + Object.defineProperty(MqttMsgClient.prototype, "connected", { + get: function () { + return this.cli.connected; + }, + enumerable: false, + configurable: true + }); + MqttMsgClient.prototype.close = function () { + var _this = this; + try { + console.debug('MQTT关闭执行'); + this.cli.end(true, function () { + console.debug('MQTT 消息客户端关闭成功'); + _this.subMsgHandler.clear(); + }); + } + catch (error) { + console.warn('MQTT 消息客户端关闭失败', error); + } + }; + return MqttMsgClient; +}(MessageClient)); + +exports.ClientEngine = void 0; +(function (ClientEngine) { + ClientEngine[ClientEngine["Stomp"] = 0] = "Stomp"; + // Centrifugo, + ClientEngine[ClientEngine["MQTT"] = 1] = "MQTT"; +})(exports.ClientEngine || (exports.ClientEngine = {})); +var DefaultStompOption = { + engine: exports.ClientEngine.Stomp, + protocol: 'protobuf', + wsUrl: '', + token: '', + connectTimeout: 30 * 1000, + heartbeat: 60, + retryPeriod: 2 * 1000, + retryTimes: 100, +}; +var WsMsgCli = /** @class */ (function () { + function WsMsgCli() { + } + WsMsgCli.new = function (options) { + if (WsMsgCli.client) { + // 已经创建 + return; + } + WsMsgCli.options = Object.assign({}, DefaultStompOption, options); + switch (WsMsgCli.options.engine) { + // case ClientEngine.Centrifugo: { + // WsMsgCli.client = new CentrifugeMessagingClient(WsMsgCli.options); + // break; + // } + case exports.ClientEngine.MQTT: { + WsMsgCli.client = new MqttMsgClient(WsMsgCli.options); + break; + } + case exports.ClientEngine.Stomp: { + WsMsgCli.client = new StompMessagingClient(WsMsgCli.options); + break; + } + default: { + throw new Error('未知的消息客户端引擎类型', WsMsgCli.options.engine); + } + } + var cli = WsMsgCli.client; + cli.on('connected', function () { + WsMsgCli.emitConnectStateChangeEvent(true); + }); + cli.on('disconnected', function () { + WsMsgCli.emitConnectStateChangeEvent(false); + }); + cli.on('error', function (err) { + console.warn('websocket 客户端错误消息发布', err); + WsMsgCli.appMsgBroker.forEach(function (broker) { + broker.app.emit('websocket-error', err); + }); + }); + }; + WsMsgCli.isInitiated = function () { + return !!WsMsgCli.client; + }; + WsMsgCli.emitConnectStateChangeEvent = function (connected) { + WsMsgCli.appMsgBroker.forEach(function (broker) { + broker.app.emit('websocket-connect-state-change', connected); + }); + }; + WsMsgCli.isConnected = function () { + return WsMsgCli.client && WsMsgCli.client.connected; + }; + WsMsgCli.registerSubscription = function (destination, handler) { + WsMsgCli.client.addSubscription(destination, handler); + }; + WsMsgCli.unregisterSubscription = function (destination, handler) { + WsMsgCli.client.removeSubscription(destination, handler); + }; + WsMsgCli.registerAppMsgBroker = function (broker) { + WsMsgCli.appMsgBroker.push(broker); + }; + WsMsgCli.removeAppMsgBroker = function (broker) { + var index = WsMsgCli.appMsgBroker.findIndex(function (mb) { return mb == broker; }); + if (index >= 0) { + WsMsgCli.appMsgBroker.splice(index, 1); + } + }; + WsMsgCli.hasAppMsgBroker = function () { + return WsMsgCli.appMsgBroker.length > 0; + }; + /** + * 关闭websocket连接 + */ + WsMsgCli.close = function () { + if (WsMsgCli.client) { + WsMsgCli.client.close(); + } + }; + WsMsgCli.appMsgBroker = []; + return WsMsgCli; +}()); +var AppMessageHandler = /** @class */ (function () { + function AppMessageHandler(app, subOptions) { + this.app = app; + if (!subOptions.messageConverter && !subOptions.messageHandle) { + throw new Error("\u6CA1\u6709\u6D88\u606F\u5904\u7406\u5668\u6216\u56FE\u5F62\u72B6\u6001\u6D88\u606F\u8F6C\u6362\u5668: ".concat(subOptions)); + } + this.sub = subOptions; + } + Object.defineProperty(AppMessageHandler.prototype, "App", { + get: function () { + return this.app; + }, + enumerable: false, + configurable: true + }); + AppMessageHandler.prototype.handle = function (data) { + var sub = this.sub; + if (sub.messageConverter) { + var graphicStates = sub.messageConverter(data); + this.app.handleGraphicStates(graphicStates, sub.graphicQueryer, sub.createOnNotFound); + } + else if (sub.messageHandle) { + sub.messageHandle(data); + } + }; + return AppMessageHandler; +}()); +/** + * 图形APP的websocket消息代理 + */ +var AppWsMsgBroker = /** @class */ (function () { + function AppWsMsgBroker(app) { + this.subscriptions = new Map(); + this.app = app; + WsMsgCli.registerAppMsgBroker(this); + } + AppWsMsgBroker.prototype.subscribe = function (sub) { + var handler = new AppMessageHandler(this.app, sub); + WsMsgCli.registerSubscription(sub.destination, handler); + this.subscriptions.set(sub.destination, handler); + }; + AppWsMsgBroker.prototype.unsbuscribe = function (destination) { + var oldSub = this.subscriptions.get(destination); + if (oldSub) { + WsMsgCli.unregisterSubscription(destination, oldSub); + } + }; + AppWsMsgBroker.prototype.unsubscribeAll = function () { + var _this = this; + this.subscriptions.forEach(function (record, destination) { + _this.unsbuscribe(destination); + }); + }; + AppWsMsgBroker.prototype.resubscribeAll = function () { + this.subscriptions.forEach(function (handler, destination) { + WsMsgCli.registerSubscription(destination, handler); + }); + }; + /** + * 取消所有订阅,从通用Stomp客户端移除此消息代理 + */ + AppWsMsgBroker.prototype.close = function () { + WsMsgCli.removeAppMsgBroker(this); + this.unsubscribeAll(); + }; + return AppWsMsgBroker; +}()); + +/** + * 默认的白色样式 + */ +var DefaultWhiteStyleOptions = { + titleStyle: { + fontSize: 16, + fontColor: '#000000', + padding: [5, 15], + }, + backgroundColor: '#ffffff', + border: true, + borderWidth: 1, + borderColor: '#4C4C4C', + /** + * 默认圆角 + */ + borderRoundRadius: 5, + itemStyle: { + fontSize: 16, + fontColor: '#000000', + padding: [5, 25], + hoverColor: '#1E78DB', + disabledFontColor: '#9D9D9D', + }, +}; +/** + * 默认的白色菜单配置 + */ +var DefaultWhiteMenuOptions = { + name: '', + style: DefaultWhiteStyleOptions, + groups: [], +}; + +var ContextMenuPlugin = /** @class */ (function () { + function ContextMenuPlugin(app) { + var _this = this; + this.contextMenuMap = new Map(); + this.app = app; + var canvas = this.app.canvas; + canvas.on('pointerdown', function () { + _this.contextMenuMap.forEach(function (menu) { + menu.close(); + }); + }); + } + ContextMenuPlugin.prototype.registerMenu = function (menu) { + this.contextMenuMap.set(menu.menuName, menu); + menu.plugin = this; + }; + Object.defineProperty(ContextMenuPlugin.prototype, "screenWidth", { + /** + * 获取视口屏幕宽度 + */ + get: function () { + return this.app.viewport.screenWidth; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuPlugin.prototype, "screenHeight", { + /** + * 获取视口屏幕高度 + */ + get: function () { + return this.app.viewport.screenHeight; + }, + enumerable: false, + configurable: true + }); + /** + * 打开菜单 + * @param menu + * @param global + */ + ContextMenuPlugin.prototype.open = function (menu, global) { + if (!menu.opened) { + menu.opened = true; + this.app.pixi.stage.addChild(menu); + } + // 处理超出显示范围 + var screenHeight = this.screenHeight; + var bottomY = global.y + menu.height; + var oob = this.oob(menu, global); + var pos = global.clone(); + if (oob.right) { + pos.x = global.x - menu.width; + } + if (oob.bottom) { + var py = global.y - menu.height; + if (py > 0) { + pos.y = py; + } + else { + pos.y = global.y - (bottomY - screenHeight); + } + } + // 移动后是否左上超出 + oob = this.oob(menu, pos); + if (oob.left) { + pos.x = 0; + } + if (oob.top) { + pos.y = 0; + } + menu.position.copyFrom(pos); + }; + /** + * 关闭菜单 + * @param menu + */ + ContextMenuPlugin.prototype.close = function (menu) { + if (menu.opened) { + menu.opened = false; + this.app.pixi.stage.removeChild(menu); + } + }; + /** + * 关闭所有菜单 + */ + ContextMenuPlugin.prototype.closeAll = function () { + var _this = this; + this.contextMenuMap.forEach(function (cm) { + _this.close(cm); + }); + }; + /** + * 越界检查 + * @param menu + * @param global + * @returns + */ + ContextMenuPlugin.prototype.oob = function (menu, global) { + var screenWidth = this.screenWidth; + var screenHeight = this.screenHeight; + var bound = new pixi_js.Rectangle(0, 0, screenWidth, screenHeight); + var menuRect = new pixi_js.Rectangle(global.x, global.y, menu.width, menu.height); + return OutOfBound.check(menuRect, bound); + }; + return ContextMenuPlugin; +}()); +/** + * 上下文菜单,多级嵌套 + */ +var ContextMenu = /** @class */ (function (_super) { + __extends(ContextMenu, _super); + function ContextMenu(menuOptions, parentMenuItem) { + var _this = _super.call(this) || this; + _this.opened = false; + _this.padding = 5; + _this._active = false; // 激活状态 + _this.menuOptions = Object.assign({}, DefaultWhiteMenuOptions, menuOptions); + _this.name = _this.menuOptions.name; + _this.bg = new pixi_js.Graphics(); + _this.addChild(_this.bg); + _this.groups = []; + _this.init(); + _this.parentMenuItem = parentMenuItem; + return _this; + } + ContextMenu.init = function (options) { + return new ContextMenu(options); + }; + Object.defineProperty(ContextMenu.prototype, "style", { + get: function () { + return this.menuOptions.style; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenu.prototype, "parentMenu", { + /** + * 父级菜单 + */ + get: function () { + var _a; + return (_a = this.parentMenuItem) === null || _a === void 0 ? void 0 : _a.menu; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenu.prototype, "rootMenu", { + /** + * 最顶级菜单 + */ + get: function () { + if (this.parentMenu) { + return this.parentMenu.rootMenu; + } + return this; + }, + enumerable: false, + configurable: true + }); + /** + * 是否存在激活的菜单项 + * @returns + */ + ContextMenu.prototype.hasActiveItem = function () { + for (var i = 0; i < this.groups.length; i++) { + var group = this.groups[i]; + if (group.hasActiveItem()) { + return true; + } + } + return false; + }; + Object.defineProperty(ContextMenu.prototype, "active", { + get: function () { + return (this._active || + this.hasActiveItem() || + (this.parentMenuItem != undefined && this.parentMenuItem._active)); + }, + set: function (v) { + this._active = v; + this.onActiveChanged(); + }, + enumerable: false, + configurable: true + }); + ContextMenu.prototype.onActiveChanged = function () { + var _this = this; + if (this.parentMenuItem) { + this.parentMenuItem.onActiveChanged(); + if (!this.active) { + this.timeoutCloseHandle = setTimeout(function () { + _this.close(); + }, 500); + } + else { + if (this.timeoutCloseHandle) { + clearTimeout(this.timeoutCloseHandle); + } + } + } + }; + ContextMenu.prototype.setOptions = function (menuOptions) { + this.menuOptions = Object.assign({}, DefaultWhiteMenuOptions, menuOptions); + this.init(); + }; + /** + * 初始化 + */ + ContextMenu.prototype.init = function () { + var _this = this; + // this.initTitle(); + this.groups = []; + var options = this.menuOptions; + options.groups.forEach(function (group) { + var menuGroup = new MenuGroup(_this, group); + _this.groups.push(menuGroup); + }); + var _a = this.calculateBorderInfo(), borderHeight = _a.borderHeight, maxItemWidth = _a.maxItemWidth; + var splitLineWidth = 1; + var bgWidth = maxItemWidth + this.padding * 2; + var bgHeight = borderHeight + + this.groups.length * this.padding * 2 + + (this.groups.length - 1) * splitLineWidth; + if (options.style.border) { + this.bg.lineStyle(options.style.borderWidth, new pixi_js.Color(options.style.borderColor)); + } + this.bg.beginFill(new pixi_js.Color(options.style.backgroundColor)); + if (options.style.borderRoundRadius > 0) { + this.bg.drawRoundedRect(0, 0, bgWidth, bgHeight, options.style.borderRoundRadius); + } + else { + this.bg.drawRect(0, 0, bgWidth, bgHeight); + } + this.bg.endFill(); + var groupHeight = 0; + this.bg.lineStyle(splitLineWidth, new pixi_js.Color(options.style.borderColor)); + for (var i = 0; i < this.groups.length; i++) { + var group = this.groups[i]; + group.updateItemBox(maxItemWidth); + group.position.set(this.padding, groupHeight + this.padding); + if (i === this.groups.length - 1) { + // 最后一个 + break; + } + var splitLineY = groupHeight + group.height + this.padding * 2; + this.bg.moveTo(0, splitLineY); + this.bg.lineTo(bgWidth, splitLineY); + groupHeight = splitLineY + splitLineWidth; + } + this.addChild.apply(this, this.groups); + this.eventMode = 'static'; + this.on('pointerover', function () { + _this.active = true; + }); + this.on('pointerout', function () { + _this.active = false; + }); + }; + ContextMenu.prototype.initGroups = function () { + var _this = this; + this.groups = []; + var options = this.menuOptions; + options.groups.forEach(function (group) { + var menuGroup = new MenuGroup(_this, group); + _this.groups.push(menuGroup); + }); + this.addChild.apply(this, this.groups); + }; + ContextMenu.prototype.initTitle = function () { + if (this.menuOptions.title) { + this.title = new pixi_js.Text(this.menuOptions.title, { align: 'left' }); + } + }; + ContextMenu.prototype.calculateBorderInfo = function () { + var maxItemNameWidth = 0; + var maxShortcutWidth = 0; + var maxGutter = 0; + var borderHeight = 0; + this.groups.forEach(function (menuGroup) { + borderHeight += menuGroup.totalHeight; + var maxInw = menuGroup.maxItemNameWidth; + if (maxInw > maxItemNameWidth) { + maxItemNameWidth = maxInw; + } + var maxSw = menuGroup.maxShortcutWidth; + if (maxSw > maxShortcutWidth) { + maxShortcutWidth = maxSw; + } + var gutter = menuGroup.totalGutter; + if (gutter > maxGutter) { + maxGutter = gutter; + } + }); + var maxItemWidth = maxItemNameWidth + maxShortcutWidth + maxGutter; + return { borderHeight: borderHeight, maxItemWidth: maxItemWidth }; + }; + ContextMenu.prototype.updateBg = function () { + this.bg.clear(); + var options = this.menuOptions; + var _a = this.calculateBorderInfo(), borderHeight = _a.borderHeight, maxItemWidth = _a.maxItemWidth; + var splitLineWidth = 1; + var bgWidth = maxItemWidth + this.padding * 2; + var bgHeight = borderHeight + + this.groups.length * this.padding * 2 + + (this.groups.length - 1) * splitLineWidth; + if (options.style.border) { + this.bg.lineStyle(options.style.borderWidth, new pixi_js.Color(options.style.borderColor)); + } + this.bg.beginFill(new pixi_js.Color(options.style.backgroundColor)); + if (options.style.borderRoundRadius > 0) { + this.bg.drawRoundedRect(0, 0, bgWidth, bgHeight, options.style.borderRoundRadius); + } + else { + this.bg.drawRect(0, 0, bgWidth, bgHeight); + } + this.bg.endFill(); + var groupHeight = 0; + this.bg.lineStyle(splitLineWidth, new pixi_js.Color(options.style.borderColor)); + for (var i = 0; i < this.groups.length; i++) { + var group = this.groups[i]; + group.updateItemBox(maxItemWidth); + group.position.set(this.padding, groupHeight + this.padding); + if (i === this.groups.length - 1) { + // 最后一个 + break; + } + var splitLineY = groupHeight + group.height + this.padding * 2; + this.bg.moveTo(0, splitLineY); + this.bg.lineTo(bgWidth, splitLineY); + groupHeight = splitLineY + splitLineWidth; + } + }; + ContextMenu.prototype.update = function () { + if (this.menuOptions.groups.length !== this.groups.length) { + this.init(); + } + else { + this.groups.forEach(function (group) { return group.update(); }); + this.updateBg(); + } + }; + Object.defineProperty(ContextMenu.prototype, "menuName", { + get: function () { + return this.menuOptions.name; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenu.prototype, "plugin", { + get: function () { + if (this.parentMenu) { + return this.parentMenu.plugin; + } + if (this._plugin) { + return this._plugin; + } + throw new Error("\u4E0A\u4E0B\u6587\u83DC\u5355name=".concat(this.menuOptions.name, "\u6CA1\u6709\u6DFB\u52A0\u5230\u63D2\u4EF6\u4E2D")); + }, + set: function (v) { + this._plugin = v; + }, + enumerable: false, + configurable: true + }); + /** + * 显示菜单 + */ + ContextMenu.prototype.open = function (global) { + if (this.parentMenu) { + this.parentMenu.openSub(this, global); + } + else { + this.update(); + this.plugin.open(this, global); + } + }; + /** + * 关闭菜单 + */ + ContextMenu.prototype.close = function () { + if (this.openedSubMenu) { + this.openedSubMenu.close(); + this.openedSubMenu = undefined; + } + this.plugin.close(this); + }; + /** + * 打开子菜单 + * @param subMenu + * @param global + */ + ContextMenu.prototype.openSub = function (subMenu, global) { + if (this.openedSubMenu) { + this.openedSubMenu.close(); + } + var pos = global.clone(); + var oob = this.plugin.oob(subMenu, global); + if (oob.right) { + pos.x = this.position.x - subMenu.width + this.padding; + } + if (oob.bottom) { + pos.y = this.plugin.screenHeight - subMenu.height - this.padding; + } + this.plugin.open(subMenu, pos); + this.openedSubMenu = subMenu; + }; + return ContextMenu; +}(pixi_js.Container)); +var MenuGroup = /** @class */ (function (_super) { + __extends(MenuGroup, _super); + function MenuGroup(menu, config) { + var _this = _super.call(this) || this; + _this.gutter = 3; // 名称、快捷键、箭头文本间隙 + _this.items = []; + _this.config = config; + _this.menu = menu; + _this.init(); + return _this; + } + MenuGroup.prototype.init = function () { + var _this = this; + this.items = []; // 清空 + this.config.items.forEach(function (item) { + _this.items.push(new ContextMenuItem(_this.menu, item)); + }); + if (this.items.length === 0) { + console.error('菜单group为空', this.config, this.menu); + throw new Error("{name=".concat(this.menu.name, "}\u7684\u83DC\u5355\u7684group\u4E3A{name=").concat(this.config.name, "}\u7684\u6761\u76EE\u4E3A\u7A7A!")); + } + this.addChild.apply(this, this.items); + }; + MenuGroup.prototype.hasActiveItem = function () { + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + if (item.active) { + return true; + } + } + return false; + }; + Object.defineProperty(MenuGroup.prototype, "maxItemNameWidth", { + get: function () { + var maxNameWidth = this.items + .map(function (item) { return item.nameBounds.width; }) + .sort(function (a, b) { return a - b; }) + .reverse()[0]; + return maxNameWidth; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(MenuGroup.prototype, "maxShortcutWidth", { + get: function () { + var maxShortcutWidth = this.items + .map(function (item) { return item.shortcutKeyBounds.width; }) + .sort(function (a, b) { return a - b; }) + .reverse()[0]; + return maxShortcutWidth; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(MenuGroup.prototype, "totalGutter", { + get: function () { + return this.gutter + this.items[0].paddingLeft + this.items[0].paddingRight; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(MenuGroup.prototype, "totalHeight", { + get: function () { + var total = 0; + this.items.forEach(function (item) { return (total += item.totalHeight); }); + return total; + }, + enumerable: false, + configurable: true + }); + MenuGroup.prototype.update = function () { + if (this.items.length !== this.config.items.length) { + this.init(); + } + else { + var i_1 = 0; + this.items.forEach(function (item) { + item.update(); + if (item.visible) { + item.position.y = i_1 * item.totalHeight; + i_1++; + } + }); + } + }; + MenuGroup.prototype.updateItemBox = function (maxItemWidth) { + this.items.forEach(function (item) { + return item.updateBox(maxItemWidth, item.totalHeight); + }); + }; + return MenuGroup; +}(pixi_js.Container)); +/** + * 菜单项 + */ +var ContextMenuItem = /** @class */ (function (_super) { + __extends(ContextMenuItem, _super); + function ContextMenuItem(menu, config) { + var _this = _super.call(this) || this; + _this.gutter = 3; // 名称、快捷键、箭头文本间隙 + _this._active = false; // 激活状态 + _this.menu = menu; + _this.config = config; + _this.box = new pixi_js.Graphics(); + _this.addChild(_this.box); + _this.nameText = new pixi_js.Text(_this.config.name, { + fontSize: _this.fontSize, + fill: _this.fontColor, + }); + _this.addChild(_this.nameText); + _this.initShortcutKeyText(); + _this.initSubMenu(); + return _this; + } + ContextMenuItem.prototype.registerEventHandler = function () { + var _this = this; + this.eventMode = 'static'; + this.cursor = 'pointer'; + this.on('pointerover', function () { + _this.active = true; + if (_this.config.disabled) { + _this.cursor = 'not-allowed'; + } + else { + _this.cursor = 'pointer'; + } + if (_this.subMenu) { + var p = _this.toGlobal(new pixi_js.Point(_this.width)); + _this.subMenu.open(p); + } + }); + this.on('pointerout', function () { + _this.active = false; + }); + this.on('pointertap', function () { + if (_this.config.disabled) { + // 禁用,不处理 + return; + } + if (_this.config.handler) { + _this.menu.plugin.app.emit('pre-menu-handle', _this.config); + _this.config.handler(); + _this.menu.plugin.app.emit('post-menu-handle', _this.config); + } + if (!_this.config.subMenu || _this.config.subMenu.groups.length === 0) { + _this.active = false; + _this.menu.active = false; + _this.menu.rootMenu.close(); + } + }); + }; + Object.defineProperty(ContextMenuItem.prototype, "active", { + get: function () { + return this._active || (this.subMenu != undefined && this.subMenu.active); + }, + set: function (v) { + this._active = v; + if (this.subMenu) { + this.subMenu.onActiveChanged(); + } + this.onActiveChanged(); + }, + enumerable: false, + configurable: true + }); + ContextMenuItem.prototype.onActiveChanged = function () { + if (this.active) { + this.box.alpha = 1; + } + else { + this.box.alpha = 0; + } + }; + Object.defineProperty(ContextMenuItem.prototype, "textWidth", { + get: function () { + return this.nameBounds.width + this.shortcutKeyBounds.width + this.gutter; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuItem.prototype, "nameGraphic", { + get: function () { + if (this.nameText) { + return this.nameText; + } + throw new Error("\u83DC\u5355\u9879name=".concat(this.config.name, "\u6CA1\u6709\u521D\u59CB\u5316\u540D\u79F0\u56FE\u5F62\u5BF9\u8C61")); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuItem.prototype, "totalHeight", { + get: function () { + if (this.config.visible === false) { + return 0; + } + else { + return this.paddingTop + this.paddingBottom + this.nameGraphic.height; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuItem.prototype, "nameBounds", { + get: function () { + return this.nameGraphic.getLocalBounds(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuItem.prototype, "shortcutKeyBounds", { + get: function () { + if (this.shortcutKeyText) { + return this.shortcutKeyText.getLocalBounds(); + } + else { + return new pixi_js.Rectangle(0, 0, 0, 0); + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuItem.prototype, "style", { + get: function () { + return this.menu.style.itemStyle; + }, + enumerable: false, + configurable: true + }); + ContextMenuItem.prototype.checkPadding = function (padding) { + if (Array.isArray(padding)) { + if (padding.length !== 2 && padding.length !== 4) { + throw new Error('错误的padding数据'); + } + } + }; + ContextMenuItem.prototype.toWholePadding = function (padding) { + this.checkPadding(padding); + if (Array.isArray(padding)) { + if (padding.length == 2) { + return [padding[0], padding[1], padding[0], padding[1]]; + } + else { + return padding; + } + } + else { + return [padding, padding, padding, padding]; + } + }; + Object.defineProperty(ContextMenuItem.prototype, "paddingTop", { + get: function () { + return this.toWholePadding(this.menu.style.itemStyle.padding)[0]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuItem.prototype, "paddingBottom", { + get: function () { + return this.toWholePadding(this.menu.style.itemStyle.padding)[2]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuItem.prototype, "paddingLeft", { + get: function () { + return this.toWholePadding(this.menu.style.itemStyle.padding)[3]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuItem.prototype, "paddingRight", { + get: function () { + return this.toWholePadding(this.menu.style.itemStyle.padding)[1]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuItem.prototype, "hoverColor", { + get: function () { + return this.style.hoverColor; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuItem.prototype, "fontSize", { + get: function () { + return this.style.fontSize; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ContextMenuItem.prototype, "fontColor", { + get: function () { + if (this.config.disabled) { + return this.style.disabledFontColor; + } + else if (this.config.fontColor) { + return this.config.fontColor; + } + return this.style.fontColor; + }, + enumerable: false, + configurable: true + }); + ContextMenuItem.prototype.initShortcutKeyText = function () { + if (this.config.shortcutKeys && this.config.shortcutKeys.length > 0) { + this.shortcutKeyText = new pixi_js.Text(this.config.shortcutKeys.join('+'), { + fontSize: this.fontSize, + fill: this.fontColor, + }); + this.addChild(this.shortcutKeyText); + return this.shortcutKeyText; + } + return undefined; + }; + ContextMenuItem.prototype.initSubMenu = function () { + if (this.config.subMenu && this.config.subMenu.groups.length > 0) { + this.arrowText = new pixi_js.Text('>', { + fontSize: this.fontSize, + fill: this.fontColor, + }); + this.addChild(this.arrowText); + this.subMenu = new ContextMenu(this.config.subMenu, this); + } + }; + ContextMenuItem.prototype.updateBackground = function (width, height) { + this.box.clear(); + var box = this.box; + var style = this.menu.style; + if (!style.itemStyle.hoverColor) { + throw new Error('未设置菜单项的hoverColor'); + } + var hoverColor = style.itemStyle.hoverColor; + if (this.style && this.style.hoverColor) { + hoverColor = this.style.hoverColor; + } + box.beginFill(new pixi_js.Color(hoverColor)); + if (style.borderRoundRadius > 0) { + box.drawRoundedRect(0, 0, width, height, style.borderRoundRadius); + } + else { + box.drawRect(0, 0, width, height); + } + box.endFill(); + box.alpha = 0; + }; + ContextMenuItem.prototype.updateBox = function (width, height) { + var _a; + this.removeAllListeners(); + this.updateBackground(width, height); + (_a = this.nameText) === null || _a === void 0 ? void 0 : _a.position.set(this.paddingLeft, this.paddingTop); + if (this.shortcutKeyText) { + var skTextWidth = this.shortcutKeyBounds.width; + this.shortcutKeyText.position.set(width - skTextWidth - this.paddingRight, this.paddingTop); + } + if (this.arrowText) { + this.arrowText.position.set(width - this.paddingRight - this.gutter, this.paddingTop); + } + // 事件监听 + this.hitArea = new pixi_js.Rectangle(0, 0, width, height); + this.registerEventHandler(); + }; + ContextMenuItem.prototype.update = function () { + if (this.config.visible === false) { + this.visible = false; + return; + } + this.visible = true; + this.nameText.text = this.config.name; + this.nameText.style.fontSize = this.fontSize; + this.nameText.style.fill = this.fontColor; + if (this.shortcutKeyText) { + if (this.config.shortcutKeys && this.config.shortcutKeys.length > 0) { + this.shortcutKeyText.text = this.config.shortcutKeys.join('+'); + this.shortcutKeyText.style.fontSize = this.fontSize; + this.shortcutKeyText.style.fill = this.fontColor; + } + else { + this.shortcutKeyText.visible = false; + } + } + else { + this.initShortcutKeyText(); + } + if (this.config.subMenu == undefined && this.subMenu) { + this.subMenu = undefined; + } + else if (this.config.subMenu && this.subMenu == undefined) { + this.initSubMenu(); + } + if (this.subMenu) { + this.subMenu.update(); + } + }; + return ContextMenuItem; +}(pixi_js.Container)); + +var AppConsts = { + viewportname: '__viewport', + canvasname: '__jlcanvas', + AssistantAppendsName: '__assistantAppends', + // 辅助元素默认颜色 + assistantElementColor: '#1976d2', +}; +var CanvasData = /** @class */ (function () { + function CanvasData(properties) { + if (properties === void 0) { properties = { + width: 1920, + height: 1080, + backgroundColor: '#ffffff', + viewportTransform: GraphicTransform.default(), + }; } + this.width = properties.width; + this.height = properties.height; + this.backgroundColor = properties.backgroundColor; + this.viewportTransform = properties.viewportTransform; + } + CanvasData.prototype.copyFrom = function (properties) { + var sizeChange = false; + if (properties.width <= 0 || properties.height <= 0) { + console.error('画布宽度/高度不能小于等于0'); + } + else { + var width = Math.floor(properties.width); + var height = Math.floor(properties.height); + if (this.width != width) { + this.width = width; + sizeChange = true; + } + if (this.height != height) { + this.height = height; + sizeChange = true; + } + } + this.backgroundColor = properties.backgroundColor; + this.viewportTransform = properties.viewportTransform; + return sizeChange; + }; + CanvasData.prototype.clone = function () { + var cp = new CanvasData(this); + return cp; + }; + return CanvasData; +}()); +var JlCanvas = /** @class */ (function (_super) { + __extends(JlCanvas, _super); + function JlCanvas(scene, properties) { + if (properties === void 0) { properties = new CanvasData(); } + var _this = _super.call(this) || this; + _this.__JlCanvas = true; + _this.type = 'Canvas'; + _this.bg = new pixi_js.Graphics(); // 背景 + _this.scene = scene; + _this._properties = properties; + _this.eventMode = 'static'; + _this.nonInteractiveContainer = new pixi_js.Container(); + _this.nonInteractiveContainer.name = 'non-interactives'; + _this.nonInteractiveContainer.eventMode = 'none'; + _this.addChild(_this.bg); + _this.addChild(_this.nonInteractiveContainer); + _this.sortableChildren = true; + _this.assistantAppendContainer = new pixi_js.Container(); + _this.assistantAppendContainer.eventMode = 'static'; + _this.assistantAppendContainer.name = AppConsts.AssistantAppendsName; + _this.assistantAppendContainer.zIndex = 999; + _this.assistantAppendContainer.sortableChildren = true; + _this.addChild(_this.assistantAppendContainer); + _this.repaint(); + return _this; + } + /** + * 图形重绘(数据/状态变化时触发) + */ + JlCanvas.prototype.repaint = function () { + this.doRepaint(); + }; + Object.defineProperty(JlCanvas.prototype, "width", { + get: function () { + return this._properties.width; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(JlCanvas.prototype, "height", { + get: function () { + return this._properties.height; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(JlCanvas.prototype, "backgroundColor", { + get: function () { + return this._properties.backgroundColor; + }, + enumerable: false, + configurable: true + }); + JlCanvas.prototype.doRepaint = function () { + this.bg.clear(); + this.bg + .beginFill(new pixi_js.Color(this.backgroundColor)) + .drawRect(0, 0, this._properties.width, this._properties.height) + .endFill(); + }; + Object.defineProperty(JlCanvas.prototype, "properties", { + get: function () { + return this._properties; + }, + enumerable: false, + configurable: true + }); + JlCanvas.prototype.saveData = function () { + var vp = this.getViewport(); + this.properties.viewportTransform = vp.saveTransform(); + return this.properties.clone(); + }; + JlCanvas.prototype.update = function (properties) { + // 更新画布 + var old = this.properties.clone(); + this._properties.copyFrom(properties); + this.repaint(); + var vp = this.getViewport(); + vp.loadTransform(properties.viewportTransform); + this.emit('dataupdate', this.properties, old); + }; + JlCanvas.prototype.addChild = function () { + var _this = this; + var children = []; + for (var _i = 0; _i < arguments.length; _i++) { + children[_i] = arguments[_i]; + } + var rt = _super.prototype.addChild.apply(this, children); + children.forEach(function (g) { + g.onAddToCanvas(_this); + recursiveChildren(g, function (child) { return child.onAddToCanvas(_this); }); + }); + return rt; + }; + JlCanvas.prototype.removeChild = function () { + var _this = this; + var children = []; + for (var _i = 0; _i < arguments.length; _i++) { + children[_i] = arguments[_i]; + } + children.forEach(function (g) { + g.onRemoveFromCanvas(_this); + recursiveChildren(g, function (child) { + return child.onRemoveFromCanvas(_this); + }); + }); + return _super.prototype.removeChild.apply(this, children); + }; + /** + * 添加无交互Child + */ + JlCanvas.prototype.addNonInteractiveChild = function () { + var _a; + var _this = this; + var obj = []; + for (var _i = 0; _i < arguments.length; _i++) { + obj[_i] = arguments[_i]; + } + (_a = this.nonInteractiveContainer).addChild.apply(_a, obj); + obj.forEach(function (g) { + g.onAddToCanvas(_this); + recursiveChildren(g, function (child) { return child.onAddToCanvas(_this); }); + }); + }; + JlCanvas.prototype.removeGraphic = function () { + var _a; + var _this = this; + var obj = []; + for (var _i = 0; _i < arguments.length; _i++) { + obj[_i] = arguments[_i]; + } + obj.forEach(function (g) { + g.onRemoveFromCanvas(_this); + recursiveChildren(g, function (child) { + return child.onRemoveFromCanvas(_this); + }); + }); + this.removeChild.apply(this, obj); + (_a = this.nonInteractiveContainer).removeChild.apply(_a, obj); + }; + /** + * 移除无交互Child + */ + JlCanvas.prototype.removeNonInteractiveChild = function () { + var _a; + var _this = this; + var obj = []; + for (var _i = 0; _i < arguments.length; _i++) { + obj[_i] = arguments[_i]; + } + obj.forEach(function (g) { + g.onRemoveFromCanvas(_this); + recursiveChildren(g, function (child) { + return child.onRemoveFromCanvas(_this); + }); + }); + (_a = this.nonInteractiveContainer).removeChild.apply(_a, obj); + }; + JlCanvas.prototype.addAssistantAppends = function () { + var _a; + var _this = this; + var appends = []; + for (var _i = 0; _i < arguments.length; _i++) { + appends[_i] = arguments[_i]; + } + (_a = this.assistantAppendContainer).addChild.apply(_a, appends); + appends.forEach(function (g) { + g.onAddToCanvas(_this); + recursiveChildren(g, function (child) { return child.onAddToCanvas(_this); }); + }); + }; + JlCanvas.prototype.removeAssistantAppends = function () { + var _a; + var _this = this; + var appends = []; + for (var _i = 0; _i < arguments.length; _i++) { + appends[_i] = arguments[_i]; + } + appends.forEach(function (g) { + g.onRemoveFromCanvas(_this); + recursiveChildren(g, function (child) { return child.onAddToCanvas(_this); }); + }); + (_a = this.assistantAppendContainer).removeChild.apply(_a, appends); + }; + /** + * 暂停所有可交互对象 + */ + JlCanvas.prototype.pauseInteractiveChildren = function () { + this.interactiveChildren = false; + }; + /** + * 恢复所有可交互对象 + */ + JlCanvas.prototype.resumeInteractiveChildren = function () { + this.interactiveChildren = true; + }; + return JlCanvas; +}(pixi_js.Container)); +var GraphicSceneBase = /** @class */ (function (_super) { + __extends(GraphicSceneBase, _super); + function GraphicSceneBase(options) { + var _this = _super.call(this) || this; + _this._loaded = false; // 是否已经加载 + _this.graphicTemplateMap = new Map(); // 图形对象模板 + _this.interactionPluginMap = new Map(); // 交互插件 + _this.graphicStore = new GraphicStore(); + _this._options = options; + // 创建pixi渲染app + _this.pixi = new pixi_js.Application({ + antialias: true, + }); + // 创建画布 + _this.canvas = new JlCanvas(_this); + _this.canvas.name = AppConsts.canvasname; + // 创建相机 + _this.viewport = new pixiViewport.Viewport({ + screenWidth: window.innerWidth, + screenHeight: window.innerHeight, + worldWidth: _this.canvas._properties.width, + worldHeight: _this.canvas._properties.height, + passiveWheel: true, + events: _this.pixi.renderer.events, + disableOnContextMenu: true, + }); + // 设置视口操作方式 + _this.viewport + .wheel({ + percent: 1, + }) + .pinch() + .clampZoom({ + minScale: 0.1, + maxScale: 8, + }) + .clamp({ + direction: 'all', + }); + _this.viewport.name = AppConsts.viewportname; + _this.viewport.interactiveChildren = true; + // 添加视口到渲染器舞台 + _this.pixi.stage.addChild(_this.viewport); + // 将画布置于视口 + _this.viewport.addChild(_this.canvas); + // 监听并通知缩放变化事件 + _this.viewport.on('zoomed-end', function () { + _this.emit('viewport-scaled', _this.viewport); + }); + _this.graphicCopyPlugin = new GraphicCopyPlugin(_this); + // 添加通用交互插件 + CommonMouseTool.new(_this).resume(); + // drag插件 + DragPlugin.new(_this).resume(); + // 视口移动插件 + ViewportMovePlugin.new(_this); + // 图形变换插件 + GraphicTransformPlugin.new(_this).resume(); + // 动画管理 + _this.animationManager = new AnimationManager(_this); + _this.menuPlugin = new ContextMenuPlugin(_this); + _this.wsMsgBroker = new AppWsMsgBroker(_this); + _this.debounceEmitFunc = debounce(_this.doEmitAppGraphicSelected, 50); + _this.on('graphicselectedchange', function () { + _this.debounceEmitFunc(_this); + }); + // 发布选项更新事件 + _this.emit('options-update', _this._options); + return _this; + } + Object.defineProperty(GraphicSceneBase.prototype, "appOptions", { + get: function () { + return this._options; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(GraphicSceneBase.prototype, "dom", { + get: function () { + return this._dom; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(GraphicSceneBase.prototype, "queryStore", { + get: function () { + return this.graphicStore; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(GraphicSceneBase.prototype, "selectedGraphics", { + get: function () { + return this.queryStore.getAllGraphics().filter(function (g) { return g.selected; }); + }, + enumerable: false, + configurable: true + }); + GraphicSceneBase.prototype.load = function () { + return __awaiter(this, void 0, void 0, function () { + var storage; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!this._options.dataLoader) return [3 /*break*/, 3]; + return [4 /*yield*/, this._options.dataLoader()]; + case 1: + storage = _a.sent(); + if (storage.canvasProperty) { + this.canvas.update(storage.canvasProperty); + } + if (!storage.datas) return [3 /*break*/, 3]; + return [4 /*yield*/, this.loadGraphic(storage.datas)]; + case 2: + _a.sent(); + _a.label = 3; + case 3: + this._loaded = true; + return [2 /*return*/]; + } + }); + }); + }; + /** + * 重新加载数据 + */ + GraphicSceneBase.prototype.reload = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (!!this._loaded) return [3 /*break*/, 2]; + this.graphicStore.clear(); + return [4 /*yield*/, this.load()]; + case 1: + _a.sent(); + return [3 /*break*/, 3]; + case 2: + console.debug('场景已经加载过数据,不重新加载', this); + _a.label = 3; + case 3: return [2 /*return*/]; + } + }); + }); + }; + GraphicSceneBase.prototype.forceReload = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + console.debug('场景强制重新加载数据', this); + this.graphicStore.clear(); + return [4 /*yield*/, this.load()]; + case 1: + _a.sent(); + return [2 /*return*/]; + } + }); + }); + }; + /** + * 更新选项 + * @param options + */ + GraphicSceneBase.prototype.setOptions = function (options) { + // console.log('更新选项', options); + if (this._options) { + this._options = Object.assign(this._options, options); + } + else { + this._options = options; + } + this.emit('options-update', options); + }; + GraphicSceneBase.prototype.toCanvasCoordinates = function (p) { + return this.viewport.toWorld(p); + }; + /** + * 注册菜单 + * @param menu + */ + GraphicSceneBase.prototype.registerMenu = function (menu) { + this.menuPlugin.registerMenu(menu); + }; + /** + * 注册图形对象模板 + * @param graphicTemplates + */ + GraphicSceneBase.prototype.registerGraphicTemplates = function () { + var _this = this; + var graphicTemplates = []; + for (var _i = 0; _i < arguments.length; _i++) { + graphicTemplates[_i] = arguments[_i]; + } + graphicTemplates.forEach(function (graphicTemplate) { + _this.graphicTemplateMap.set(graphicTemplate.type, graphicTemplate); + }); + }; + GraphicSceneBase.prototype.getGraphicTemplatesByType = function (type) { + var template = this.graphicTemplateMap.get(type); + if (!template) { + throw new Error("\u4E0D\u5B58\u5728type=".concat(type, "\u7684\u56FE\u5F62\u5BF9\u8C61\u6A21\u677F")); + } + return template; + }; + GraphicSceneBase.prototype.updateViewport = function (domWidth, domHeight) { + var screenWidth = this.viewport.screenWidth; + var screenHeight = this.viewport.screenHeight; + if (domWidth) { + screenWidth = domWidth; + } + if (domHeight) { + screenHeight = domHeight; + } + var worldWidth = this.canvas._properties.width; + var worldHeight = this.canvas._properties.height; + this.pixi.resize(); + this.viewport.resize(screenWidth, screenHeight, worldWidth, worldHeight); + if (this.viewport.OOB().right) { + this.viewport.right = this.viewport.right + 1; + } + else if (this.viewport.OOB().left) { + this.viewport.left = this.viewport.left - 1; + } + else if (this.viewport.OOB().top) { + this.viewport.top = this.viewport.top - 1; + } + else if (this.viewport.OOB().bottom) { + this.viewport.bottom = this.viewport.bottom + 1; + } + }; + /** + * 暂停 + */ + GraphicSceneBase.prototype.pause = function () { + // 暂停动画 + this.animationManager.pause(); + // 取消消息订阅 + this.wsMsgBroker.unsubscribeAll(); + // 关闭所有上下文菜单 + this.menuPlugin.closeAll(); + }; + /** + * 恢复 + */ + GraphicSceneBase.prototype.resume = function () { + // 恢复动画 + this.animationManager.resume(); + // 重新订阅 + this.wsMsgBroker.resubscribeAll(); + }; + GraphicSceneBase.prototype.bindDom = function (dom) { + var _this = this; + this._dom = dom; + this.pixi.resizeTo = dom; + dom.appendChild(this.pixi.view); + this._viewportResizer = setInterval(function () { + // console.log( + // 'dom resize ', + // dom.style.width, + // dom.style.height, + // dom.clientWidth, + // dom.clientHeight + // ); + _this.updateViewport(dom.clientWidth, dom.clientHeight); + }, 1000); + // 恢复 + this.resume(); + }; + GraphicSceneBase.prototype.unbindDom = function () { + if (this._dom) { + clearInterval(this._viewportResizer); + this._dom.removeChild(this.pixi.view); + this._dom = undefined; + // 暂停 + this.pause(); + } + }; + /** + * 加载图形,GraphicApp默认添加到无交互容器,DrawApp默认添加到交互容器,如需定制,提供选项配置 + * @param protos + * @param options 添加到可交互/不可交互容器选项配置 + */ + GraphicSceneBase.prototype.loadGraphic = function (protos) { + var _a; + return __awaiter(this, void 0, void 0, function () { + var _i, _b, item, max; + var _this = this; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + _i = 0, _b = this.graphicTemplateMap; + _c.label = 1; + case 1: + if (!(_i < _b.length)) return [3 /*break*/, 4]; + item = _b[_i]; + return [4 /*yield*/, item[1].loadAssets()]; + case 2: + _c.sent(); + _c.label = 3; + case 3: + _i++; + return [3 /*break*/, 1]; + case 4: + // console.log('开始加载proto数据', protos); + // 加载数据到图形存储 + protos.forEach(function (proto) { + var template = _this.getGraphicTemplatesByType(proto.graphicType); + var g = template.new(); + g.loadData(proto); + _this.addGraphics(g); + }); + // 加载数据关系 + this.queryStore.getAllGraphics().forEach(function (g) { return g.loadRelations(); }); + max = (_a = this.queryStore + .getAllGraphics() + .filter(function (g) { return !isNaN(parseInt(g.id)); }) + .map(function (g) { return parseInt(g.id); }) + .sort(function (a, b) { return a - b; }) + .pop()) !== null && _a !== void 0 ? _a : 0; + // console.log('最大值', max) + GraphicIdGenerator.initSerial(max); + // 数据加载完成后 + this.emit('postdataloaded'); + // 加载完成通知 + this.emit('loadfinish'); + return [2 /*return*/]; + } + }); + }); + }; + /** + * 添加图形前处理 + * @param graphic + */ + GraphicSceneBase.prototype.beforeGraphicStore = function (graphic) { + var interactiveGraphicTypeIncludes = this._options.interactiveGraphicTypeIncludes || []; + var interactiveGraphicTypeExcludes = this._options.interactiveGraphicTypeExcludes || []; + // 默认无交互 + graphic.eventMode = 'auto'; + if (interactiveGraphicTypeIncludes.findIndex(function (type) { return type === graphic.type; }) >= 0) { + graphic.eventMode = 'static'; + } + else if (interactiveGraphicTypeExcludes.findIndex(function (type) { return type === graphic.type; }) < 0) { + graphic.eventMode = 'static'; + } + }; + /** + * 执行添加图形对象 + * @param graphic + */ + GraphicSceneBase.prototype.doAddGraphics = function (graphic) { + var _this = this; + this.beforeGraphicStore(graphic); + if (this.graphicStore.storeGraphics(graphic)) { + // cullable,默认设置剪裁,如果图形包围框不在屏幕内,则不渲染,增加效率用 + if (!this._options || this._options.cullable !== false) { + graphic.cullable = true; + } + if (graphic.eventMode == 'static' || graphic.eventMode == 'dynamic') { + // 添加为可交互 + // console.log(`type=${graphic.type}的图形添加到交互容器`); + this.canvas.addChild(graphic); + } + else { + // 添加到不可交互容器 + // console.log(`type=${graphic.type}的图形添加到无交互容器`); + this.canvas.addNonInteractiveChild(graphic); + } + graphic.repaint(); + this.emit('graphicstored', graphic); + graphic.on('childselected', function (child) { + _this.emit('graphicchildselectedchange', child, true); + }); + graphic.on('childunselected', function (child) { + _this.emit('graphicchildselectedchange', child, false); + }); + } + }; + GraphicSceneBase.prototype.doDeleteGraphics = function (graphic) { + // 从store中删除 + var g = this.graphicStore.deleteGraphics(graphic); + if (g) { + // 清除选中 + g.updateSelected(false); + // 从画布移除 + this.canvas.removeGraphic(g); + // 对象删除处理 + g.onDelete(); + this.emit('graphicdeleted', g); + } + }; + /** + * 存储图形 + * @param graphics 图形对象 + */ + GraphicSceneBase.prototype.addGraphics = function () { + var _this = this; + var graphics = []; + for (var _i = 0; _i < arguments.length; _i++) { + graphics[_i] = arguments[_i]; + } + graphics.forEach(function (g) { return _this.doAddGraphics(g); }); + }; + /** + * 删除图形 + * @param graphics 图形对象 + */ + GraphicSceneBase.prototype.deleteGraphics = function () { + var _this = this; + var graphics = []; + for (var _i = 0; _i < arguments.length; _i++) { + graphics[_i] = arguments[_i]; + } + var dels = graphics.filter(function (g) { + var _a; + if (((_a = _this._options) === null || _a === void 0 ? void 0 : _a.isSupportDeletion) == undefined || + _this._options.isSupportDeletion(g)) { + _this.doDeleteGraphics(g); + return true; + } + console.debug("type=".concat(g.type, ",id=").concat(g.id, "\u7684\u56FE\u5F62\u4E0D\u652F\u6301\u5220\u9664")); + return false; + }); + return dels; + }; + /** + * 检测并构建关系 + */ + GraphicSceneBase.prototype.detectRelations = function () { + this.queryStore.getAllGraphics().forEach(function (g) { return g.buildRelation(); }); + }; + /** + * 全选 + */ + GraphicSceneBase.prototype.selectAllGraphics = function (filter) { + if (filter == undefined) { + filter = function (g) { return g.visible; }; + } + this.updateSelected.apply(this, this.queryStore.getAllGraphics().filter(filter)); + }; + /** + * 更新选中 + */ + GraphicSceneBase.prototype.updateSelected = function () { + var graphics = []; + for (var _i = 0; _i < arguments.length; _i++) { + graphics[_i] = arguments[_i]; + } + this.selectedGraphics.forEach(function (graphic) { + if (graphics.findIndex(function (g) { return g.id === graphic.id; }) >= 0) { + return; + } + if (graphic.selected) { + graphic.updateSelected(false); + } + }); + graphics.forEach(function (graphic) { + graphic.updateSelected(true); + }); + }; + GraphicSceneBase.prototype.doEmitAppGraphicSelected = function () { + // 场景发布图形选中 + this.emit('graphicselected', this.selectedGraphics); + // this.app.emit('graphicselected', this.selectedGraphics); + }; + /** + * 更新画布 + * @param param + */ + GraphicSceneBase.prototype.updateCanvas = function (param) { + this.canvas.update(param); + }; + /** + * 使图形居中显示(所有图形的外包围盒) + */ + GraphicSceneBase.prototype.makeGraphicCenterShow = function () { + var group = []; + for (var _i = 0; _i < arguments.length; _i++) { + group[_i] = arguments[_i]; + } + if (group.length > 0) { + var bounds0 = group[0].getBounds(); + var lx = bounds0.x; + var ly = bounds0.y; + var rx = bounds0.x + bounds0.width; + var ry = bounds0.y + bounds0.height; + if (group.length > 1) { + for (var i = 1; i < group.length; i++) { + var g = group[i]; + var bound = g.getBounds(); + if (bound.x < lx) { + lx = bound.x; + } + if (bound.y < ly) { + ly = bound.y; + } + var brx = bound.x + bound.width; + if (brx > rx) { + rx = brx; + } + var bry = bound.y + bound.height; + if (bry > ry) { + ry = bry; + } + } + } + var _a = getRectangleCenter(new pixi_js.Rectangle(lx, ly, rx - lx, ry - ly)), x = _a.x, y = _a.y; + var p = this.viewport.toWorld(x, y); + this.viewport.moveCenter(p.x, p.y); + } + }; + /** + * 注册交互插件,会替换旧的 + */ + GraphicSceneBase.prototype.registerInteractionPlugin = function () { + var _this = this; + var plugins = []; + for (var _i = 0; _i < arguments.length; _i++) { + plugins[_i] = arguments[_i]; + } + plugins.forEach(function (plugin) { + var old = _this.interactionPluginMap.get(plugin.name); + if (old) { + console.warn("\u5DF2\u7ECF\u5B58\u5728name=".concat(plugin.name, "\u7684\u4EA4\u4E92\u63D2\u4EF6,\u5FFD\u7565\u6B64\u63D2\u4EF6\u6CE8\u518C!")); + return; + } + _this.interactionPluginMap.set(plugin.name, plugin); + }); + }; + /** + * 根据名称获取交互插件 + * @param name + * @returns + */ + GraphicSceneBase.prototype.interactionPlugin = function (name) { + var plugin = this.interactionPluginMap.get(name); + if (!plugin) { + throw new Error("\u672A\u627E\u5230name=".concat(name, "\u7684\u4EA4\u4E92\u63D2\u4EF6")); + } + return plugin; + }; + /** + * 停止应用交互插件 + */ + GraphicSceneBase.prototype.pauseAppInteractionPlugins = function () { + var _this = this; + this.interactionPluginMap.forEach(function (plugin) { + if (plugin.isActive() && plugin._type === exports.InteractionPluginType.App) { + _this.doPauseInteractionPlugin(plugin); + } + }); + }; + GraphicSceneBase.prototype.doPauseInteractionPlugin = function (plugin) { + if (plugin && plugin.isActive()) { + plugin.pause(); + this.emit('interaction-plugin-pause', plugin); + } + }; + /** + * 移除交互插件 + */ + GraphicSceneBase.prototype.removeInteractionPlugin = function (plugin) { + this.interactionPluginMap.delete(plugin.name); + }; + GraphicSceneBase.prototype.checkWsMsgCli = function () { + if (!WsMsgCli.isInitiated()) { + throw new Error('订阅消息需先启动消息代理, 执行app.enableWebsocket()'); + } + }; + /** + * 订阅websocket消息 + */ + GraphicSceneBase.prototype.subscribe = function (sub) { + this.checkWsMsgCli(); + this.wsMsgBroker.subscribe(sub); + }; + /** + * 取消websocket订阅 + */ + GraphicSceneBase.prototype.unsubscribe = function (destination) { + this.checkWsMsgCli(); + this.wsMsgBroker.unsbuscribe(destination); + }; + /** + * 处理图形状态 + * @param graphicStates + */ + GraphicSceneBase.prototype.handleGraphicStates = function (graphicStates, queryer, createOnNotFound) { + var _this = this; + graphicStates.forEach(function (state) { + var g; + if (queryer) { + g = queryer(state, _this.queryStore); + } + else { + g = _this.queryStore.queryByCodeAndType(state.code, state.graphicType); + } + try { + if (!g) { + // 未找到图形对象 + if (!state.remove && + createOnNotFound && + createOnNotFound.graphicTypes && + createOnNotFound.graphicTypes.findIndex(function (v) { return v === state.graphicType; }) >= 0) { + var template = _this.getGraphicTemplatesByType(state.graphicType); + var g_1 = template.new(); + g_1.loadState(state); + _this.addGraphics(g_1); + } + } + else { + // 找到 + if (state.remove) { + _this.deleteGraphics(g); + g.destroy({ children: true }); + } + else if (g.updateStates(state)) { + g.repaint(); + } + } + } + catch (err) { + console.error('图形状态处理异常', g, state, err); + // throw err; + } + }); + }; + /** + * 销毁 + */ + GraphicSceneBase.prototype.destroy = function () { + console.debug('场景销毁', this); + this.unbindDom(); + if (this.wsMsgBroker) { + this.wsMsgBroker.close(); + } + this.interactionPluginMap.forEach(function (plugin) { + plugin.pause(); + }); + this.animationManager.destroy(); + this.canvas.destroy(true); + this.viewport.destroy(); + this.pixi.destroy(true, true); + }; + return GraphicSceneBase; +}(EventEmitter)); +/** + * 图形app基类 + */ +var GraphicApp = /** @class */ (function (_super) { + __extends(GraphicApp, _super); + function GraphicApp(options) { + var _this = _super.call(this, options) || this; + /** + * 场景列表 + */ + _this.scenes = new Map(); + // console.log('创建图形App') + _this.opRecord = new OperationRecord(); + // 绑定键盘监听 + _this.keyboardPlugin = new JlGraphicAppKeyboardPlugin(_this); + return _this; + } + Object.defineProperty(GraphicApp.prototype, "app", { + get: function () { + return this; + }, + enumerable: false, + configurable: true + }); + GraphicApp.prototype.setOptions = function (options) { + // console.log('更新选项', options); + if (options.maxOperationRecords && options.maxOperationRecords > 0) { + this.opRecord.setMaxLen(options.maxOperationRecords); + } + _super.prototype.setOptions.call(this, options); + }; + GraphicApp.prototype.addGraphicAndRecord = function () { + var graphics = []; + for (var _i = 0; _i < arguments.length; _i++) { + graphics[_i] = arguments[_i]; + } + this.addGraphics.apply(this, graphics); + this.opRecord.record(new GraphicCreateOperation(this, graphics)); + }; + GraphicApp.prototype.deleteGraphicAndRecord = function () { + var graphics = []; + for (var _i = 0; _i < arguments.length; _i++) { + graphics[_i] = arguments[_i]; + } + this.deleteGraphics.apply(this, graphics); + this.opRecord.record(new GraphicDeleteOperation(this, graphics)); + }; + /** + * 实例化一个场景 + * @param code 场景标识 + * @returns + */ + GraphicApp.prototype.initScene = function (code, options) { + var scene = this.scenes.get(code); + if (!scene) { + scene = new JlScene(this, code, options); + this.scenes.set(code, scene); + } + return scene; + }; + /** + * 获取场景 + * @param code + * @returns + */ + GraphicApp.prototype.getScene = function (code) { + var scene = this.scenes.get(code); + if (!scene) { + throw new Error("\u4E0D\u5B58\u5728code=".concat(code, "\u7684\u573A\u666F")); + } + return scene; + }; + GraphicApp.prototype.switchScene = function (code, dom) { + var scene = this.getScene(code); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + for (var _i = 0, _a = this.scenes; _i < _a.length; _i++) { + var _b = _a[_i]; _b[0]; var pre = _b[1]; + if (pre.dom === dom) { + pre.unbindDom(); + break; + } + } + scene.bindDom(dom); + }; + GraphicApp.prototype.removeScene = function (code) { + var scene = this.scenes.get(code); + if (scene) { + this.scenes.delete(code); + scene.destroy(); + } + }; + /** + * 启动websocket消息客户端 + */ + GraphicApp.prototype.enableWsMassaging = function (options) { + WsMsgCli.new(options); + this.wsMsgBroker = new AppWsMsgBroker(this); + }; + /** + * 添加键盘监听器,如果是相同的按键,新注册的会覆盖旧的,当移除新的时,旧的自动生效 + * @param keyListeners + */ + GraphicApp.prototype.addKeyboardListener = function () { + var _this = this; + var keyListeners = []; + for (var _i = 0; _i < arguments.length; _i++) { + keyListeners[_i] = arguments[_i]; + } + keyListeners.forEach(function (keyListener) { + return _this.keyboardPlugin.addKeyListener(keyListener); + }); + }; + /** + * 移除键盘监听器 + * @param keyListeners + */ + GraphicApp.prototype.removeKeyboardListener = function () { + var _this = this; + var keyListeners = []; + for (var _i = 0; _i < arguments.length; _i++) { + keyListeners[_i] = arguments[_i]; + } + keyListeners.forEach(function (keyListener) { + return _this.keyboardPlugin.removeKeyListener(keyListener); + }); + }; + /** + * 销毁 + */ + GraphicApp.prototype.destroy = function () { + console.debug('图形应用销毁', this); + this.emit('destroy', this); + _super.prototype.destroy.call(this); + this.scenes.forEach(function (scene) { return scene.destroy(); }); + }; + return GraphicApp; +}(GraphicSceneBase)); +/** + * 场景 + */ +var JlScene = /** @class */ (function (_super) { + __extends(JlScene, _super); + function JlScene(app, code, options) { + var _this = _super.call(this, options) || this; + _this.code = code; + _this.app = app; + return _this; + } + return JlScene; +}(GraphicSceneBase)); + +/** + * 图形绘制助手 + */ +var GraphicDrawAssistant = /** @class */ (function (_super) { + __extends(GraphicDrawAssistant, _super); + function GraphicDrawAssistant(graphicApp, graphicTemplate, icon, description) { + var _this = _super.call(this, graphicTemplate.type, graphicApp) || this; + _this.__GraphicDrawAssistant = true; + _this.container = new pixi_js.Container(); + _this.escListener = new KeyListener({ + value: 'Escape', + onRelease: function () { + _this.onEsc(); + }, + }); + _this.app = graphicApp; + _this.type = graphicTemplate.type; + _this.graphicTemplate = graphicTemplate; + _this.icon = icon; + _this.description = description; + _this.app.registerGraphicTemplates(_this.graphicTemplate); + return _this; + } + GraphicDrawAssistant.prototype.onEsc = function () { + this.createAndStore(true); + }; + Object.defineProperty(GraphicDrawAssistant.prototype, "canvas", { + get: function () { + return this.app.canvas; + }, + enumerable: false, + configurable: true + }); + GraphicDrawAssistant.prototype.bind = function () { + this.app.drawing = true; + var canvas = this.canvas; + canvas.addChild(this.container); + canvas.on('mousedown', this.onLeftDown, this); + canvas.on('mousemove', this.onMouseMove, this); + canvas.on('mouseup', this.onLeftUp, this); + canvas.on('rightdown', this.onRightDown, this); + canvas.on('rightup', this.onRightUp, this); + canvas.on('_rightclick', this.onRightClick, this); + this.app.viewport.wheel({ + percent: 0.01, + }); + this.app.addKeyboardListener(this.escListener); + this.app.viewport.drag({ + mouseButtons: 'right', + }); + }; + GraphicDrawAssistant.prototype.unbind = function () { + var _a; + this.clearCache(); + var canvas = this.canvas; + if ((_a = this.container) === null || _a === void 0 ? void 0 : _a.parent) { + canvas.removeChild(this.container); + } + canvas.off('mousedown', this.onLeftDown, this); + canvas.off('mousemove', this.onMouseMove, this); + canvas.off('mouseup', this.onLeftUp, this); + canvas.off('rightdown', this.onRightDown, this); + canvas.off('rightup', this.onRightUp, this); + this.app.viewport.plugins.remove('wheel'); + this.app.removeKeyboardListener(this.escListener); + this.app.viewport.plugins.remove('drag'); + this.app.drawing = false; + }; + GraphicDrawAssistant.prototype.onLeftDown = function (e) { }; + GraphicDrawAssistant.prototype.onMouseMove = function (e) { + this.redraw(this.toCanvasCoordinates(e.global)); + }; + GraphicDrawAssistant.prototype.onLeftUp = function (e) { }; + GraphicDrawAssistant.prototype.onRightDown = function (e) { }; + GraphicDrawAssistant.prototype.onRightUp = function (e) { }; + GraphicDrawAssistant.prototype.onRightClick = function (e) { + this.finish(); + }; + /** + * 获取下一个id + */ + GraphicDrawAssistant.prototype.nextId = function () { + return GraphicIdGenerator.next(); + }; + GraphicDrawAssistant.prototype.clearCache = function () { }; + GraphicDrawAssistant.prototype.toCanvasCoordinates = function (p) { + return this.app.toCanvasCoordinates(p); + }; + /** + * 保存创建的图形对象 + */ + GraphicDrawAssistant.prototype.storeGraphic = function () { + var _a; + var graphics = []; + for (var _i = 0; _i < arguments.length; _i++) { + graphics[_i] = arguments[_i]; + } + (_a = this.app).addGraphicAndRecord.apply(_a, graphics); + }; + /** + * 创建并添加到图形App + */ + GraphicDrawAssistant.prototype.createAndStore = function (finish) { + var data = this.graphicTemplate.datas; + data.id = this.nextId(); + data.graphicType = this.graphicTemplate.type; + if (!this.prepareData(data)) { + if (finish) { + this.finish(); + } + return null; + } + var template = this.graphicTemplate; + var g = template.new(); + g.loadData(data); + this.storeGraphic(g); + if (finish) { + this.finish(g); + } + return g; + }; + /** + * 绘制完成 + */ + GraphicDrawAssistant.prototype.finish = function () { + var _a; + var graphics = []; + for (var _i = 0; _i < arguments.length; _i++) { + graphics[_i] = arguments[_i]; + } + this.clearCache(); + this.app.interactionPlugin(CommonMouseTool.Name).resume(); + (_a = this.app).updateSelected.apply(_a, graphics); + }; + return GraphicDrawAssistant; +}(AppInteractionPlugin)); +/** + * 绘制应用 + */ +var JlDrawApp = /** @class */ (function (_super) { + __extends(JlDrawApp, _super); + function JlDrawApp(options) { + var _this = _super.call(this, options) || this; + _this.font = pixi_js.BitmapFont.from('coordinates', { + fontFamily: 'Roboto', + fontSize: 16, + fill: '#ff2700', + }, { chars: ['画布坐标:() 屏幕坐标:() 缩放:.,', ['0', '9']] }); + _this.coordinates = new pixi_js.BitmapText('画布坐标: (0, 0) 屏幕坐标:(0, 0)', { + fontName: 'coordinates', + }); + _this.scaleText = new pixi_js.BitmapText('缩放: 1', { + fontName: 'coordinates', + }); + _this.drawAssistants = []; + _this._drawing = false; + _this.formData = undefined; + _this.appendDrawStatesDisplay(); + // 拖拽操作记录 + _this.appOperationRecord(); + // 绑定通用键盘操作 + _this.bindKeyboardOperation(); + _this.formDataSyncListen(); + _this.debouncedFormDataUpdator = debounce(_this.doFormDataUpdate, 60); + return _this; + } + Object.defineProperty(JlDrawApp.prototype, "drawing", { + get: function () { + return this._drawing; + }, + set: function (value) { + this._drawing = value; + }, + enumerable: false, + configurable: true + }); + JlDrawApp.prototype.setOptions = function (options) { + _super.prototype.setOptions.call(this, options); + }; + JlDrawApp.prototype.registerInteractionPlugin = function () { + var _this = this; + var plugins = []; + for (var _i = 0; _i < arguments.length; _i++) { + plugins[_i] = arguments[_i]; + } + plugins.forEach(function (plugin) { + if (plugin instanceof GraphicDrawAssistant) { + _this.drawAssistants.push(plugin); + } + _super.prototype.registerInteractionPlugin.call(_this, plugin); + }); + }; + JlDrawApp.prototype.getDrawAssistant = function (graphicType) { + var sda = this.drawAssistants + .filter(function (da) { return da.type === graphicType; }) + .pop(); + if (!sda) { + throw new Error("\u672A\u627E\u5230\u56FE\u5F62\u7ED8\u5236\u52A9\u624B: ".concat(graphicType)); + } + return sda; + }; + JlDrawApp.prototype.appOperationRecord = function () { + var _this = this; + var dragStartDatas = []; + this.on('drag_op_start', function (e) { + // 图形拖拽,记录初始数据 + if (!e.target.isCanvas()) { + dragStartDatas = _this.selectedGraphics.map(function (g) { return g.saveData(); }); + } + }); + // 图形拖拽操作监听 + this.on('drag_op_end', function () { + // 图形拖拽,记录操作 + if (dragStartDatas.length > 0) { + var newData = _this.selectedGraphics.map(function (g) { return g.saveData(); }); + _this.opRecord.record(new GraphicDataUpdateOperation(_this, _this.selectedGraphics, dragStartDatas, newData)); + dragStartDatas = []; + } + }); + // 菜单操作 + var preMenuHandleDatas = []; + this.on('pre-menu-handle', function (menu) { + if (menu.name === '撤销' || menu.name === '重做') { + return; + } + preMenuHandleDatas = _this.selectedGraphics.map(function (g) { return g.saveData(); }); + }); + this.on('post-menu-handle', function () { + if (preMenuHandleDatas.length > 0) { + var newData = _this.selectedGraphics.map(function (g) { return g.saveData(); }); + _this.opRecord.record(new GraphicDataUpdateOperation(_this, _this.selectedGraphics, preMenuHandleDatas, newData)); + preMenuHandleDatas = []; + } + }); + }; + /** + * 绘制状态信息显示 + */ + JlDrawApp.prototype.appendDrawStatesDisplay = function () { + var _this = this; + this.pixi.stage.addChild(this.coordinates); + this.pixi.stage.addChild(this.scaleText); + var bound = this.coordinates.getLocalBounds(); + this.scaleText.position.set(bound.width + 10, 0); + this.canvas.on('mousemove', function (e) { + if (e.target) { + var _a = _this.toCanvasCoordinates(e.global), x = _a.x, y = _a.y; + var cpTxt = "(".concat(x, ", ").concat(y, ")"); + var tp = e.global; + var tpTxt = "(".concat(tp.x, ", ").concat(tp.y, ")"); + _this.coordinates.text = "\u753B\u5E03\u5750\u6807:".concat(cpTxt, " \u5C4F\u5E55\u5750\u6807:").concat(tpTxt); + var bound_1 = _this.coordinates.getLocalBounds(); + _this.scaleText.position.set(bound_1.width + 10, 0); + } + }); + this.viewport.on('zoomed-end', function () { + _this.scaleText.text = "\u7F29\u653E: ".concat(_this.viewport.scaled); + }); + }; + JlDrawApp.prototype.bindKeyboardOperation = function () { + var _this = this; + this.addKeyboardListener( + // Ctrl + A + new KeyListener({ + value: 'KeyA', + combinations: [exports.CombinationKey.Ctrl], + onPress: function (e, app) { + if (e.ctrlKey) { + app.selectAllGraphics(); + } + }, + })); + // 复制功能 + this.addKeyboardListener(new KeyListener({ + value: 'KeyD', + combinations: [exports.CombinationKey.Shift], + onPress: function (e, app) { + _this.graphicCopyPlugin.init(); + }, + })); + this.addKeyboardListener(new KeyListener({ + // Ctrl + Z + value: 'KeyZ', + global: true, + combinations: [exports.CombinationKey.Ctrl], + onPress: function (e, app) { + app.opRecord.undo(); + }, + })); + this.addKeyboardListener(new KeyListener({ + // Ctrl + Shift + Z + value: 'KeyZ', + global: true, + combinations: [exports.CombinationKey.Ctrl, exports.CombinationKey.Shift], + onPress: function (e, app) { + app.opRecord.redo(); + }, + })); + this.addKeyboardListener(new KeyListener({ + value: 'Delete', + onPress: function (e, app) { + app.deleteGraphicAndRecord.apply(app, app.selectedGraphics); + }, + })); + this.addKeyboardListener(new KeyListener({ + value: 'ArrowUp', + pressTriggerAsOriginalEvent: true, + onPress: function (e, app) { + updateGraphicPositionOnKeyboardEvent(app, UP); + }, + onRelease: function (e, app) { + recordGraphicMoveOperation(app); + }, + })); + this.addKeyboardListener(new KeyListener({ + value: 'ArrowDown', + pressTriggerAsOriginalEvent: true, + onPress: function (e, app) { + updateGraphicPositionOnKeyboardEvent(app, DOWN); + }, + onRelease: function (e, app) { + recordGraphicMoveOperation(app); + }, + })); + this.addKeyboardListener(new KeyListener({ + value: 'ArrowLeft', + pressTriggerAsOriginalEvent: true, + onPress: function (e, app) { + updateGraphicPositionOnKeyboardEvent(app, LEFT); + }, + onRelease: function (e, app) { + recordGraphicMoveOperation(app); + }, + })); + this.addKeyboardListener(new KeyListener({ + value: 'ArrowRight', + pressTriggerAsOriginalEvent: true, + onPress: function (e, app) { + updateGraphicPositionOnKeyboardEvent(app, RIGHT); + }, + onRelease: function (e, app) { + recordGraphicMoveOperation(app); + }, + })); + }; + /** + * 图形对象存储处理,默认添加图形交互 + * @param graphic + */ + JlDrawApp.prototype.beforeGraphicStore = function (graphic) { + var _this = this; + graphic.eventMode = 'static'; + graphic.selectable = true; + graphic.draggable = true; + graphic.on('repaint', function () { + _this.handleFormDataUpdate(graphic); + }); + graphic.on('transformend', function () { + _this.handleFormDataUpdate(graphic); + }); + }; + /** + * 绑定form表单对象 + * @param form + */ + JlDrawApp.prototype.bindFormData = function (form) { + this.formData = form; + if (this.formData && this.selectedGraphics.length == 1) { + if (this.formData.graphicType == this.selectedGraphics[0].type) { + this.formData.copyFrom(this.selectedGraphics[0].saveData()); + } + else { + this.formData = undefined; + } + } + }; + /** + * 移除form绑定 + * @param form + */ + JlDrawApp.prototype.unbindFormData = function (form) { + if (this.formData == form) { + this.formData = undefined; + } + }; + JlDrawApp.prototype.formDataSyncListen = function () { + var _this = this; + this.on('graphicselected', function () { + if (_this.selectedGraphics.length == 1) { + _this.handleFormDataUpdate(_this.selectedGraphics[0]); + } + }); + }; + /** + * 处理表单数据更新(使用debounce限流) + */ + JlDrawApp.prototype.handleFormDataUpdate = function (g) { + this.debouncedFormDataUpdator(this, g); + }; + JlDrawApp.prototype.doFormDataUpdate = function (g) { + if (this.selectedGraphics.length > 1) + return; + if (this.formData && g.type === this.formData.graphicType) { + this.formData.copyFrom(g.saveData()); + } + }; + JlDrawApp.prototype.updateCanvasAndRecord = function (data) { + var old = this.canvas.properties.clone(); + this.canvas.update(data); + var newVal = this.canvas.properties.clone(); + this.opRecord.record(new UpdateCanvasOperation(this, this.canvas, old, newVal)); + }; + JlDrawApp.prototype.updateGraphicAndRecord = function (g, data) { + var old = g.saveData(); + g.updateData(data); + var newVal = g.saveData(); + this.opRecord.record(new GraphicDataUpdateOperation(this, [g], [old], [newVal])); + }; + return JlDrawApp; +}(GraphicApp)); +var dragStartDatas = []; +function handleArrowKeyMoveGraphics(app, handler) { + if (app.selectedGraphics.length === 1 && + app.selectedGraphics[0].hasSelectedChilds()) { + recursiveChildren(app.selectedGraphics[0], function (child) { + if (child.selected && child.draggable) { + handler(child); + } + }); + } + else { + app.selectedGraphics.forEach(function (g) { + handler(g); + }); + } +} +function updateGraphicPositionOnKeyboardEvent(app, dp) { + var dragStart = false; + if (dragStartDatas.length === 0) { + dragStartDatas = app.selectedGraphics.map(function (g) { return g.saveData(); }); + dragStart = true; + } + handleArrowKeyMoveGraphics(app, function (g) { + if (dragStart) { + g.shiftStartPoint = g.position.clone(); + g.emit('transformstart', GraphicTransformEvent.shift(g, ShiftData.new(g.shiftStartPoint))); + } + else { + g.shiftLastPoint = g.position.clone(); + } + g.position.x += dp.x; + g.position.y += dp.y; + if (!dragStart) { + if (g.shiftStartPoint && g.shiftLastPoint) { + g.emit('transforming', GraphicTransformEvent.shift(g, ShiftData.new(g.shiftStartPoint, g.position.clone(), g.shiftLastPoint))); + } + } + }); +} +function recordGraphicMoveOperation(app) { + if (dragStartDatas.length > 0 && + dragStartDatas.length === app.selectedGraphics.length) { + var newData = app.selectedGraphics.map(function (g) { return g.saveData(); }); + app.opRecord.record(new GraphicDataUpdateOperation(app, app.selectedGraphics, dragStartDatas, newData)); + handleArrowKeyMoveGraphics(app, function (g) { + if (g.shiftStartPoint) { + g.emit('transformend', GraphicTransformEvent.shift(g, ShiftData.new(g.shiftStartPoint, g.position.clone()))); + } + }); + } + dragStartDatas = []; +} + +/** + * 实例化图形app + * @param options + * @returns + */ +function newGraphicApp(options) { + return new GraphicApp(options); +} +/** + * 实例化绘图app + * @param options + * @returns + */ +function newDrawApp(options) { + return new JlDrawApp(options); +} + +//基础图形对象扩展 +pixi_js.DisplayObject.prototype._selectable = false; //是否可选中 +pixi_js.DisplayObject.prototype._selected = false; +pixi_js.DisplayObject.prototype._childEdit = false; +pixi_js.DisplayObject.prototype._transformSave = false; +pixi_js.DisplayObject.prototype._assistantAppendMap = null; +pixi_js.DisplayObject.prototype._draggable = false; +pixi_js.DisplayObject.prototype._shiftStartPoint = null; +pixi_js.DisplayObject.prototype._shiftLastPoint = null; +pixi_js.DisplayObject.prototype._scalable = false; +pixi_js.DisplayObject.prototype._keepAspectRatio = true; +pixi_js.DisplayObject.prototype._rotatable = false; +Object.defineProperties(pixi_js.DisplayObject.prototype, { + assistantAppendMap: { + get: function () { + if (this._assistantAppendMap == null) { + this._assistantAppendMap = new Map(); + } + return this._assistantAppendMap; + }, + }, + selectable: { + get: function () { + return this._selectable; + }, + set: function (value) { + this._selectable = value; + }, + }, + selected: { + get: function () { + return this._selected; + }, + set: function (v) { + this._selected = v; + }, + }, + childEdit: { + get: function () { + return this._childEdit; + }, + set: function (v) { + this._childEdit = v; + }, + }, + transformSave: { + get: function () { + return this._transformSave; + }, + set: function (v) { + this._transformSave = v; + }, + }, + draggable: { + get: function () { + return this._draggable; + }, + set: function (v) { + this._draggable = v; + }, + }, + shiftStartPoint: { + get: function () { + return this._shiftStartPoint; + }, + set: function (v) { + this._shiftStartPoint = v; + }, + }, + shiftLastPoint: { + get: function () { + return this._shiftLastPoint; + }, + set: function (v) { + this._shiftLastPoint = v; + }, + }, + scalable: { + get: function () { + return this._scalable; + }, + set: function (v) { + this._scalable = v; + }, + }, + keepAspectRatio: { + get: function () { + return this._keepAspectRatio; + }, + set: function (v) { + this._keepAspectRatio = v; + }, + }, + rotatable: { + get: function () { + return this._rotatable; + }, + set: function (v) { + this._rotatable = v; + }, + }, + worldAngle: { + get: function () { + var angle = this.angle; + var parent = this.parent; + while (parent != undefined && parent != null) { + angle += parent.angle; + parent = parent.parent; + } + angle = angle % 360; + if (angle > 180) { + angle = angle - 360; + } + return angle; + }, + }, +}); +pixi_js.DisplayObject.prototype.getAllParentScaled = + function getAllParentScaled() { + var scaled = new pixi_js.Point(1, 1); + recursiveParents(this, function (parent) { + scaled.x *= parent.scale.x; + scaled.y *= parent.scale.y; + }); + return scaled; + }; +pixi_js.DisplayObject.prototype.getPositionOnCanvas = + function getPositionOnCanvas() { + if (this.parent.isCanvas()) { + return this.position; + } + else { + return this.parent.localToCanvasPoint(this.position); + } + }; +pixi_js.DisplayObject.prototype.updatePositionByCanvasPosition = + function updatePositionByCanvasPosition(p) { + if (this.parent.isCanvas()) { + this.position.copyFrom(p); + } + else { + var localPosition = this.parent.canvasToLocalPoint(p); + this.position.copyFrom(localPosition); + } + }; +pixi_js.DisplayObject.prototype.saveTransform = function saveTransform() { + return GraphicTransform.fromObject(this); +}; +pixi_js.DisplayObject.prototype.loadTransform = function loadTransform(transfrom) { + this.position.copyFrom(transfrom.position); + this.scale.copyFrom(transfrom.scale); + this.rotation = transfrom.rotation; + this.skew.copyFrom(transfrom.skew); +}; +pixi_js.DisplayObject.prototype.isChild = function isChild(obj) { + return recursiveFindChild(this, function (child) { return child == obj; }) != null; +}; +pixi_js.DisplayObject.prototype.isParent = function isParent(obj) { + return recursiveFindParent(this, function (parent) { return parent == obj; }) != null; +}; +pixi_js.DisplayObject.prototype.isAssistantAppend = + function isAssistantAppend() { + return (recursiveFindParent(this, function (parent) { + return parent.name === AppConsts.AssistantAppendsName; + }) != null); + }; +pixi_js.DisplayObject.prototype.addAssistantAppend = function addAssistantAppend() { + var _this = this; + var appends = []; + for (var _i = 0; _i < arguments.length; _i++) { + appends[_i] = arguments[_i]; + } + appends.forEach(function (append) { + if (append.name == null || append.name.trim() == '') { + throw new Error('辅助附加name不能为空'); + } + _this.assistantAppendMap.set(append.name, append); + _this.getCanvas().addAssistantAppends(append); + }); +}; +pixi_js.DisplayObject.prototype.getAssistantAppend = function getAssistantAppend(name) { + return this.assistantAppendMap.get(name); +}; +pixi_js.DisplayObject.prototype.removeAssistantAppend = function removeAssistantAppend() { + var _this = this; + var appends = []; + for (var _i = 0; _i < arguments.length; _i++) { + appends[_i] = arguments[_i]; + } + appends.forEach(function (append) { + if (append.name) { + _this.removeAssistantAppendByName(append.name); + } + }); +}; +pixi_js.DisplayObject.prototype.removeAssistantAppendByName = + function removeAssistantAppendByName() { + var _this = this; + var names = []; + for (var _i = 0; _i < arguments.length; _i++) { + names[_i] = arguments[_i]; + } + names.forEach(function (name) { + var append = _this.getAssistantAppend(name); + if (append) { + _this.getCanvas().removeAssistantAppends(append); + _this.assistantAppendMap.delete(name); + append.destroy(); + } + }); + }; +pixi_js.DisplayObject.prototype.removeAllAssistantAppend = + function removeAllAssistantAppend() { + if (this._assistantAppendMap != null) { + this.assistantAppendMap.forEach(function (append) { + append.getCanvas().removeAssistantAppends(append); + }); + this.assistantAppendMap.clear(); + } + }; +pixi_js.DisplayObject.prototype.isGraphic = function isGraphic() { + return Object.hasOwn(this, '__JlGraphic'); +}; +pixi_js.DisplayObject.prototype.getGraphic = function getGraphic() { + var graphic = this; + while (graphic && !Object.hasOwn(graphic, '__JlGraphic')) { + graphic = graphic.parent; + } + if (graphic) { + return graphic; + } + return null; +}; +pixi_js.DisplayObject.prototype.isGraphicChild = function isGraphicChild() { + var g = this.getGraphic(); + return g != null && !this.isAssistantAppend() && g.isChild(this); +}; +pixi_js.DisplayObject.prototype.onAddToCanvas = function onAddToCanvas(_canvas) { }; +pixi_js.DisplayObject.prototype.onRemoveFromCanvas = function onRemoveFromCanvas(_canvas) { }; +pixi_js.DisplayObject.prototype.isInCanvas = function isInCanvas() { + var graphic = this; + while (graphic && !Object.hasOwn(graphic, '__JlCanvas')) { + graphic = graphic.parent; + } + if (graphic) { + return true; + } + return false; +}; +pixi_js.DisplayObject.prototype.getCanvas = function getCanvas() { + var graphic = this; + while (graphic && !Object.hasOwn(graphic, '__JlCanvas')) { + graphic = graphic.parent; + } + if (graphic) { + return graphic; + } + throw new Error("\u56FE\u5F62".concat(this.name, "\u4E0D\u5728\u753B\u5E03\u4E2D")); +}; +pixi_js.DisplayObject.prototype.isCanvas = function isCanvas() { + return Object.hasOwn(this, '__JlCanvas'); +}; +pixi_js.DisplayObject.prototype.getViewport = function getViewport() { + var canvas = this.getCanvas(); + return canvas.parent; +}; +pixi_js.DisplayObject.prototype.getGraphicApp = function getGraphicApp() { + var canvas = this.getCanvas(); + return canvas.scene.app; +}; +pixi_js.DisplayObject.prototype.localToCanvasPoint = function localToCanvasPoint(p) { + return this.getViewport().toWorld(this.toGlobal(p)); +}; +pixi_js.DisplayObject.prototype.localToCanvasPoints = function localToCanvasPoints() { + var _this = this; + var points = []; + for (var _i = 0; _i < arguments.length; _i++) { + points[_i] = arguments[_i]; + } + return points.map(function (p) { return _this.localToCanvasPoint(p); }); +}; +pixi_js.DisplayObject.prototype.canvasToLocalPoint = function canvasToLocalPoint(p) { + return this.toLocal(this.getViewport().toScreen(p)); +}; +pixi_js.DisplayObject.prototype.canvasToLocalPoints = function canvasToLocalPoints() { + var _this = this; + var points = []; + for (var _i = 0; _i < arguments.length; _i++) { + points[_i] = arguments[_i]; + } + return points.map(function (p) { return _this.canvasToLocalPoint(p); }); +}; +pixi_js.DisplayObject.prototype.localToScreenPoint = function localToScreenPoint(p) { + return this.toGlobal(p); +}; +pixi_js.DisplayObject.prototype.localToScreenPoints = function localToScreenPoints() { + var _this = this; + var points = []; + for (var _i = 0; _i < arguments.length; _i++) { + points[_i] = arguments[_i]; + } + return points.map(function (p) { return _this.toGlobal(p); }); +}; +pixi_js.DisplayObject.prototype.screenToLocalPoint = function screenToLocalPoint(p) { + return this.toLocal(p); +}; +pixi_js.DisplayObject.prototype.screenToLocalPoints = function screenToLocalPoints() { + var _this = this; + var points = []; + for (var _i = 0; _i < arguments.length; _i++) { + points[_i] = arguments[_i]; + } + return points.map(function (p) { return _this.toLocal(p); }); +}; +pixi_js.DisplayObject.prototype.localBoundsToCanvasPoints = + function localBoundsToCanvasPoints() { + var rect = this.getLocalBounds(); + var pps = convertRectangleToPolygonPoints(rect); + return this.localToCanvasPoints.apply(this, pps); + }; +// 扩展pixijs图形对象,添加自定义绘制贝塞尔曲线,可自定义分段数 +pixi_js.Graphics.prototype.drawBezierCurve = function drawBezierCurve(p1, p2, cp1, cp2, segmentsCount) { + var fromX = p1.x; + var fromY = p1.y; + var n = segmentsCount; + var dt = 0; + var dt2 = 0; + var dt3 = 0; + var t2 = 0; + var t3 = 0; + var cpX = cp1.x; + var cpY = cp1.y; + var cpX2 = cp2.x; + var cpY2 = cp2.y; + var toX = p2.x; + var toY = p2.y; + this.moveTo(p1.x, p1.y); + for (var i = 1, j = 0; i <= n; ++i) { + j = i / n; + dt = 1 - j; + dt2 = dt * dt; + dt3 = dt2 * dt; + t2 = j * j; + t3 = t2 * j; + var px = dt3 * fromX + 3 * dt2 * j * cpX + 3 * dt * t2 * cpX2 + t3 * toX; + var py = dt3 * fromY + 3 * dt2 * j * cpY + 3 * dt * t2 * cpY2 + t3 * toY; + this.lineTo(px, py); + } + return this; +}; +/** + * 图形变换数据 + */ +var GraphicTransform = /** @class */ (function () { + function GraphicTransform(position, scale, rotation, skew) { + this.position = position; + this.scale = scale; + this.rotation = rotation; + this.skew = skew; + } + GraphicTransform.default = function () { + return new GraphicTransform(new pixi_js.Point(0, 0), new pixi_js.Point(1, 1), 0, new pixi_js.Point(0, 0)); + }; + GraphicTransform.fromObject = function (obj) { + return new GraphicTransform(obj.position.clone(), obj.scale.clone(), obj.rotation, obj.skew.clone()); + }; + GraphicTransform.from = function (transform) { + if (transform) { + return new GraphicTransform(new pixi_js.Point(transform.position.x, transform.position.y), new pixi_js.Point(transform.scale.x, transform.scale.y), transform.rotation, new pixi_js.Point(transform.skew.x, transform.skew.y)); + } + return GraphicTransform.default(); + }; + return GraphicTransform; +}()); +/** + * 图形子元素变换 + */ +var ChildTransform = /** @class */ (function () { + function ChildTransform(name, transform) { + this.name = name; + this.transform = transform; + } + ChildTransform.fromChild = function (child) { + var _a; + if (child.name == null || + child.name == undefined || + child.name.trim() == '') { + throw new Error("\u56FE\u5F62type=".concat((_a = child.getGraphic()) === null || _a === void 0 ? void 0 : _a.type, "\u7684\u5B50\u5143\u7D20").concat(child, "name\u4E3A\u7A7A\uFF0C\u4F46\u8BBE\u7F6E\u4E3A\u9700\u8981\u4FDD\u5B58\u53D8\u6362\u6570\u636E")); + } + return new ChildTransform(child.name, GraphicTransform.fromObject(child)); + }; + ChildTransform.from = function (ct) { + return new ChildTransform(ct.name, GraphicTransform.from(ct.transform)); + }; + return ChildTransform; +}()); +var GraphicAnimation = /** @class */ (function () { + function GraphicAnimation(options) { + this.options = options; + this._running = false; + this._xSpeed = 1; + } + GraphicAnimation.init = function (options) { + return new GraphicAnimation(options); + }; + GraphicAnimation.prototype.pause = function () { + this._running = false; + return this; + }; + GraphicAnimation.prototype.resume = function () { + this._running = true; + return this; + }; + Object.defineProperty(GraphicAnimation.prototype, "name", { + get: function () { + return this.options.name; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(GraphicAnimation.prototype, "running", { + get: function () { + return this._running; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(GraphicAnimation.prototype, "xSpeed", { + get: function () { + return this._xSpeed; + }, + set: function (v) { + this._xSpeed = v; + }, + enumerable: false, + configurable: true + }); + GraphicAnimation.prototype.run = function (dt) { + if (this.options.run) { + this.options.run(dt * this.xSpeed); + } + return this; + }; + return GraphicAnimation; +}()); +/** + * 图形对象基类 + */ +var JlGraphic = /** @class */ (function (_super) { + __extends(JlGraphic, _super); + function JlGraphic(type) { + var _this = _super.call(this) || this; + _this.__JlGraphic = true; + _this._id = ''; // 图形的唯一标识,不具有业务意义,唯一,不可重复,可用做图形数据关联。 + _this._code = ''; // 业务编号/名称,用于标识图形对象,具有业务意义 + _this.type = type; + _this.draggable = false; + _this.filters; + return _this; + } + /** + * 添加图形动画,只有在画布上才能添加 + * @param animation + */ + JlGraphic.prototype.addAnimation = function (animation) { + var app = this.getGraphicApp(); + app.animationManager.registerAnimation(this, animation); + }; + JlGraphic.prototype.removeAnimation = function (name) { + var app = this.getGraphicApp(); + app.animationManager.unregisterAnimation(this, name); + }; + JlGraphic.prototype.animation = function (name) { + var app = this.getGraphicApp(); + return app.animationManager.animation(this, name); + }; + JlGraphic.prototype.removeAllAnimation = function () { + var app = this.getGraphicApp(); + app.animationManager.unregisterGraphicAnimations(this); + }; + /** + * 更新选中状态 + * @param selected + * @returns 是否更新 + */ + JlGraphic.prototype.updateSelected = function (selected) { + if (this.selected !== selected) { + this.selected = selected; + this.fireSelected(); + return true; + } + return false; + }; + JlGraphic.prototype.invertSelected = function () { + this.selected = !this.selected; + this.fireSelected(); + }; + JlGraphic.prototype.fireSelected = function () { + if (this.selected) { + this.emit('selected', this); + } + else { + this.exitChildEdit(); + this.removeAllChildSelected(); + this.emit('unselected', this); + } + var app = this.getGraphicApp(); + if (app) { + app.emit('graphicselectedchange', this, this.selected); + } + }; + JlGraphic.prototype.hasSelectedChilds = function () { + return (recursiveFindChild(this, function (child) { + if (child.selected) { + return true; + } + return false; + }) != null); + }; + JlGraphic.prototype.setChildSelected = function (child) { + if (child.isGraphicChild() && child.selectable) { + this.removeAllChildSelected(); + child.selected = true; + this.fireChildSelected(child); + } + return false; + }; + JlGraphic.prototype.invertChildSelected = function (child) { + if (child.isGraphicChild() && child.selectable) { + child.selected = !child.selected; + this.fireChildSelected(child); + } + return false; + }; + JlGraphic.prototype.removeAllChildSelected = function () { + var _this = this; + recursiveChildren(this, function (child) { + if (child.selected) { + child.selected = false; + _this.fireChildSelected(child); + } + }); + }; + JlGraphic.prototype.fireChildSelected = function (child) { + var selected = child.selected; + if (selected) { + this.emit('childselected', child); + } + else { + this.emit('childunselected', child); + } + var app = this.getGraphicApp(); + if (app) { + app.emit('graphicchildselectedchange', child, selected); + } + }; + JlGraphic.prototype.exitChildEdit = function () { + this.childEdit = false; + this.removeAllChildSelected(); + }; + /** + * 是否此对象id/code + */ + JlGraphic.prototype.isIdOrCode = function (s) { + return this.id === s || this.code === s; + }; + Object.defineProperty(JlGraphic.prototype, "id", { + /** + * 获取图形id,如果图形数据对象存在,则返回图形数据对象id + */ + get: function () { + if (this._datas) { + return this._datas.id; + } + return this._id; + }, + /** + * 设置图形id,如果图形数据存在,则同时设置图形数据id + */ + set: function (v) { + this._id = v; + if (this._datas) { + this._datas.id = v; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(JlGraphic.prototype, "code", { + /** + * 获取图形业务code,如果业务code在图形数据或图形状态中,则需要重写此方法 + */ + get: function () { + return this._code; + }, + /** + * 设置图形业务code,如果业务code在图形数据或图形状态中,则需要重写此方法 + */ + set: function (v) { + this._code = v; + }, + enumerable: false, + configurable: true + }); + JlGraphic.prototype.getDatas = function () { + if (this._datas) { + return this._datas; + } + throw new Error("id=".concat(this.id, ",type=").concat(this.type, "\u7684\u56FE\u5F62\u6CA1\u6709\u6570\u636E")); + }; + JlGraphic.prototype.getStates = function () { + if (this._states) { + return this._states; + } + throw new Error("id=".concat(this.id, ",type=").concat(this.type, "\u7684\u7684\u56FE\u5F62\u6CA1\u6709\u72B6\u6001")); + }; + Object.defineProperty(JlGraphic.prototype, "queryStore", { + get: function () { + if (this._queryStore) { + return this._queryStore; + } + throw new Error("type=".concat(this.type, "\u7684\u56FE\u5F62\u6CA1\u6709QueryStore")); + }, + set: function (v) { + this._queryStore = v; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(JlGraphic.prototype, "relationManage", { + get: function () { + if (this._relationManage) { + return this._relationManage; + } + throw new Error("type=".concat(this.type, "\u7684\u56FE\u5F62\u6CA1\u6709\u5173\u7CFB\u7BA1\u7406")); + }, + set: function (v) { + this._relationManage = v; + }, + enumerable: false, + configurable: true + }); + /** + * 构建图形关系 + * @param g + */ + JlGraphic.prototype.buildRelation = function () { }; + /** + * 从数据加载恢复图形关系 + */ + JlGraphic.prototype.loadRelations = function () { }; + /** + * 获取当前图形的所有图形关系 + * @returns + */ + JlGraphic.prototype.getAllRelations = function () { + return this.relationManage.getRelationsOfGraphic(this); + }; + /** + * 获取当前图形的所有指定类型图形关系 + * @param type + * @returns + */ + JlGraphic.prototype.queryRelationByType = function (type) { + return this.relationManage.getRelationsOfGraphicAndOtherType(this, type); + }; + /** + * 删除当前图形关联的指定类型的关系 + * @param type + */ + JlGraphic.prototype.deleteRelationByType = function (type) { + this.relationManage.deleteRelationOfGraphicAndOtherType(this, type); + }; + /** + * 构建并保存关系数据到datas中 + */ + JlGraphic.prototype.saveRelations = function () { }; + /** + * 保存数据,复制,非原始数据 + * @returns + */ + JlGraphic.prototype.saveData = function () { + this.getDatas().graphicType = this.type; + this.getDatas().transform = GraphicTransform.fromObject(this); + this.getDatas().childTransforms = this.buildChildTransforms(); + this.saveRelations(); + return this.getDatas().clone(); + }; + /** + * 构建子元素变换列表 + * @returns + */ + JlGraphic.prototype.buildChildTransforms = function () { + var childTransforms = []; + recursiveChildren(this, function (child) { + if (child.transformSave) { + childTransforms.push(ChildTransform.fromChild(child)); + } + }); + return childTransforms; + }; + /** + * 加载数据 + * @param data + */ + JlGraphic.prototype.loadData = function (data) { + if (data.graphicType !== this.type) { + throw new Error("\u4E0D\u540C\u7684\u56FE\u5F62\u7C7B\u578B,\u8BF7\u68C0\u67E5\u6570\u636E\u662F\u5426\u6B63\u5E38: data.graphicType=\"".concat(data.graphicType, ", type=\"").concat(this.type)); + } + this._datas = data; + this.loadTransformFrom(data); + }; + JlGraphic.prototype.loadTransformFrom = function (data) { + var _this = this; + if (data.transform) { + this.loadTransform(data.transform); + } + if (data.childTransforms) { + data.childTransforms.forEach(function (ct) { + var child = _this.getChildByName(ct.name, true); + if (child) { + child.loadTransform(ct.transform); + } + }); + } + }; + /** + * 更新图形数据 + * @param data + * @returns + */ + JlGraphic.prototype.updateData = function (data) { + var update = false; + if (!this.getDatas().eq(data)) { + update = true; + var old = this.getDatas().clone(); + this.getDatas().copyFrom(data); + this.onDataChange(data, old); + this.loadTransformFrom(data); + this.emit('dataupdate', this.getDatas(), old); + this.repaint(); + } + return update; + }; + /** + * 图形数据更新 + */ + JlGraphic.prototype.onDataChange = function (newVal, old) { }; + /** + * 加载状态 + * @param state + */ + JlGraphic.prototype.loadState = function (state) { + if (state.graphicType !== this.type) { + throw new Error("\u4E0D\u540C\u7684\u56FE\u5F62\u7C7B\u578B,\u8BF7\u68C0\u67E5\u6570\u636E\u662F\u5426\u6B63\u5E38: state.graphicType=\"".concat(state.graphicType, ", type=\"").concat(this.type)); + } + this._states = state; + }; + /** + * 更新状态 + * @param state + * @returns + */ + JlGraphic.prototype.updateStates = function (state) { + var stateChange = false; + if (!this.getStates().eq(state)) { + // 判断并更新状态,默认状态 + var old = this.getStates().clone(); + this.getStates().copyFrom(state); + this.onStateChange(state, old); + stateChange = true; + this.emit('stateupdate', this.getStates(), old); + // this.repaint(); + } + return stateChange; + }; + /** + * 图形状态更新处理 + */ + JlGraphic.prototype.onStateChange = function (newVal, old) { }; + JlGraphic.prototype.repaint = function () { + try { + this.doRepaint(); + this.emit('repaint', this); + } + catch (e) { + console.error("\u8BBE\u5907id=".concat(this.id, ",type=").concat(this.type, "\u91CD\u7ED8\u903B\u8F91\u5F02\u5E38"), e); + } + }; + /** + * 处理删除逻辑 + */ + JlGraphic.prototype.onDelete = function () { + this.removeAllAssistantAppend(); + this.removeAllListeners(); + recursiveChildren(this, function (child) { return child.removeAllAssistantAppend(); }); + }; + /** + * 框选检测,默认取图形包围盒判定,若需要精细判定-子类重写此方法 + * @param box + * @returns + */ + JlGraphic.prototype.boxIntersectCheck = function (box) { + return box.intersects(this.getLocalBounds(), this.localTransform); + }; + return JlGraphic; +}(pixi_js.Container)); +/** + * 图形对象模板 + */ +var JlGraphicTemplate = /** @class */ (function () { + function JlGraphicTemplate(type, options) { + this.type = type; + this.options = options; + } + Object.defineProperty(JlGraphicTemplate.prototype, "datas", { + get: function () { + if (this.options.dataTemplate) { + return this.options.dataTemplate.clone(); + } + throw new Error("type=".concat(this.type, "\u7684\u56FE\u5F62\u6A21\u677F\u6CA1\u6709\u6570\u636E\u6A21\u677F")); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(JlGraphicTemplate.prototype, "states", { + get: function () { + if (this.options.stateTemplate) { + return this.options.stateTemplate.clone(); + } + throw new Error("type=".concat(this.type, "\u7684\u56FE\u5F62\u6A21\u677F\u6CA1\u6709\u72B6\u6001\u6A21\u677F")); + }, + enumerable: false, + configurable: true + }); + /** + * 加载图形对象需要用到的资源 + */ + JlGraphicTemplate.prototype.loadAssets = function () { + return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { + return [2 /*return*/]; + }); }); + }; + /** + * 克隆图形对象 + * @param graphic + * @returns + */ + JlGraphicTemplate.prototype.clone = function (graphic) { + var g = this.new(); + if (graphic._datas) { + // 数据克隆 + var datas = graphic.saveData(); + g.loadData(datas); + } + if (graphic._states) { + // 状态克隆 + var state = graphic.getStates().clone(); + g.loadState(state); + } + g.id = GraphicIdGenerator.next(); + return g; + }; + return JlGraphicTemplate; +}()); + +exports.AbsorbableCircle = AbsorbableCircle; +exports.AbsorbableLine = AbsorbableLine; +exports.AbsorbablePointParam = AbsorbablePointParam; +exports.AnimationManager = AnimationManager; +exports.AppConsts = AppConsts; +exports.AppDragEvent = AppDragEvent; +exports.AppInteractionPlugin = AppInteractionPlugin; +exports.AppWsMsgBroker = AppWsMsgBroker; +exports.BoundsGraphic = BoundsGraphic; +exports.ChildTransform = ChildTransform; +exports.CommonMouseTool = CommonMouseTool; +exports.DOWN = DOWN; +exports.DashedLine = DashedLine; +exports.DragPlugin = DragPlugin; +exports.DraggablePoint = DraggablePoint; +exports.DraggablePointParam = DraggablePointParam; +exports.GlobalKeyboardHelper = GlobalKeyboardHelper; +exports.GraphicAnimation = GraphicAnimation; +exports.GraphicCopyPlugin = GraphicCopyPlugin; +exports.GraphicDataUpdateOperation = GraphicDataUpdateOperation; +exports.GraphicDrawAssistant = GraphicDrawAssistant; +exports.GraphicIdGenerator = GraphicIdGenerator; +exports.GraphicInteractionPlugin = GraphicInteractionPlugin; +exports.GraphicRelation = GraphicRelation; +exports.GraphicRelationParam = GraphicRelationParam; +exports.GraphicStore = GraphicStore; +exports.GraphicTransform = GraphicTransform; +exports.GraphicTransformEvent = GraphicTransformEvent; +exports.GraphicTransformPlugin = GraphicTransformPlugin; +exports.IdGenerator = IdGenerator; +exports.InteractionPluginBase = InteractionPluginBase; +exports.JlGraphic = JlGraphic; +exports.JlGraphicAppKeyboardPlugin = JlGraphicAppKeyboardPlugin; +exports.JlGraphicTemplate = JlGraphicTemplate; +exports.JlOperation = JlOperation; +exports.KeyListener = KeyListener; +exports.LEFT = LEFT; +exports.OperationRecord = OperationRecord; +exports.OtherInteractionPlugin = OtherInteractionPlugin; +exports.OutOfBound = OutOfBound; +exports.RIGHT = RIGHT; +exports.RelationManage = RelationManage; +exports.ScaleData = ScaleData; +exports.ShiftData = ShiftData; +exports.TransformPoints = TransformPoints; +exports.UP = UP; +exports.VectorGraphicUtil = VectorGraphicUtil; +exports.VectorText = VectorText; +exports.ViewportMovePlugin = ViewportMovePlugin; +exports.WsMsgCli = WsMsgCli; +exports.angleOfIncludedAngle = angleOfIncludedAngle; +exports.angleToAxisx = angleToAxisx; +exports.assertBezierPoints = assertBezierPoints; +exports.calculateBezierPoints = calculateBezierPoints; +exports.calculateDistanceFromPointToLine = calculateDistanceFromPointToLine; +exports.calculateFootPointFromPointToLine = calculateFootPointFromPointToLine; +exports.calculateIntersectionPointOfCircleAndLine = calculateIntersectionPointOfCircleAndLine; +exports.calculateIntersectionPointOfCircleAndPoint = calculateIntersectionPointOfCircleAndPoint; +exports.calculateLineMidpoint = calculateLineMidpoint; +exports.calculateLineSegmentingPoint = calculateLineSegmentingPoint; +exports.calculateMirrorPoint = calculateMirrorPoint; +exports.calculateMirrorPointBasedOnAxis = calculateMirrorPointBasedOnAxis; +exports.calculateOneBezierPoints = calculateOneBezierPoints; +exports.circlePoint = circlePoint; +exports.circlePoint2 = circlePoint2; +exports.convertLineToPolygonPoints = convertLineToPolygonPoints; +exports.convertRectangleToPolygonPoints = convertRectangleToPolygonPoints; +exports.convertToBezierParams = convertToBezierParams; +exports.debounce = debounce; +exports.deserializeTransformInto = deserializeTransformInto; +exports.distance = distance; +exports.distance2 = distance2; +exports.getCenterOfTwoRectangle = getCenterOfTwoRectangle; +exports.getIntersectionPoint = getIntersectionPoint; +exports.getNormalVector = getNormalVector; +exports.getParallelOfPolyline = getParallelOfPolyline; +exports.getRectangleCenter = getRectangleCenter; +exports.isLineContainOther = isLineContainOther; +exports.isParallelLines = isParallelLines; +exports.isPointOnLine = isPointOnLine; +exports.lineBox = lineBox; +exports.lineLine = lineLine; +exports.linePoint = linePoint; +exports.linePolygon = linePolygon; +exports.movePointAlongNormal = movePointAlongNormal; +exports.newDrawApp = newDrawApp; +exports.newGraphicApp = newGraphicApp; +exports.pointBox = pointBox; +exports.pointPoint = pointPoint; +exports.pointPoint2 = pointPoint2; +exports.pointPolygon = pointPolygon; +exports.polylineBox = polylineBox; +exports.polylinePoint = polylinePoint; +exports.polylinePolygon = polylinePolygon; +exports.recursiveChildren = recursiveChildren; +exports.recursiveFindChild = recursiveFindChild; +exports.recursiveFindParent = recursiveFindParent; +exports.recursiveParents = recursiveParents; +exports.serializeTransform = serializeTransform; +exports.splitLineEvenly = splitLineEvenly; +exports.splitPolyline = splitPolyline; diff --git a/package.json b/package.json index ce3867e..8f2d430 100644 --- a/package.json +++ b/package.json @@ -5,47 +5,30 @@ "productName": "Graphic-pixi", "author": "walker ", "private": true, + "type": "module", + "main": "src/jlgraphic", "scripts": { - "lint": "eslint --ext .js,.ts,.vue ./", - "format": "prettier --write \"**/*.{js,ts,vue,scss,html,md,json}\" --ignore-path .gitignore", - "test": "echo \"No test specified\" && exit 0", - "dev": "quasar dev", - "proto": "node scripts/proto.cjs", - "build": "quasar build" + "build": "rollup -c rollup.config.ts --configPlugin typescript" }, "dependencies": { - "@pixi/graphics-extras": "^7.2.4", - "@quasar/extras": "^1.0.0", + "@pixi/utils": "^7.3.2", "@stomp/stompjs": "^7.0.0", - "alova": "^2.7.1", - "axios": "^1.4.0", - "google-protobuf": "^3.21.2", - "js-base64": "^3.7.5", + "eslint": "^8.55.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.0.1", "mqtt": "^5.2.1", - "pinia": "^2.0.11", "pixi-viewport": "^5.0.1", - "pixi.js": "^7.2.4", - "quasar": "^2.6.0", - "vue": "^3.0.0", - "vue-router": "^4.0.0" + "pixi.js": "^7.3.2" }, "devDependencies": { - "@quasar/app-vite": "^1.0.0", - "@types/google-protobuf": "^3.15.6", + "@rollup/plugin-typescript": "^11.1.5", "@types/node": "^12.20.21", - "@typescript-eslint/eslint-plugin": "^5.10.0", - "@typescript-eslint/parser": "^5.10.0", - "autoprefixer": "^10.4.2", - "eslint": "^8.10.0", - "eslint-config-prettier": "^8.1.0", - "eslint-plugin-vue": "^9.0.0", - "prettier": "^2.5.1", - "protoc-gen-ts": "^0.8.6", - "ts-md5": "^1.3.1", - "typescript": "^4.5.4" + "prettier": "^3.1.1", + "rollup": "^4.8.0", + "typescript": "^5.3.3" }, "engines": { - "node": "^18 || ^16 || ^14.19", + "node": ">= 14.19", "npm": ">= 6.13.4", "yarn": ">= 1.21.1" } diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index 94b7b1c..0000000 --- a/postcss.config.js +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable */ -// https://github.com/michael-ciniawsky/postcss-load-config - -module.exports = { - plugins: [ - // https://github.com/postcss/autoprefixer - require('autoprefixer')({ - overrideBrowserslist: [ - 'last 4 Chrome versions', - 'last 4 Firefox versions', - 'last 4 Edge versions', - 'last 4 Safari versions', - 'last 4 Android versions', - 'last 4 ChromeAndroid versions', - 'last 4 FirefoxAndroid versions', - 'last 4 iOS versions' - ] - }) - - // https://github.com/elchininet/postcss-rtlcss - // If you want to support RTL css, then - // 1. yarn/npm install postcss-rtlcss - // 2. optionally set quasar.config.js > framework > lang to an RTL language - // 3. uncomment the following line: - // require('postcss-rtlcss') - ] -} diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index ae7bbdb712f8ce9fe49761b68ef3a2d4c51606f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64483 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 diff --git a/public/icons/favicon-128x128.png b/public/icons/favicon-128x128.png deleted file mode 100644 index 14011761929f4ffbef81be318a347c0032eb6f42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12324 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 h$J#u>{O`^5_ boot files are part of "main.js" - // https://v2.quasar.dev/quasar-cli-vite/boot-files - boot: ['axios', '@pixi/graphics-extras'], - - // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css - css: ['app.scss'], - - // https://github.com/quasarframework/quasar/tree/dev/extras - extras: [ - // 'ionicons-v4', - // 'mdi-v5', - // 'fontawesome-v6', - // 'eva-icons', - // 'themify', - // 'line-awesome', - // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both! - - 'roboto-font', // optional, you are not bound to it - 'material-icons', // optional, you are not bound to it - ], - - // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#build - build: { - target: { - browser: ['es2019', 'edge88', 'firefox78', 'chrome87', 'safari13.1'], - node: 'node16', - }, - - vueRouterMode: 'history', // available values: 'hash', 'history' - // vueRouterBase, - // vueDevtools, - // vueOptionsAPI: false, - - // rebuildCache: true, // rebuilds Vite/linter/etc cache on startup - - // publicPath: '/', - // analyze: true, - // env: {}, - // rawDefine: {} - // ignorePublicFolder: true, - // minify: false, - // polyfillModulePreload: true, - // distDir - - // extendViteConf (viteConf) {}, - // viteVuePluginOptions: {}, - - // vitePlugins: [ - // [ 'package-name', { ..options.. } ] - // ] - }, - - // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#devServer - devServer: { - // https: true - port: 9999, - open: false, // opens browser window automatically - }, - - // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#framework - framework: { - config: { - notify: { - position: 'top', - timeout: 2000, - progress: true, - }, - }, - - // iconSet: 'material-icons', // Quasar icon set - lang: 'zh-CN', // Quasar language pack - - // For special cases outside of where the auto-import strategy can have an impact - // (like functional components as one of the examples), - // you can manually specify Quasar components/directives to be available everywhere: - // - // components: [], - // directives: [], - - // Quasar plugins - plugins: ['Notify', 'Dialog', 'Dark', 'AppFullscreen'], - }, - - // animations: 'all', // --- includes all animations - // https://v2.quasar.dev/options/animations - animations: [], - - // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#sourcefiles - // sourceFiles: { - // rootComponent: 'src/App.vue', - // router: 'src/router/index', - // store: 'src/store/index', - // registerServiceWorker: 'src-pwa/register-service-worker', - // serviceWorker: 'src-pwa/custom-service-worker', - // pwaManifestFile: 'src-pwa/manifest.json', - // electronMain: 'src-electron/electron-main', - // electronPreload: 'src-electron/electron-preload' - // }, - - // https://v2.quasar.dev/quasar-cli-vite/developing-ssr/configuring-ssr - ssr: { - // ssrPwaHtmlFilename: 'offline.html', // do NOT use index.html as name! - // will mess up SSR - - // extendSSRWebserverConf (esbuildConf) {}, - // extendPackageJson (json) {}, - - pwa: false, - - // manualStoreHydration: true, - // manualPostHydrationTrigger: true, - - prodPort: 3000, // The default port that the production server should use - // (gets superseded if process.env.PORT is specified at runtime) - - middlewares: [ - 'render', // keep this as last one - ], - }, - - // https://v2.quasar.dev/quasar-cli-vite/developing-pwa/configuring-pwa - pwa: { - workboxMode: 'generateSW', // or 'injectManifest' - injectPwaMetaTags: true, - swFilename: 'sw.js', - manifestFilename: 'manifest.json', - useCredentialsForManifestTag: false, - // useFilenameHashes: true, - // extendGenerateSWOptions (cfg) {} - // extendInjectManifestOptions (cfg) {}, - // extendManifestJson (json) {} - // extendPWACustomSWConf (esbuildConf) {} - }, - - // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-cordova-apps/configuring-cordova - cordova: { - // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing - }, - - // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-capacitor-apps/configuring-capacitor - capacitor: { - hideSplashscreen: true, - }, - - // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-electron-apps/configuring-electron - electron: { - // extendElectronMainConf (esbuildConf) - // extendElectronPreloadConf (esbuildConf) - - inspectPort: 5858, - - bundler: 'packager', // 'packager' or 'builder' - - packager: { - // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options - // OS X / Mac App Store - // appBundleId: '', - // appCategoryType: '', - // osxSign: '', - // protocol: 'myapp://path', - // Windows only - // win32metadata: { ... } - }, - - builder: { - // https://www.electron.build/configuration/configuration - - appId: 'graphic-pixi', - }, - }, - - // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-browser-extensions/configuring-bex - bex: { - contentScripts: ['my-content-script'], - - // extendBexScriptsConf (esbuildConf) {} - // extendBexManifestJson (json) {} - }, - }; -}); diff --git a/rollup.config.ts b/rollup.config.ts new file mode 100644 index 0000000..79bb121 --- /dev/null +++ b/rollup.config.ts @@ -0,0 +1,18 @@ +import type { RollupOptions } from 'rollup' +import typescript from '@rollup/plugin-typescript' + + +const config: RollupOptions = { + input: 'src/jlgraphic/index.ts', + output: { + file: 'lib/index.js', + format: 'cjs', + }, + plugins: [ + typescript({ + + }) + ], +} + +export default config diff --git a/scripts/proto.cjs b/scripts/proto.cjs deleted file mode 100644 index 67ef276..0000000 --- a/scripts/proto.cjs +++ /dev/null @@ -1,95 +0,0 @@ -/** - * 将proto文件编译到 src/proto/ - */ -const { readdirSync } = require('fs'); -const { resolve } = require('path'); -const os = require('os'); - -const { exec } = require('child_process'); - -const protocDir = resolve( - __dirname, - '../src/examples/app/app_message/protoc-22.2' -); -const protoFileDir = resolve( - __dirname, - '../src/examples/app/app_message/protos' -); -const destDir = resolve(__dirname, '../src/examples/app/protos'); - -/** - * 递归处理所有proto文件生成 - * @param {*} file 文件 - * @param {*} path 目录 - */ -function recursiveGenerate(file, path = [], cmds = []) { - if (file.isFile()) { - // 文件,生成 - if (file.name.endsWith('.proto')) { - cmds.push(buildGenerateCmd(file.name, path)); - } else { - console.warn('不是proto文件', file.name); - } - } else if (file.isDirectory()) { - // 文件夹,递归 - readdirSync(resolve(protoFileDir, ...path, file.name), { - withFileTypes: true, - }).forEach((f) => { - const subPath = [...path, file.name]; - recursiveGenerate(f, subPath, cmds); - }); - } -} - -const isLinux = os.type().toLowerCase().includes('linux'); - -function buildGenerateCmd(name, path = []) { - const protoPath = resolve(protoFileDir, ...path); - const tsPath = resolve(destDir, ...path); - - let cmd = ['protoc', `-I=${protoPath}`, `--ts_out=${tsPath}`, `${name}`]; - let cmdStr = cmd.join(' '); - return cmdStr; -} - -function main() { - const protocBin = resolve( - protocDir, - `bin/${isLinux ? 'linux-x86_64' : 'win64'}` - ); - const prepareCmds = []; - const setPathCmd = isLinux - ? ['export', `PATH=${protocBin}:${protocDir}:"$PATH"`].join(' ') - : ['set', `PATH=${protocBin};${protocDir};%PATH%`].join(' '); - const protocVersionCmd = ['protoc', '--version'].join(' '); - prepareCmds.push(setPathCmd); - prepareCmds.push(protocVersionCmd); - - readdirSync(protoFileDir, { - withFileTypes: true, - }).forEach((f) => { - recursiveGenerate(f, [], prepareCmds); - }); - - console.log(prepareCmds); - - exec( - prepareCmds.join(' && '), - { - maxBuffer: 1024 * 2000, - }, - (err, stdout, stderr) => { - if (err) { - console.error(err); - throw err; - } else if (stderr.length > 0) { - console.error(stderr.toString()); - throw new Error(stderr.toString()); - } else { - console.log(stdout); - } - } - ); -} - -main(); diff --git a/src/App.vue b/src/App.vue deleted file mode 100644 index fe0a246..0000000 --- a/src/App.vue +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/src/app/index.ts b/src/app/index.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/assets/quasar-logo-vertical.svg b/src/assets/quasar-logo-vertical.svg deleted file mode 100644 index 8210831..0000000 --- a/src/assets/quasar-logo-vertical.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/boot/.gitkeep b/src/boot/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/boot/@pixi/graphics-extras.ts b/src/boot/@pixi/graphics-extras.ts deleted file mode 100644 index 4a70eb8..0000000 --- a/src/boot/@pixi/graphics-extras.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { boot } from 'quasar/wrappers'; -import * as GraphicsExtras from '@pixi/graphics-extras'; -// "async" is optional; -// more info on params: https://v2.quasar.dev/quasar-cli/boot-files -export default boot(async (/* { app, router, ... } */) => { - GraphicsExtras; -}); diff --git a/src/boot/axios.ts b/src/boot/axios.ts deleted file mode 100644 index d9a9d34..0000000 --- a/src/boot/axios.ts +++ /dev/null @@ -1,111 +0,0 @@ -import axios, { AxiosInstance } from 'axios'; -import { AxiosError } from 'axios'; -import { Dialog } from 'quasar'; -import { boot } from 'quasar/wrappers'; -import { getJwtToken } from 'src/examples/app/configs/TokenManage'; -import { getHttpBase } from 'src/examples/app/configs/UrlManage'; - -declare module '@vue/runtime-core' { - interface ComponentCustomProperties { - $axios: AxiosInstance; - } -} - -interface ErrorData { - status: number; - title: string; - detail: string; - code: number; -} - -export class ApiError { - origin: AxiosError; - /** - * 业务错误代码 - */ - code: number; - /** - * 错误信息 - */ - title: string; - /** - * 相关问题描述 - */ - detail?: string; - constructor(origin: AxiosError) { - this.origin = origin; - const response = origin.response; - if (response) { - const err = response.data as ErrorData; - this.code = err.code; - this.title = err.title; - this.detail = err.detail; - } else { - this.code = origin.status || -1; - this.title = origin.message; - } - } - - static from(err: AxiosError): ApiError { - return new ApiError(err); - } - - /** - * 是否认证失败(登录过期) - * @returns - */ - isAuthError(): boolean { - return this.origin.response?.status === 401; - } -} - -// Be careful when using SSR for cross-request state pollution -// due to creating a Singleton instance here; -// If any client changes this (global) instance, it might be a -// good idea to move this instance creation inside of the -// "export default () => {}" function below (which runs individually -// for each client) -const api = axios.create({ baseURL: getHttpBase() }); - -export default boot(({ app, router }) => { - // for use inside Vue files (Options API) through this.$axios and this.$api - - // 拦截请求,添加 - api.interceptors.request.use( - (config) => { - config.headers.Authorization = getJwtToken(); - return config; - }, - (err: AxiosError) => { - return Promise.reject(ApiError.from(err)); - } - ); - - api.interceptors.response.use( - (response) => { - return response; - }, - (err) => { - if (err.response && err.response.status === 401) { - Dialog.create({ - title: '认证失败', - message: '认证失败或登录超时,请重新登录', - persistent: true, - }).onOk(() => { - router.push({ name: 'login' }); - }); - } - return Promise.reject(ApiError.from(err)); - } - ); - - app.config.globalProperties.$axios = axios; - // ^ ^ ^ this will allow you to use this.$axios (for Vue Options API form) - // so you won't necessarily have to import axios in each vue file - - app.config.globalProperties.$api = api; - // ^ ^ ^ this will allow you to use this.$api (for Vue Options API form) - // so you can easily perform requests against your app's API -}); - -export { api }; diff --git a/src/components/EssentialLink.vue b/src/components/EssentialLink.vue deleted file mode 100644 index 13205c2..0000000 --- a/src/components/EssentialLink.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - diff --git a/src/components/ExampleComponent.vue b/src/components/ExampleComponent.vue deleted file mode 100644 index bc03c3d..0000000 --- a/src/components/ExampleComponent.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/src/components/draw-app/DrawProperties.vue b/src/components/draw-app/DrawProperties.vue deleted file mode 100644 index 6cf6434..0000000 --- a/src/components/draw-app/DrawProperties.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - diff --git a/src/components/draw-app/properties/CanvasProperty.vue b/src/components/draw-app/properties/CanvasProperty.vue deleted file mode 100644 index 74ac95b..0000000 --- a/src/components/draw-app/properties/CanvasProperty.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - diff --git a/src/components/draw-app/properties/IscsFanProperty.vue b/src/components/draw-app/properties/IscsFanProperty.vue deleted file mode 100644 index c743f61..0000000 --- a/src/components/draw-app/properties/IscsFanProperty.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - diff --git a/src/components/draw-app/properties/LinkProperty.vue b/src/components/draw-app/properties/LinkProperty.vue deleted file mode 100644 index 0aa8412..0000000 --- a/src/components/draw-app/properties/LinkProperty.vue +++ /dev/null @@ -1,103 +0,0 @@ - - - diff --git a/src/components/draw-app/properties/PlatformProperty.vue b/src/components/draw-app/properties/PlatformProperty.vue deleted file mode 100644 index 147eeeb..0000000 --- a/src/components/draw-app/properties/PlatformProperty.vue +++ /dev/null @@ -1,112 +0,0 @@ - - - diff --git a/src/components/draw-app/properties/RectProperty.vue b/src/components/draw-app/properties/RectProperty.vue deleted file mode 100644 index 981baba..0000000 --- a/src/components/draw-app/properties/RectProperty.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - diff --git a/src/components/draw-app/properties/SignalProperty.vue b/src/components/draw-app/properties/SignalProperty.vue deleted file mode 100644 index 0046733..0000000 --- a/src/components/draw-app/properties/SignalProperty.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - diff --git a/src/components/draw-app/properties/StationProperty.vue b/src/components/draw-app/properties/StationProperty.vue deleted file mode 100644 index 3699cf0..0000000 --- a/src/components/draw-app/properties/StationProperty.vue +++ /dev/null @@ -1,200 +0,0 @@ - - - diff --git a/src/components/draw-app/properties/TrainProperty.vue b/src/components/draw-app/properties/TrainProperty.vue deleted file mode 100644 index 9e6360c..0000000 --- a/src/components/draw-app/properties/TrainProperty.vue +++ /dev/null @@ -1,198 +0,0 @@ - - - diff --git a/src/components/draw-app/templates/LinkTemplate.vue b/src/components/draw-app/templates/LinkTemplate.vue deleted file mode 100644 index a6b82a1..0000000 --- a/src/components/draw-app/templates/LinkTemplate.vue +++ /dev/null @@ -1,96 +0,0 @@ - - - diff --git a/src/components/draw-app/templates/PlatformTemplate.vue b/src/components/draw-app/templates/PlatformTemplate.vue deleted file mode 100644 index 75c2ee2..0000000 --- a/src/components/draw-app/templates/PlatformTemplate.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - diff --git a/src/components/draw-app/templates/RectTemplate.vue b/src/components/draw-app/templates/RectTemplate.vue deleted file mode 100644 index 75c2ee2..0000000 --- a/src/components/draw-app/templates/RectTemplate.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - diff --git a/src/components/draw-app/templates/StationTemplate.vue b/src/components/draw-app/templates/StationTemplate.vue deleted file mode 100644 index fe433bf..0000000 --- a/src/components/draw-app/templates/StationTemplate.vue +++ /dev/null @@ -1,70 +0,0 @@ - - - diff --git a/src/components/draw-app/templates/TrainTemplate.vue b/src/components/draw-app/templates/TrainTemplate.vue deleted file mode 100644 index 84c3cd2..0000000 --- a/src/components/draw-app/templates/TrainTemplate.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - diff --git a/src/components/models.ts b/src/components/models.ts deleted file mode 100644 index 6945920..0000000 --- a/src/components/models.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface Todo { - id: number; - content: string; -} - -export interface Meta { - totalCount: number; -} diff --git a/src/css/app.scss b/src/css/app.scss deleted file mode 100644 index ecac98f..0000000 --- a/src/css/app.scss +++ /dev/null @@ -1 +0,0 @@ -// app global css in SCSS form diff --git a/src/css/quasar.variables.scss b/src/css/quasar.variables.scss deleted file mode 100644 index 3996ce1..0000000 --- a/src/css/quasar.variables.scss +++ /dev/null @@ -1,25 +0,0 @@ -// Quasar SCSS (& Sass) Variables -// -------------------------------------------------- -// To customize the look and feel of this app, you can override -// the Sass/SCSS variables found in Quasar's source Sass/SCSS files. - -// Check documentation for full list of Quasar variables - -// Your own variables (that are declared here) and Quasar's own -// ones will be available out of the box in your .vue/.scss/.sass files - -// It's highly recommended to change the default colors -// to match your app's branding. -// Tip: Use the "Theme Builder" on Quasar's documentation website. - -$primary : #1976D2; -$secondary : #26A69A; -$accent : #9C27B0; - -$dark : #1D1D1D; -$dark-page : #121212; - -$positive : #21BA45; -$negative : #C10015; -$info : #31CCEC; -$warning : #F2C037; diff --git a/src/env.d.ts b/src/env.d.ts deleted file mode 100644 index dd757b1..0000000 --- a/src/env.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* eslint-disable */ - -declare namespace NodeJS { - interface ProcessEnv { - NODE_ENV: string; - VUE_ROUTER_MODE: 'hash' | 'history' | 'abstract' | undefined; - VUE_ROUTER_BASE: string | undefined; - } -} diff --git a/src/examples/app/api/ApiCommon.ts b/src/examples/app/api/ApiCommon.ts deleted file mode 100644 index 18494ce..0000000 --- a/src/examples/app/api/ApiCommon.ts +++ /dev/null @@ -1,42 +0,0 @@ -export class PageQueryDto { - current: number; - size: number; - orders?: OrderItemDto[]; - constructor(current: number, size: number, orders?: OrderItemDto[]) { - this.current = current; - this.size = size; - this.orders = orders; - } -} - -export class OrderItemDto { - column: string; - asc: boolean; - constructor(column: string, asc: boolean) { - this.column = column; - this.asc = asc; - } - - static asc(column: string): OrderItemDto { - return new OrderItemDto(column, true); - } - static desc(column: string): OrderItemDto { - return new OrderItemDto(column, false); - } -} - -export interface PageDto { - records: T[]; - /** - * 记录总数 - */ - total: number; - /** - * 第几页 - */ - current: number; - /** - * 每页数量 - */ - size: number; -} diff --git a/src/examples/app/api/UserApi.ts b/src/examples/app/api/UserApi.ts deleted file mode 100644 index 085fe3f..0000000 --- a/src/examples/app/api/UserApi.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { api } from 'src/boot/axios'; -import { PageDto, PageQueryDto } from './ApiCommon'; -import { Md5 } from 'ts-md5'; - -const UserUriBase = '/api/user'; - -interface RegisterInfo { - name: string; - mobile: string; - password: string; -} - -interface User { - id: string; - name: string; - mobile: string; - password: string; - registerTime: string; -} - -const PasswordSult = '4a6d74126bfd06d69406fcccb7e7d5d9'; // 密码加盐 -function encryptPassword(password: string): string { - const md5 = new Md5(); - return md5.appendStr(`${password}${PasswordSult}`).end() as string; -} - -/** - * 用户注册 - * @param info - * @returns - */ -export async function register(info: RegisterInfo): Promise { - const response = await api.post(`${UserUriBase}/register`, { - ...info, - password: encryptPassword(info.password), - }); - return response.data as User; -} - -interface LoginInfo { - account: string; - password: string; -} - -/** - * 用户登录 - * @param loginInfo - * @returns - */ -export async function login(loginInfo: LoginInfo): Promise { - const info = { ...loginInfo, password: encryptPassword(loginInfo.password) }; - const response = await api.post(`${UserUriBase}/login`, info); - return response.data; -} - -export class PagingQueryParams extends PageQueryDto { - name?: string; - roleId?: number; -} - -/** - * 分页查询用户信息 - * @param params - * @returns - */ -export async function pageQuery( - params: PagingQueryParams -): Promise> { - const response = await api.get(`${UserUriBase}/paging`, { - params: params, - }); - return response.data; -} - -export function distributeRole(query: { userId: number; roleIds: number[] }) { - return api.post('/api/role/distribute', query); -} diff --git a/src/examples/app/app_message/protoc-22.2/bin/linux-x86_64/protoc b/src/examples/app/app_message/protoc-22.2/bin/linux-x86_64/protoc deleted file mode 100755 index c74fab11a93dde9e3603e7b9540b0d46e1be45ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7868336 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ⅈ__u1s5atV88Z=yn6u(=M^RT@mQ8MX^wXhkz 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 z zcIE}WzOonVQ{^LGzK*(xM0puV5Ebv4oNtIKP@9=&3p2GlgB^Ji(*x7PuN|4ABiZj0 zk>^U}GBsMH0w1b1_OsFVF0m(cE zP?nvcqD~6Pm7@bFj1CoTpD)>7?gq*#GgS130`_wQi3@_3C?Ffwku7ln{DlGzaRa3j zgo^G`z+rA6ahpm!s5VAsRa(DB2#B;;e^vYbD#`WkB+LPYovDBoZXj_T)3`Bjxv1F6 zb-_C4H_)>Gf*2Rd@p?rdQYDKh2P_(johYCE8YmYc#+6IhiL!zy2RsaSuM_1rM7b?B zm+?-N=|s696~&dyb?xSIyUxV|H>^vDQqCCc|2%|-udGToU3{{u5M8eo6;#4{8Q32nw1oa2b`UK8W z@t&k{{Jvt&%-TF=D_D{#64oxEjs+to2MXK~JT^y{{fZnNn{9K{U+&`Qkq}Da($x+} zIn9%!^ZAWtp0!uqcv#0E>*3(2mmC#*s0T!_YDSTx@PPzDWFurgj$`nb*Q70ubRrXv zu4rlaN6y^Y2!gF%#%dR(T>PfqT7WN8n1tb9AfoivY8^jc$MfQ$g^Wu$f3;Z;{7tcS zk;Wmlk`8P=r$5;WKS<%+0v*5Ay6A7BwLbE;Lu+Mnf8BokrPkW(DlfjDasDFPt&i7Y z`apm)hV?E3m`j8d%p8eFE&fXOVFs1*Wdi!;-#7tjHStMF2Uc;qNhEqq5~X@YJteU< zsuwxYf2+%o-XUf5mNGcW_0a{mt%7rP0j8_iUm(_B{n{Mz+o+K?)9t$)x;O{yO$+S- z>u{(#MRzv;Radz>+s!NlqYMuhP(OAJUtvEwn<^x;dYu}+GO9TsP@EXh!6zBgjus=1 z)%|8Yg4vtJV@lA_1JyT0wPx4+A1so}*s(xPMWQ1;nKPDgjz!W5e^H%nQUYhG-1o^b z{JJkyy9Pg*skQ1k>29ZOaCA5HBXqZN{AG7rG1M#FM7md1lj>elxU=cI3pG&S_?4!= z>@T){oSmwsO#{X z>Hz@MNE0ot{X@#w_=o8qVgc7-L~cigTEe@Op#RPhrRFY_oSffclUNr@Mi~ zO=g${`Wk)SwAizIojO?}x>;TA{TG#0JBkd-nXiDu-Q`?~Ab?X8uzh{zS_N!JpFzq( z1svnfmbd_(q=4hxK;kCr#v$71!wVgAIL(HNtowx@H@MSWqcZ%b0^aNf5*I1|s({qy z9c(79OOqI>FSrsFf-gR;>x@{boE#)Z)UOlgS}*Curu7&3rB{~=)Oex2l`2>Q7wM`ej-5p!B+RETaX(xP8NjZT!9G>i>E5vtNb(uwMqTPvt>bJd2V zXvE$r1)UBF$Z00xxiBrpqS?P5g4YmBLfO);Gm*zX(s^A|GH!dlqpd$e0M`eQR%Brf zA$iBKKsFHVS1RY?ocw>t4MELpqJrV5(Iq<1R>mCbtQK)nlgi9i@q4?LV>AsiLN;>| z0V6whIHzNqWu2@k>?XFbJ5lptWf3+f3T