diff --git a/package.json b/package.json index 1cfbe33..35820f8 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,7 @@ "format": "prettier --write src/" }, "dependencies": { - "@types/fabric": "^5.3.10", - "@vueuse/core": "^13.2.0", - "fabric": "^6.7.0" + "@vueuse/core": "^13.2.0" }, "devDependencies": { "@ease-forge/runtime": "^1.0.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e256c6..afc4ecc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,15 +8,9 @@ importers: .: dependencies: - '@types/fabric': - specifier: ^5.3.10 - version: 5.3.10 '@vueuse/core': specifier: ^13.2.0 version: 13.2.0(vue@3.5.14(typescript@5.8.3)) - fabric: - specifier: ^6.7.0 - version: 6.7.0 devDependencies: '@ease-forge/runtime': specifier: ^1.0.12 @@ -527,10 +521,6 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -656,10 +646,6 @@ packages: '@sxzz/popperjs-es@2.11.7': resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - '@tsconfig/node22@22.0.2': resolution: {integrity: sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==} @@ -669,9 +655,6 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/fabric@5.3.10': - resolution: {integrity: sha512-fsJIuVkU+B2AnmQh+Ml2X0ax3NmRIqLvEXmZ+squX60HaF89TvdIP6tI6Uk5srXaauswTwPOOfWE7k2QboUZCg==} - '@types/jquery@3.5.32': resolution: {integrity: sha512-b9Xbf4CkMqS02YH8zACqN1xzdxc3cO735Qe5AbSUFmyOiaWAbcpqh9Wna+Uk0vgACvoQHpWDg2rGdHkYPLmCiQ==} @@ -869,25 +852,6 @@ packages: '@webgpu/types@0.1.60': resolution: {integrity: sha512-8B/tdfRFKdrnejqmvq95ogp8tf52oZ51p3f4QD5m5Paey/qlX4Rhhy5Y8tgFMi7Ms70HzcMMw3EQjH/jdhTwlA==} - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - - acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} - - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} - engines: {node: '>=0.4.0'} - hasBin: true - ag-grid-community@28.2.1: resolution: {integrity: sha512-DMZh/xD/FqYP17qJ1M92PolTYe+hrKuEaf+A4h13O6qn2x/xZQrTRGW5DgnQLR/uLMe1XXZQPKR3UKgAlKo69A==} @@ -897,10 +861,6 @@ packages: ag-grid-vue3@28.2.1: resolution: {integrity: sha512-n7+l51zFCZm3SVT2pI0lVVwL8gsDPebqNLfEy4DS17OlV5IL7c1eNXRosv/QMu+YHOEMVcwFRWH380nIjVF/+w==} - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - alien-signals@1.0.13: resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} @@ -920,14 +880,6 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - async-validator@4.2.5: resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} @@ -946,9 +898,6 @@ packages: birpc@2.3.0: resolution: {integrity: sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -977,14 +926,6 @@ packages: caniuse-lite@1.0.30001718: resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} - canvas@2.11.2: - resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} - engines: {node: '>=6'} - - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - codemirror@5.65.19: resolution: {integrity: sha512-+aFkvqhaAVr1gferNMuN8vkTSrWIFvzlMV9I2KBLCWS2WpZ2+UAkZjlMZmEuT+gcXTi6RrGQCkWq1/bDtGqhIA==} @@ -995,20 +936,10 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - console-control-strings@1.1.0: - resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1023,26 +954,12 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - - cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - - cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} dat.gui@0.7.9: resolution: {integrity: sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==} - data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} - dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} @@ -1061,10 +978,6 @@ packages: decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} - decompress-response@4.2.1: - resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} - engines: {node: '>=8'} - default-browser-id@5.0.0: resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} engines: {node: '>=18'} @@ -1081,17 +994,6 @@ packages: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} engines: {node: '>=0.4.0'} - delegates@1.0.0: - resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} - - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} - engines: {node: '>=8'} - - domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1117,10 +1019,6 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@6.0.0: - resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} - engines: {node: '>=0.12'} - errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -1156,35 +1054,13 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - execa@9.5.3: resolution: {integrity: sha512-QFNnTvU3UjgWFy8Ef9iDHvIdcgZ344ebkwYx4/KLbR+CKQA4xBaHzv+iRpp86QfMHP8faFQLh8iOc57215y4Rg==} engines: {node: ^18.19.0 || >=20.5.0} - fabric@6.7.0: - resolution: {integrity: sha512-+yKumsh1MvJ44Um2eOhb4Q6CyZ6e2XKBV3IfQvzuGKhl2UkRFQtIKPUi6f06m3gd0r5zspgMUl5iwxtT1dmFAQ==} - engines: {node: '>=16.20.0'} - fdir@6.4.4: resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} peerDependencies: @@ -1221,13 +1097,6 @@ packages: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1236,11 +1105,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -1262,10 +1126,6 @@ packages: engines: {node: 20 || >=22} hasBin: true - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -1285,9 +1145,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1302,18 +1159,6 @@ packages: hotkeys-js@3.13.10: resolution: {integrity: sha512-O3ktQfRV5eMDCIxj60enw5FBLQfTiRnX6evXn3UFeWylIcHAXwRkRTeiGX8dg3MKaM7y3SNj6PmcCxrwuoIBtA==} - html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - human-signals@8.0.1: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} @@ -1330,13 +1175,6 @@ packages: immediate@3.0.6: resolution: {integrity: sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1355,9 +1193,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} @@ -1394,15 +1229,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} - engines: {node: '>=14'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -1461,10 +1287,6 @@ packages: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -1492,45 +1314,21 @@ packages: engines: {node: '>=4'} hasBin: true - mimic-response@2.1.0: - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} - engines: {node: '>=8'} - minimatch@10.0.1: resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} engines: {node: 20 || >=22} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -1541,9 +1339,6 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - nan@2.22.2: - resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1559,23 +1354,9 @@ packages: engines: {node: '>= 4.4.x'} hasBin: true - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - normalize-wheel-es@1.2.0: resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} @@ -1592,26 +1373,13 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - numeral@2.0.6: resolution: {integrity: sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==} - nwsapi@2.2.20: - resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - open@10.1.2: resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} engines: {node: '>=18'} @@ -1627,16 +1395,9 @@ packages: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -1699,42 +1460,21 @@ packages: prr@1.0.1: resolution: {integrity: sha1-0/wRS6BplaRexok/SEzrHXj19HY=} - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - read-package-json-fast@4.0.0: resolution: {integrity: sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==} engines: {node: ^18.17.0 || >=20.5.0} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - rimraf@6.0.1: resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} engines: {node: 20 || >=22} @@ -1749,19 +1489,12 @@ packages: resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} engines: {node: '>=18'} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -1770,14 +1503,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1806,19 +1531,10 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@3.1.1: - resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - sirv@3.0.1: resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} engines: {node: '>=18'} @@ -1849,9 +1565,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1868,13 +1581,6 @@ packages: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - three-mesh-bvh@0.9.0: resolution: {integrity: sha512-xAwZj0hZknpwVsdK5BBJTIAZDjDPZCRzURY1o+z/JHBON/jc2UetK1CzPeQZiiOVSfI4jV2z7sXnnGtgsgnjaA==} peerDependencies: @@ -1891,17 +1597,6 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} - troika-three-text@0.52.4: resolution: {integrity: sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==} peerDependencies: @@ -1930,10 +1625,6 @@ packages: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -1944,12 +1635,6 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - vite-hot-client@2.0.4: resolution: {integrity: sha512-W9LOGAyGMrbGArYJN4LBCdOC5+Zwh7dHvOHC0KmGKkJhsOzaKbpo/jEjpPKVHIW0/jBWj8RZG0NUxfgA8BxgAg==} peerDependencies: @@ -2066,35 +1751,9 @@ packages: typescript: optional: true - w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} - webgl-sdf-generator@1.1.1: resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - - whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2105,9 +1764,6 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2116,34 +1772,9 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yoctocolors@2.1.1: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} @@ -2514,22 +2145,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mapbox/node-pre-gyp@1.0.11': - dependencies: - detect-libc: 2.0.4 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.7.2 - tar: 6.2.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - '@polka/url@1.0.0-next.29': {} '@rolldown/pluginutils@1.0.0-beta.8-commit.56abf23': {} @@ -2608,17 +2223,12 @@ snapshots: '@sxzz/popperjs-es@2.11.7': {} - '@tootallnate/once@2.0.0': - optional: true - '@tsconfig/node22@22.0.2': {} '@tweenjs/tween.js@23.1.3': {} '@types/estree@1.0.7': {} - '@types/fabric@5.3.10': {} - '@types/jquery@3.5.32': dependencies: '@types/sizzle': 2.3.9 @@ -2911,26 +2521,6 @@ snapshots: '@webgpu/types@0.1.60': {} - abab@2.0.6: - optional: true - - abbrev@1.1.1: - optional: true - - acorn-globals@7.0.1: - dependencies: - acorn: 8.14.1 - acorn-walk: 8.3.4 - optional: true - - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.1 - optional: true - - acorn@8.14.1: - optional: true - ag-grid-community@28.2.1: {} ag-grid-enterprise@28.2.1: {} @@ -2942,13 +2532,6 @@ snapshots: transitivePeerDependencies: - typescript - agent-base@6.0.2: - dependencies: - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - alien-signals@1.0.13: {} ansi-regex@5.0.1: {} @@ -2961,15 +2544,6 @@ snapshots: ansi-styles@6.2.1: {} - aproba@2.0.0: - optional: true - - are-we-there-yet@2.0.0: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - optional: true - async-validator@4.2.5: {} asynckit@0.4.0: {} @@ -2990,12 +2564,6 @@ snapshots: birpc@2.3.0: {} - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - optional: true - brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -3027,19 +2595,6 @@ snapshots: caniuse-lite@1.0.30001718: {} - canvas@2.11.2: - dependencies: - '@mapbox/node-pre-gyp': 1.0.11 - nan: 2.22.2 - simple-get: 3.1.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - chownr@2.0.0: - optional: true - codemirror@5.65.19: {} color-convert@2.0.1: @@ -3048,19 +2603,10 @@ snapshots: color-name@1.1.4: {} - color-support@1.1.3: - optional: true - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - concat-map@0.0.1: - optional: true - - console-control-strings@1.1.0: - optional: true - convert-source-map@2.0.0: {} copy-anything@2.0.6: @@ -3077,28 +2623,10 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cssom@0.3.8: - optional: true - - cssom@0.5.0: - optional: true - - cssstyle@2.3.0: - dependencies: - cssom: 0.3.8 - optional: true - csstype@3.1.3: {} dat.gui@0.7.9: {} - data-urls@3.0.2: - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - optional: true - dayjs@1.11.13: {} de-indent@1.0.2: {} @@ -3109,11 +2637,6 @@ snapshots: decimal.js@10.5.0: {} - decompress-response@4.2.1: - dependencies: - mimic-response: 2.1.0 - optional: true - default-browser-id@5.0.0: {} default-browser@5.2.1: @@ -3125,17 +2648,6 @@ snapshots: delayed-stream@1.0.0: {} - delegates@1.0.0: - optional: true - - detect-libc@2.0.4: - optional: true - - domexception@4.0.0: - dependencies: - webidl-conversions: 7.0.0 - optional: true - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -3173,9 +2685,6 @@ snapshots: entities@4.5.0: {} - entities@6.0.0: - optional: true - errno@0.1.8: dependencies: prr: 1.0.1 @@ -3230,26 +2739,8 @@ snapshots: escape-html@1.0.3: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - optional: true - - esprima@4.0.1: - optional: true - - estraverse@5.3.0: - optional: true - estree-walker@2.0.2: {} - esutils@2.0.3: - optional: true - execa@9.5.3: dependencies: '@sindresorhus/merge-streams': 4.0.0 @@ -3265,16 +2756,6 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.1 - fabric@6.7.0: - optionalDependencies: - canvas: 2.11.2 - jsdom: 20.0.3(canvas@2.11.2) - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -3305,32 +2786,11 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - optional: true - - fs.realpath@1.0.0: - optional: true - fsevents@2.3.3: optional: true function-bind@1.1.2: {} - gauge@3.0.2: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - optional: true - gensync@1.0.0-beta.2: {} get-intrinsic@1.3.0: @@ -3365,16 +2825,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - optional: true - globals@11.12.0: {} gopd@1.2.0: {} @@ -3387,9 +2837,6 @@ snapshots: dependencies: has-symbols: 1.1.0 - has-unicode@2.0.1: - optional: true - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -3400,28 +2847,6 @@ snapshots: hotkeys-js@3.13.10: {} - html-encoding-sniffer@3.0.0: - dependencies: - whatwg-encoding: 2.0.0 - optional: true - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - human-signals@8.0.1: {} iconv-lite@0.6.3: @@ -3434,15 +2859,6 @@ snapshots: immediate@3.0.6: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - optional: true - - inherits@2.0.4: - optional: true - is-docker@3.0.0: {} is-fullwidth-code-point@3.0.0: {} @@ -3453,9 +2869,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-potential-custom-element-name@1.0.1: - optional: true - is-stream@4.0.1: {} is-unicode-supported@2.1.0: {} @@ -3480,42 +2893,6 @@ snapshots: js-tokens@4.0.0: {} - jsdom@20.0.3(canvas@2.11.2): - dependencies: - abab: 2.0.6 - acorn: 8.14.1 - acorn-globals: 7.0.1 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.5.0 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.2 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.20 - parse5: 7.3.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - ws: 8.18.2 - xml-name-validator: 4.0.0 - optionalDependencies: - canvas: 2.11.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - jsesc@3.1.0: {} json-parse-even-better-errors@4.0.0: {} @@ -3578,11 +2955,6 @@ snapshots: semver: 5.7.2 optional: true - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - optional: true - math-intrinsics@1.1.0: {} memoize-one@6.0.0: {} @@ -3600,52 +2972,24 @@ snapshots: mime@1.6.0: optional: true - mimic-response@2.1.0: - optional: true - minimatch@10.0.1: dependencies: brace-expansion: 2.0.1 - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - optional: true - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - optional: true - - minipass@5.0.0: - optional: true - minipass@7.1.2: {} - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - optional: true - mitt@3.0.1: {} - mkdirp@1.0.4: - optional: true - mrmime@2.0.1: {} ms@2.1.3: {} muggle-string@0.4.1: {} - nan@2.22.2: - optional: true - nanoid@3.3.11: {} nanoid@5.1.5: {} @@ -3656,18 +3000,8 @@ snapshots: sax: 1.4.1 optional: true - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - optional: true - node-releases@2.0.19: {} - nopt@5.0.0: - dependencies: - abbrev: 1.1.1 - optional: true - normalize-wheel-es@1.2.0: {} npm-normalize-package-bin@4.0.0: {} @@ -3688,29 +3022,10 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 - npmlog@5.0.1: - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - optional: true - numeral@2.0.6: {} - nwsapi@2.2.20: - optional: true - - object-assign@4.1.1: - optional: true - object-inspect@1.13.4: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - optional: true - open@10.1.2: dependencies: default-browser: 5.2.1 @@ -3724,16 +3039,8 @@ snapshots: parse-node-version@1.0.1: {} - parse5@7.3.0: - dependencies: - entities: 6.0.0 - optional: true - path-browserify@1.0.1: {} - path-is-absolute@1.0.1: - optional: true - path-key@3.1.1: {} path-key@4.0.0: {} @@ -3780,45 +3087,19 @@ snapshots: prr@1.0.1: optional: true - psl@1.15.0: - dependencies: - punycode: 2.3.1 - optional: true - - punycode@2.3.1: - optional: true - qs@6.14.0: dependencies: side-channel: 1.1.0 - querystringify@2.2.0: - optional: true - read-package-json-fast@4.0.0: dependencies: json-parse-even-better-errors: 4.0.0 npm-normalize-package-bin: 4.0.0 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - optional: true - require-from-string@2.0.2: {} - requires-port@1.0.0: - optional: true - rfdc@1.4.1: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - optional: true - rimraf@6.0.1: dependencies: glob: 11.0.2 @@ -3852,31 +3133,17 @@ snapshots: run-applescript@7.0.0: {} - safe-buffer@5.2.1: - optional: true - safer-buffer@2.1.2: optional: true sax@1.4.1: optional: true - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - optional: true - semver@5.7.2: optional: true semver@6.3.1: {} - semver@7.7.2: - optional: true - - set-blocking@2.0.0: - optional: true - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -3913,21 +3180,8 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - signal-exit@3.0.7: - optional: true - signal-exit@4.1.0: {} - simple-concat@1.0.1: - optional: true - - simple-get@3.1.1: - dependencies: - decompress-response: 4.2.1 - once: 1.4.0 - simple-concat: 1.0.1 - optional: true - sirv@3.0.1: dependencies: '@polka/url': 1.0.0-next.29 @@ -3956,11 +3210,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - optional: true - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -3975,19 +3224,6 @@ snapshots: dependencies: copy-anything: 3.0.5 - symbol-tree@3.2.4: - optional: true - - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - optional: true - three-mesh-bvh@0.9.0(three@0.176.0): dependencies: three: 0.176.0 @@ -4001,22 +3237,6 @@ snapshots: totalist@3.0.1: {} - tough-cookie@4.1.4: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - optional: true - - tr46@0.0.3: - optional: true - - tr46@3.0.0: - dependencies: - punycode: 2.3.1 - optional: true - troika-three-text@0.52.4(three@0.176.0): dependencies: bidi-js: 1.0.3 @@ -4039,9 +3259,6 @@ snapshots: unicorn-magic@0.3.0: {} - universalify@0.2.0: - optional: true - universalify@2.0.1: {} update-browserslist-db@1.1.3(browserslist@4.24.5): @@ -4050,15 +3267,6 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - optional: true - - util-deprecate@1.0.2: - optional: true - vite-hot-client@2.0.4(vite@6.3.5(@types/node@22.15.21)(less@4.3.0)): dependencies: vite: 6.3.5(@types/node@22.15.21)(less@4.3.0) @@ -4170,39 +3378,8 @@ snapshots: optionalDependencies: typescript: 5.8.3 - w3c-xmlserializer@4.0.0: - dependencies: - xml-name-validator: 4.0.0 - optional: true - webgl-sdf-generator@1.1.1: {} - webidl-conversions@3.0.1: - optional: true - - webidl-conversions@7.0.0: - optional: true - - whatwg-encoding@2.0.0: - dependencies: - iconv-lite: 0.6.3 - optional: true - - whatwg-mimetype@3.0.0: - optional: true - - whatwg-url@11.0.0: - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 - optional: true - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - optional: true - which@2.0.2: dependencies: isexe: 2.0.0 @@ -4211,11 +3388,6 @@ snapshots: dependencies: isexe: 3.1.1 - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - optional: true - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -4228,21 +3400,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 - wrappy@1.0.2: - optional: true - - ws@8.18.2: - optional: true - - xml-name-validator@4.0.0: - optional: true - - xmlchars@2.2.0: - optional: true - yallist@3.1.1: {} - yallist@4.0.0: - optional: true - yoctocolors@2.1.1: {} diff --git a/src/core/ModelUtils.ts b/src/core/ModelUtils.ts index 29f1f8f..c175616 100644 --- a/src/core/ModelUtils.ts +++ b/src/core/ModelUtils.ts @@ -5,6 +5,39 @@ import type Viewport from '@/core/engine/Viewport' import { Vector2 } from 'three/src/math/Vector2' import EventBus from '@/runtime/EventBus.ts' import Decimal from 'decimal.js' +import type { Object3DLike } from '@/types/ModelTypes.ts' + +export function setUserDataForItem(item: ItemJson, object: Object3DLike) { + if (!object.name && item.name) { + object.name = item.name + } + object.userData = { + ...object.userData, + t: item.t, + createType: 'point', + entityId: item.id, + draggable: item.dt.protected !== true, + selectable: item.dt.selectable !== false + } +} + +export function setUserDataForLine(start: ItemJson, end: ItemJson, type: LinkType, object: Object3DLike) { + const id = getLineId(start.id, end.id, type) + + if (!object.name) { + object.name = id + } + object.userData = { + ...object.userData, + createType: 'line', + entityId: id, + startId: start.id, + endId: end.id, + draggable: false, + selectable: false, + t: start.t + } +} /** * 确保所有实体之间的关系满足一致性: diff --git a/src/core/base/BaseRenderer.ts b/src/core/base/BaseRenderer.ts index 9f43815..731a02e 100644 --- a/src/core/base/BaseRenderer.ts +++ b/src/core/base/BaseRenderer.ts @@ -1,10 +1,11 @@ import type Viewport from '@/core/engine/Viewport' import * as THREE from 'three' -import { getLineId } from '@/core/ModelUtils.ts' +import { getLineId, setUserDataForItem, setUserDataForLine } from '@/core/ModelUtils.ts' import { Line2 } from 'three/examples/jsm/lines/Line2' -import InstancePointManager from '@/core/manager/InstancePointManager.ts' +import InstancePointManager, { PointManageWrap } from '@/core/manager/InstancePointManager.ts' import Constract from '@/core/Constract.ts' import type LineSegmentManager from '@/core/manager/LineSegmentManager.ts' +import type { Object3DLike } from '@/types/ModelTypes.ts' /** * 基本渲染器基类 @@ -92,12 +93,16 @@ export default abstract class BaseRenderer { /** * 创建一个最基本的点对象, 不用管 item 的 name / id / 位置 / 转换 / 大小 和 userData, 除非有明确定义 */ - abstract createPointBasic(item: ItemJson, option?: RendererCudOption): THREE.Object3D + createPointBasic(item: ItemJson, option?: RendererCudOption): Object3DLike { + throw new Error('createPointBasic method must be implemented in derived class.') + } /** * 创建测量线 */ - abstract createLineBasic(start: ItemJson, end: ItemJson, type: LinkType): THREE.Object3D + createLineBasic(start: ItemJson, end: ItemJson, type: LinkType): Object3DLike { + throw new Error('createLineBasic method must be implemented in derived class.') + } abstract get defaultScale(): THREE.Vector3 @@ -108,63 +113,32 @@ export default abstract class BaseRenderer { /** * 创建或更新线之后的回调 */ - afterCreateOrUpdateLine(start: ItemJson, end: ItemJson, type: LinkType, option: RendererCudOption, object: THREE.Object3D) { + afterCreateOrUpdateLine(start: ItemJson, end: ItemJson, type: LinkType, option: RendererCudOption, object: Object3DLike) { } /** * 创建或更新点之后的回调 */ - afterCreateOrUpdatePoint(item: ItemJson, option: RendererCudOption, object: THREE.Object3D) { + afterCreateOrUpdatePoint(item: ItemJson, option: RendererCudOption, object: Object3DLike) { } /** * 删除线之后的回调 */ - afterDeleteLine(start: ItemJson, end: ItemJson, type: LinkType, option: RendererCudOption, object: THREE.Object3D) { - } - - fillObjectUserDataFromItem(item: ItemJson, object: THREE.Object3D) { - if (!object.name && item.name) { - object.name = item.name - } - object.userData = { - ...object.userData, - createType: 'point', - entityId: item.id, - draggable: item.dt.protected !== true, - selectable: item.dt.selectable !== false, - t: item.t - } - } - - fillObjectUserDataFromLine(start: ItemJson, end: ItemJson, type: LinkType, object: THREE.Object3D) { - const id = getLineId(start.id, end.id, type) - if (!object.name) { - object.name = id - } - object.userData = { - ...object.userData, - createType: 'line', - entityId: getLineId(start.id, end.id, type), - startId: start.id, - endId: end.id, - draggable: false, - selectable: false, - t: start.t - } + afterDeleteLine(start: ItemJson, end: ItemJson, type: LinkType, option: RendererCudOption, object: Object3DLike) { } /** * 将对象添加到当前视口的场景中 */ - appendToScene(...objects: THREE.Object3D[]) { + appendToScene(...objects: Object3DLike[]) { if (!this.tempViewport || !this.tempViewport.scene) { console.warn('No active viewport to append objects to.') return } this.tempViewport.scene.add(...objects) - const dragObjects = objects.filter(obj => !!obj.userData.draggable) + // const dragObjects = objects.filter(obj => !!obj.userData.draggable) //this.tempViewport.dragControl.setDragObjects(dragObjects, 'push') } @@ -177,20 +151,26 @@ export default abstract class BaseRenderer { //this.tempViewport.dragControl.setDragObjects(objects, 'remove') } + createPointForEntity(item: ItemJson, option?: RendererCudOption): Object3DLike { + const point = this.createPoint(item, option) + + point.visible = ((typeof item.v !== 'undefined') ? item.v : true) + + setUserDataForItem(item, point) + this.afterCreateOrUpdatePoint(item, option, point) + this.tempViewport.entityManager.appendObject(item.id, point) + this.appendToScene(point) + return point + } + /** * 创建一个点 * @param item 点的定义 * @param option 渲染选项 */ - createPoint(item: ItemJson, option?: RendererCudOption): THREE.Object3D { + createPoint(item: ItemJson, option?: RendererCudOption): Object3DLike { // 由基础类创造一个属于自己的点演示 const point = this.createPointBasic(item, option) - if (!point || !point.position) { - debugger - } - if (item.name) { - point.name = item.name - } point.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) @@ -202,11 +182,6 @@ export default abstract class BaseRenderer { point.scale.set(item.tf[2][0], item.tf[2][1], item.tf[2][2]) point.visible = ((typeof item.v !== 'undefined') ? item.v : true) - this.fillObjectUserDataFromItem(item, point) - this.afterCreateOrUpdatePoint(item, option, point) - this.tempViewport.entityManager.appendObject(item.id, point) - this.appendToScene(point) - return point } @@ -218,7 +193,7 @@ export default abstract class BaseRenderer { */ deletePoint(id: string, option?: RendererCudOption) { const object = this.tempViewport.entityManager.findObjectById(id) - if (object) { + if (object instanceof THREE.Object3D) { this.removeFromScene(object) } @@ -226,12 +201,21 @@ export default abstract class BaseRenderer { this.tempViewport.entityManager.deleteObjectsOnly(id) } + updatePointForEntity(item: ItemJson, option?: RendererCudOption): Object3DLike { + const point = this.updatePoint(item, option) + point.visible = ((typeof item.v !== 'undefined') ? item.v : true) + + setUserDataForItem(item, point) + this.afterCreateOrUpdatePoint(item, option, point) + return point + } + /** * 更新一个点 * @param item 点的定义 * @param option 渲染选项 */ - updatePoint(item: ItemJson, option?: RendererCudOption) { + updatePoint(item: ItemJson, option?: RendererCudOption): Object3DLike { const object = this.tempViewport.entityManager.findObjectById(item.id) if (!object) { console.warn(`Point with ID "${item.id}" does not exist.`) @@ -250,10 +234,7 @@ export default abstract class BaseRenderer { ) point.scale.set(item.tf[2][0], item.tf[2][1], item.tf[2][2]) - point.visible = ((typeof item.v !== 'undefined') ? item.v : true) - - this.fillObjectUserDataFromItem(item, point) - this.afterCreateOrUpdatePoint(item, option, point) + return point } /** @@ -275,10 +256,11 @@ export default abstract class BaseRenderer { const geom = line.geometry geom.setFromPoints([startPoint.position, endPoint.position]) } - this.fillObjectUserDataFromLine(start, end, type, line) - + setUserDataForLine(start, end, type, line) this.tempViewport.entityManager.appendLineObject(id, line) - this.appendToScene(line) + if (line instanceof THREE.Object3D) { + this.appendToScene(line) + } this.afterCreateOrUpdateLine(start, end, type, option, line) } @@ -313,10 +295,10 @@ export default abstract class BaseRenderer { */ deleteLine(start: ItemJson, end: ItemJson, type: LinkType, option?: RendererCudOption) { const lineId = getLineId(start.id, end.id, type) - const lines = this.tempViewport.entityManager.findLineObjectById(lineId) + const line = this.tempViewport.entityManager.findLineObjectById(lineId) this.tempViewport.entityManager.deleteLineObjectOnly(lineId) - this.afterDeleteLine(start, end, type, option, lines) + this.afterDeleteLine(start, end, type, option, line) } dispose() { diff --git a/src/core/engine/SceneHelp.ts b/src/core/engine/SceneHelp.ts index 9c34fb4..c7680c1 100644 --- a/src/core/engine/SceneHelp.ts +++ b/src/core/engine/SceneHelp.ts @@ -3,6 +3,9 @@ import type WorldModel from '@/core/manager/WorldModel' import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry' import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial' import { Line2 } from 'three/examples/jsm/lines/Line2' +import type { Object3DLike } from '@/types/ModelTypes.ts' +import { LineManageWrap } from '@/core/manager/LineSegmentManager.ts' +import { PointManageWrap } from '@/core/manager/InstancePointManager.ts' /** * 场景帮助类 @@ -94,8 +97,20 @@ export default class SceneHelp { }) } - add(...object: THREE.Object3D[]) { - this.scene.add(...object) + add(...object: Object3DLike[]) { + for (const obj of object) { + if (obj instanceof THREE.Object3D) { + this.scene.add(obj) + + } else if (obj instanceof LineManageWrap) { + // 默认会合并到 LineSegmentManager 中 + + } else if (obj instanceof PointManageWrap) { + if (!obj.parent) { + obj.manager.syncMeshObject3D(obj) + } + } + } } /** @@ -173,4 +188,4 @@ function createAxes(axesSize = 5, axesColor = 0x000000, axesWidth = 2) { group.add(line) }) return group -} \ No newline at end of file +} diff --git a/src/core/manager/EntityManager.ts b/src/core/manager/EntityManager.ts index fdb2335..d200225 100644 --- a/src/core/manager/EntityManager.ts +++ b/src/core/manager/EntityManager.ts @@ -5,6 +5,7 @@ import { getRenderer } from './ModuleManager' import { getClosestObject, getLineId, parseLineId } from '@/core/ModelUtils' import { Vector2 } from 'three' import { getFreezeDeep } from '@/utils/webutils.ts' +import type { Object3DLike } from '@/types/ModelTypes.ts' /** * 实体管理器 @@ -24,7 +25,7 @@ export default class EntityManager { private readonly __relationIndex = new Map() // 所有 THREEJS "点"对象, 检索值是"点实体"的 id, 值是 THREE.Object3D 数组 - private readonly __objectMap = new Map() + private readonly __objectMap = new Map() // 所有 THREEJS "可选中"对象, 检索值是"点实体"的 id, 值是 THREE.Object3D 数组 readonly _selectableObjects: THREE.Object3D[] = [] @@ -32,7 +33,7 @@ export default class EntityManager { readonly _draggableObjects: THREE.Object3D[] = [] // 所有 THREEJS "线"对象, 检索值是"线实体"的 id, 取值方式是 {type}${startId}${endId}, 值是 THREE.Object3D 数组 - private readonly __lineMap = new Map() + private readonly __lineMap = new Map() // 差量渲染器 private readonly diffRenderer = new Map() @@ -139,11 +140,11 @@ export default class EntityManager { } if (typeof originEntity === 'undefined') { - renderer.createPoint(entity, option as RendererCudOption) + renderer.createPointForEntity(entity, option as RendererCudOption) } else { option.originEntity = _.cloneDeep(originEntity) - renderer.updatePoint(entity, option as RendererCudOption) + renderer.updatePointForEntity(entity, option as RendererCudOption) } } @@ -413,26 +414,26 @@ export default class EntityManager { return this.___entityMap.delete(id) } - findObjectById(id: string): THREE.Object3D | undefined { + findObjectById(id: string): Object3DLike | undefined { return this.__objectMap.get(id) } - appendObject(id: string, object: THREE.Object3D) { + appendObject(id: string, object: Object3DLike) { this.__objectMap.set(id, object) // 如果是可选中对象,添加到 _selectableObjects 中 - if (object.userData.selectable !== false) { + if (object instanceof THREE.Object3D && object.userData.selectable !== false) { this._selectableObjects.push(object) } - if (object.userData.draggable) { + if (object instanceof THREE.Object3D && object.userData.draggable) { this._draggableObjects.push(object) } } - appendLineObject(id: string, lines: THREE.Object3D) { + appendLineObject(id: string, lines: Object3DLike) { this.__lineMap.set(id, lines) } - findLineObjectById(lineId: string): THREE.Object3D | undefined { + findLineObjectById(lineId: string): Object3DLike | undefined { return this.__lineMap.get(lineId) } @@ -487,7 +488,7 @@ export default class EntityManager { new THREE.Vector2(startX, startZ), new THREE.Vector2(endX, endZ) ) - const objectsInBox: THREE.Object3D[] = [] + const objectsInBox: Object3DLike[] = [] for (const [id, obj] of this.__objectMap.entries()) { if (box.containsPoint(new Vector2(obj.position.x, obj.position.z))) { diff --git a/src/core/manager/InstancePointManager.ts b/src/core/manager/InstancePointManager.ts index 62c6fd3..7caecad 100644 --- a/src/core/manager/InstancePointManager.ts +++ b/src/core/manager/InstancePointManager.ts @@ -1,8 +1,6 @@ import * as THREE from 'three' -import type IControls from '@/core/controls/IControls.ts' import type Viewport from '@/core/engine/Viewport.ts' import { Vector3 } from 'three/src/math/Vector3' -import { Euler } from 'three/src/math/Euler' export default class InstancePointManager { private readonly viewport: Viewport @@ -13,38 +11,47 @@ export default class InstancePointManager { private readonly material: THREE.Material private readonly dummy: THREE.Object3D = new THREE.Object3D() // itemId -> instanceId - private instanceData: Map = new Map() + private instanceData = new Map() /** * 创建点实例 * @param item 点数据 * @returns 分配的实例ID (如果失败返回-1) */ - createPoint(item: ItemJson): number { + createPoint(item: ItemJson): PointManageWrap { if (this.freeIndices.length === 0) { system.showErrorDialog('InstancePointManager is full') - return -1 + return null } - const instanceId = this.freeIndices.pop()! - this.instanceData.set(item.id, instanceId) - - this.updatePoint(item) - return instanceId + const meshIndex = this.freeIndices.pop()! + return new PointManageWrap(this, { + uuid: item.id, + name: item.name, + meshIndex: meshIndex, + visible: item.v !== false, + //@ts-ignore + userData: { + t: item.t, + createType: 'point', + entityId: item.id + } + }) } + /** * 更新点实例 * @param item 点数据 * @param option 更新选项 */ - updatePoint(item: ItemJson, option: { - position?: Vector3 - rotation?: Vector3 - scale?: Vector3 - } = {}): void { - const instanceId = this.instanceData.get(item.id) - if (instanceId === undefined) return + updatePoint(item: ItemJson, option: { position?: Vector3, rotation?: Vector3, scale?: Vector3 } = {}): void { + const wrap = this.instanceData.get(item.id) + if (wrap === undefined) return + + wrap.visible = item.v !== false + wrap.userData.t = item.t + wrap.userData.entityId = item.id let [position, rotation, scale] = item.tf if (option.position) { @@ -57,20 +64,40 @@ export default class InstancePointManager { scale = option.scale.toArray() } - this.dummy.position.set(position[0], position[1], position[2]) - this.dummy.rotation.set( + wrap.position.set(position[0], position[1], position[2]) + wrap.rotation.set( THREE.MathUtils.degToRad(rotation[0]), THREE.MathUtils.degToRad(rotation[1]), THREE.MathUtils.degToRad(rotation[2]) ) - this.dummy.scale.set(scale[0], scale[1], scale[2]) + wrap.scale.set(scale[0], scale[1], scale[2]) + this.syncMeshObject3D(wrap) + } + + /** + * 获取点实例数据 + */ + getObject3DLike(id: string): PointManageWrap { + return this.instanceData.get(id) + } + + syncMeshObject3D(wrap: PointManageWrap) { + if (wrap.meshIndex < 0) { + console.error('InstancePointManager: Invalid meshIndex for wrap', wrap) + return + } - if (item.v === false) { + if (!wrap.visible) { this.dummy.scale.set(0, 0, 0) + } else { + this.dummy.position.copy(wrap.position) + this.dummy.rotation.copy(wrap.rotation) + this.dummy.scale.copy(wrap.scale) } this.dummy.updateMatrix() - this.instancedMesh.setMatrixAt(instanceId, this.dummy.matrix) + wrap.parent = this.instancedMesh + this.instancedMesh.setMatrixAt(wrap.meshIndex, this.dummy.matrix) this.instancedMesh.instanceMatrix.needsUpdate = true } @@ -79,18 +106,20 @@ export default class InstancePointManager { * @param id 点ID */ deletePoint(id: string): void { - const instanceId = this.instanceData.get(id) - if (instanceId === undefined) return + const wrap = this.instanceData.get(id) + if (wrap === undefined) return // 隐藏实例 this.dummy.scale.set(0, 0, 0) this.dummy.updateMatrix() - this.instancedMesh.setMatrixAt(instanceId, this.dummy.matrix) + this.instancedMesh.setMatrixAt(wrap.meshIndex, this.dummy.matrix) this.instancedMesh.instanceMatrix.needsUpdate = true // 回收索引 - this.freeIndices.push(instanceId) + this.freeIndices.push(wrap.meshIndex) this.instanceData.delete(id) + + wrap.dispose() } /** @@ -99,11 +128,11 @@ export default class InstancePointManager { * @param target 目标向量 */ getWorldPosition(id: string, target: THREE.Vector3): void { - const instanceId = this.instanceData.get(id) - if (instanceId === undefined) return + const instanceData = this.instanceData.get(id) + if (instanceData === undefined) return const matrix = new THREE.Matrix4() - this.instancedMesh.getMatrixAt(instanceId, matrix) + this.instancedMesh.getMatrixAt(instanceData.meshIndex, matrix) target.setFromMatrixPosition(matrix) } @@ -175,3 +204,38 @@ export default class InstancePointManager { this.freeIndices.length = 0 } } + +export class PointManageWrap { + readonly manager: InstancePointManager + meshIndex: number = -1 + parent: THREE.Object3D | null = null + + uuid: string + name: string + visible: boolean + readonly position = new THREE.Vector3() + readonly rotation = new THREE.Euler() + readonly scale = new THREE.Vector3(1, 1, 1) + //@ts-ignore + userData: UserData = {} + + get type() { + return 'PointManageWrap' + } + + get isObject3D() { + return false + } + + constructor(pointManager: InstancePointManager, data: any, meshIndex: number = -1) { + this.manager = pointManager + this.meshIndex = meshIndex + _.extend(this, data) + } + + dispose() { + this.manager.deletePoint(this.uuid) + this.parent = null + this.meshIndex = -1 + } +} diff --git a/src/core/manager/LabelManager.ts b/src/core/manager/LabelManager.ts index 570bbbc..e4a26eb 100644 --- a/src/core/manager/LabelManager.ts +++ b/src/core/manager/LabelManager.ts @@ -4,6 +4,7 @@ import type Viewport from '@/core/engine/Viewport.ts' import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer' import { Text } from 'troika-three-text' import SimSunTTF from '@/assets/fonts/simsunb.ttf' +import type { Object3DLike } from '@/types/ModelTypes.ts' export interface LabelOption { /** @@ -40,10 +41,12 @@ export default class LabelManager implements IControls { this.viewport = viewport } - createOrUpdateLabelByDistance(parentObj: THREE.Object3D, startPos: THREE.Vector3, endPos: THREE.Vector3, option: LabelOption): Text | CSS2DObject { - let labelObj = this.labelMap.get(parentObj.userData.labelObjectId) + createOrUpdateLabelByDistance(lineRef: Object3DLike, startPos: THREE.Vector3, endPos: THREE.Vector3, option: LabelOption): Text | CSS2DObject { + let labelObj = this.labelMap.get(lineRef.userData.labelObjectId) + + // 线段不存在 if (!labelObj) { - labelObj = this.createLabel(parentObj, option) + labelObj = this.createLabel(lineRef, option) } const position = new THREE.Vector3().addVectors(startPos, endPos).multiplyScalar(0.5) @@ -52,12 +55,12 @@ export default class LabelManager implements IControls { // 计算距离 const distance = startPos.distanceTo(endPos) const text = distance.toFixed(2) + ' m' - this.updateLabel(parentObj, text) + this.updateLabel(lineRef, text) return labelObj } - createLabel(parentObj: THREE.Object3D, option: LabelOption): Text | CSS2DObject { + createLabel(parentObj: Object3DLike, option: LabelOption): Text | CSS2DObject { const labelObj = this.createLabelObject(option) parentObj.userData.labelObjectId = labelObj.uuid @@ -77,7 +80,7 @@ export default class LabelManager implements IControls { } - updateLabel(parentObj: THREE.Object3D, text: string) { + updateLabel(parentObj: Object3DLike, text: string) { const labelObj = this.labelMap.get(parentObj.userData.labelObjectId) if (labelObj) { if (labelObj instanceof CSS2DObject) { @@ -92,7 +95,7 @@ export default class LabelManager implements IControls { } } - removeLabel(parentObj: THREE.Object3D) { + removeLabel(parentObj: Object3DLike) { if (parentObj?.userData?.labelObjectId) { const labelObj = this.labelMap.get(parentObj.userData.labelObjectId) this.labelMap.delete(labelObj.uuid) diff --git a/src/core/manager/LineSegmentManager.ts b/src/core/manager/LineSegmentManager.ts index 86137b2..883fd99 100644 --- a/src/core/manager/LineSegmentManager.ts +++ b/src/core/manager/LineSegmentManager.ts @@ -3,6 +3,7 @@ import type Viewport from '@/core/engine/Viewport.ts' import { LineSegmentsGeometry } from 'three/examples/jsm/lines/LineSegmentsGeometry' import { LineSegments2 } from 'three/examples/jsm/lines/LineSegments2' import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial' +import type { Object3DLike, Vector3Like } from '@/types/ModelTypes.ts' /** * 线段管理器 @@ -12,20 +13,26 @@ export default class LineSegmentManager { private readonly lineGeometry: LineSegmentsGeometry private readonly lineMaterial: LineMaterial private readonly lineSegments: LineSegments2 - private readonly segments: Map = new Map() + private readonly segments: Map = new Map() public needsUpdate: boolean = false private colorArray: Float32Array | null = null private positionArray: Float32Array | null = null /** * 创建或更新线段 - * @param key 线段唯一标识 + * @param lineId 线段唯一标识 * @param start 起点 * @param end 终点 * @param color 线段颜色 (可选) * @param userData 自定义数据 (可选) */ - createLine(key: string, start: THREE.Vector3Like, end: THREE.Vector3Like, color?: THREE.Color | number | string, userData?: any): void { + createLine(lineId: string, start: THREE.Vector3 | [number, number, number], end: Vector3Like, color?: THREE.Color | number | string, userData: Partial = {}): LineManageWrap { + const segment = this.segments.get(lineId) + if (segment) { + console.error(`LineSegmentManager: Line with id ${lineId} already exists.`) + return + } + const startVec = start instanceof THREE.Vector3 ? start.clone() : new THREE.Vector3(start[0], start[1], start[2]) @@ -43,104 +50,126 @@ export default class LineSegmentManager { colorObj = new THREE.Color(color) } - if (this.segments.has(key)) { - // 更新现有线段 - const segment = this.segments.get(key)! - segment.start.copy(startVec) - segment.end.copy(endVec) - if (colorObj) segment.color = colorObj - if (userData) segment.userData = userData - } else { - // 创建新线段 - this.segments.set(key, { - key, - start: startVec, - end: endVec, - color: colorObj, - visible: true, - userData - }) - } + const result = new LineManageWrap(this, { + uuid: lineId, + visible: true, + userData: { + entityId: lineId, + createType: 'line', + ...userData + } + }, startVec, endVec, colorObj) + this.segments.set(lineId, result) + result.parent = this.lineSegments this.needsUpdate = true + return result } - /** - * 更新线段位置 - * @param key 线段唯一标识 - * @param start 新起点 - * @param end 新终点 - */ - updateLinePosition(key: string, start: THREE.Vector3Like, end: THREE.Vector3Like): void { - const segment = this.segments.get(key) - if (!segment) return - - if (start instanceof THREE.Vector3) { - segment.start.copy(start) - } else { - segment.start.set(start[0], start[1], start[2]) - } + updateLine(lineId: string, start?: Vector3Like, end?: Vector3Like, color?: THREE.Color | number | string): LineManageWrap { + const wrap = this.segments.get(lineId) + if (!wrap) return - if (end instanceof THREE.Vector3) { - segment.end.copy(end) - } else { - segment.end.set(end[0], end[1], end[2]) + // 更新起点和终点 + if (start) { + wrap.start.copy(start instanceof THREE.Vector3 ? start : new THREE.Vector3(start[0], start[1], start[2])) + } + if (end) { + wrap.end.copy(end instanceof THREE.Vector3 ? end : new THREE.Vector3(end[0], end[1], end[2])) } - this.needsUpdate = true - } - - /** - * 更新线段颜色 - * @param key 线段唯一标识 - * @param color 新颜色 - */ - updateLineColor(key: string, color: THREE.Color | number | string): void { - const segment = this.segments.get(key) - if (!segment) return - + // 更新颜色 if (color instanceof THREE.Color) { - segment.color = color + wrap.color = color } else if (typeof color === 'number') { - segment.color = new THREE.Color(color) + wrap.color = new THREE.Color(color) } else if (typeof color === 'string') { - segment.color = new THREE.Color(color) - } else { - segment.color = undefined + wrap.color = new THREE.Color(color) } this.needsUpdate = true + wrap.parent = this.lineSegments + return wrap } - /** - * 设置线段可见性 - * @param key 线段唯一标识 - * @param visible 是否可见 - */ - setLineVisible(key: string, visible: boolean): void { - const segment = this.segments.get(key) - if (segment && segment.visible !== visible) { - segment.visible = visible - this.needsUpdate = true - } - } + // /** + // * 更新线段位置 + // * @param lineId 线段唯一标识 + // * @param start 新起点 + // * @param end 新终点 + // */ + // updateLinePosition(lineId: string, start: THREE.Vector3Like, end: THREE.Vector3Like): void { + // const segment = this.segments.get(lineId) + // if (!segment) return + // + // if (start instanceof THREE.Vector3) { + // segment.start.copy(start) + // } else { + // segment.start.set(start[0], start[1], start[2]) + // } + // + // if (end instanceof THREE.Vector3) { + // segment.end.copy(end) + // } else { + // segment.end.set(end[0], end[1], end[2]) + // } + // + // this.needsUpdate = true + // } + // + // /** + // * 更新线段颜色 + // * @param lineId 线段唯一标识 + // * @param color 新颜色 + // */ + // updateLineColor(lineId: string, color: THREE.Color | number | string): void { + // const segment = this.segments.get(lineId) + // if (!segment) return + // + // if (color instanceof THREE.Color) { + // segment.color = color + // } else if (typeof color === 'number') { + // segment.color = new THREE.Color(color) + // } else if (typeof color === 'string') { + // segment.color = new THREE.Color(color) + // } else { + // segment.color = undefined + // } + // + // this.needsUpdate = true + // } + // + // /** + // * 设置线段可见性 + // * @param lineId 线段唯一标识 + // * @param visible 是否可见 + // */ + // setLineVisible(lineId: string, visible: boolean): void { + // const segment = this.segments.get(lineId) + // if (segment && segment.visible !== visible) { + // segment.visible = visible + // this.needsUpdate = true + // } + // } /** * 删除线段 - * @param key 线段唯一标识 + * @param lineId 线段唯一标识 */ - deleteLine(key: string): void { - if (this.segments.delete(key)) { - this.needsUpdate = true - } + deleteLine(lineId: string): void { + const wrap = this.segments.get(lineId) + if (wrap === undefined) return + + wrap.dispose() + this.needsUpdate = true } /** * 获取线段数据 - * @param key 线段唯一标识 + * @param lineId 线段唯一标识 */ - getLineData(key: string): LineSegmentData | undefined { - return this.segments.get(key) + getObject3DLike(lineId: string): Object3DLike { + return this.segments.get(lineId) } /** @@ -212,9 +241,7 @@ export default class LineSegmentManager { this.lineGeometry.setColors(this.colorArray) // 设置实例计数为可见线段数量 - const visibleCount = Array.from(this.segments.values()).filter(s => s.visible).length - this.lineGeometry.instanceCount = visibleCount - + this.lineGeometry.instanceCount = Array.from(this.segments.values()).filter(s => s.visible).length this.needsUpdate = false } @@ -256,14 +283,42 @@ export default class LineSegmentManager { } } -/** - * 线段数据接口 - */ -interface LineSegmentData { - key: string; - start: THREE.Vector3; - end: THREE.Vector3; - color?: THREE.Color; - visible?: boolean; - userData?: any; + +export class LineManageWrap { + readonly manager: LineSegmentManager + parent: THREE.Object3D | null = null + + start: THREE.Vector3 + end: THREE.Vector3 + color: THREE.Color + + uuid: string + name: string + visible: boolean + readonly position = new THREE.Vector3() + readonly rotation = new THREE.Euler() + readonly scale = new THREE.Vector3(1, 1, 1) + //@ts-ignore + userData: UserData = {} + + get type() { + return 'LineManageWrap' + } + + get isObject3D() { + return false + } + + constructor(lineManager: LineSegmentManager, data: any, start: THREE.Vector3, end: THREE.Vector3, color: THREE.Color) { + this.manager = lineManager + _.extend(this, data) + this.start = start + this.end = end + this.color = color + } + + dispose() { + this.manager.deleteLine(this.uuid) + this.parent = null + } } diff --git a/src/example/example1.js b/src/example/example1.js index d72e08a..821b4e5 100644 --- a/src/example/example1.js +++ b/src/example/example1.js @@ -35,31 +35,31 @@ export default { { catalogCode: 'f1', t: 'floor', // 楼层 items: [ - { - id: 'rack1', - t: 'rack', - v: true, - tf: [[2.9, 0.1, 3.5], [0, 0, 0], [1.5, 0.25, 0.1]], - dt: { - rackDepth: 1, // 货架深度 - rackWidth: 5.6, - rackHeight: 4.2, - levelCount: 3, // 总层数 - bayCount: 4, // 总列数 - hideFloor: false, // 隐藏底板 - extendColumns: true, // 扩展挡板 - columnSpacing: 1, // 支脚跨越 - bays: [ // 每列的配置 - { - bayWidth: 1.4, // 列的宽度 - levelHeight: [1.4, 1.4, 1.4] // 每层的高度 - }, - { bayWidth: 1.4, levelHeight: [1.4, 1.4, 1.4] }, - { bayWidth: 1.4, levelHeight: [1.4, 1.4, 1.4] }, - { bayWidth: 1.4, levelHeight: [1.4, 1.4, 1.4] } - ] - } - }, + // { + // id: 'rack1', + // t: 'rack', + // v: true, + // tf: [[2.9, 0.1, 3.5], [0, 0, 0], [1.5, 0.25, 0.1]], + // dt: { + // rackDepth: 1, // 货架深度 + // rackWidth: 5.6, + // rackHeight: 4.2, + // levelCount: 3, // 总层数 + // bayCount: 4, // 总列数 + // hideFloor: false, // 隐藏底板 + // extendColumns: true, // 扩展挡板 + // columnSpacing: 1, // 支脚跨越 + // bays: [ // 每列的配置 + // { + // bayWidth: 1.4, // 列的宽度 + // levelHeight: [1.4, 1.4, 1.4] // 每层的高度 + // }, + // { bayWidth: 1.4, levelHeight: [1.4, 1.4, 1.4] }, + // { bayWidth: 1.4, levelHeight: [1.4, 1.4, 1.4] }, + // { bayWidth: 1.4, levelHeight: [1.4, 1.4, 1.4] } + // ] + // } + // }, { id: 'P1', t: 'measure', @@ -78,73 +78,74 @@ export default { v: true, tf: [[5, 0.1, 6.25], [90, 0, 0], [0.25, 0.25, 0.1]], dt: { in: [], out: [], center: ['P2'] } - }, { - id: '39zML1rnSOOQGQYQ2YUMGy', - t: 'way', - v: true, - tf: [[-4, 0.1, 2], [90, 0, 0], [0.25, 0.25, 0.1]], - dt: { in: [], out: [], center: ['6wrGKiVJniwgKkoggOoEy6'] } - }, { - id: '6wrGKiVJniwgKkoggOoEy6', - t: 'way', - v: true, - tf: [[5, 0.1, 2], [90, 0, 0], [0.25, 0.25, 0.1]], - dt: { in: [], out: [], center: ['39zML1rnSOOQGQYQ2YUMGy'] } - }, { - id: '6UhIIw9QPYh6acwyW8OSGs', - t: 'gstore', - v: true, - tf: [[-1, 0.1, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], - dt: { in: [], out: [], center: [], storeWidth: 1.4, storeDepth: 1.4 } - }, { - id: '1D0WSRPj8JJJwIcmA0UMqG', - t: 'gstore', - v: true, - tf: [[0.75, 0.1, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], - dt: { in: [], out: [], center: [], storeWidth: 1.4, storeDepth: 1.4 } - }, { - id: 'gstore3', - t: 'gstore', - v: true, - tf: [[3, 0.1, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], - dt: { in: [], out: [], center: [], storeWidth: 1.4, storeDepth: 1.4 } - }, { - id: 'pallet1', - t: 'pallet', - v: true, - tf: [[0.75, 0.075, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], - dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 } - }, { - id: 'pallet2', - t: 'pallet', - v: true, - tf: [[3, 0.075, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], - dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 } - }, { - id: 'ptr1', - t: 'ptr', - v: true, - tf: [[0.75, 0.075, 2], [0, 0, 0], [1.5, 1.2, 0.1]], - dt: { in: [], out: [], center: [], ptrWidth: 1.5, ptrDepth: 1.5, ptrHeight: 1.98 } - }, { - id: 'ptr2', - t: 'ptr', - v: true, - tf: [[3, 0.075, 2], [0, 0, 0], [1.5, 1.2, 0.1]], - dt: { in: [], out: [], center: [], ptrWidth: 1.5, ptrDepth: 1.5, ptrHeight: 1.98 } - }, { - id: 'pallet3', - t: 'pallet', - v: true, - tf: [[3, 0.175, 1.88], [0, 0, 0], [1.5, 1.2, 0.1]], - dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 } - }, { - id: 'pallet4', - t: 'pallet', - v: true, - tf: [[0.75, 0.175, 3.5], [0, 0, 0], [1.5, 1.2, 0.1]], - dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 } } + // { + // id: '39zML1rnSOOQGQYQ2YUMGy', + // t: 'way', + // v: true, + // tf: [[-4, 0.1, 2], [90, 0, 0], [0.25, 0.25, 0.1]], + // dt: { in: [], out: [], center: ['6wrGKiVJniwgKkoggOoEy6'] } + // }, { + // id: '6wrGKiVJniwgKkoggOoEy6', + // t: 'way', + // v: true, + // tf: [[5, 0.1, 2], [90, 0, 0], [0.25, 0.25, 0.1]], + // dt: { in: [], out: [], center: ['39zML1rnSOOQGQYQ2YUMGy'] } + // }, { + // id: '6UhIIw9QPYh6acwyW8OSGs', + // t: 'gstore', + // v: true, + // tf: [[-1, 0.1, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], + // dt: { in: [], out: [], center: [], storeWidth: 1.4, storeDepth: 1.4 } + // }, { + // id: '1D0WSRPj8JJJwIcmA0UMqG', + // t: 'gstore', + // v: true, + // tf: [[0.75, 0.1, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], + // dt: { in: [], out: [], center: [], storeWidth: 1.4, storeDepth: 1.4 } + // }, { + // id: 'gstore3', + // t: 'gstore', + // v: true, + // tf: [[3, 0.1, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], + // dt: { in: [], out: [], center: [], storeWidth: 1.4, storeDepth: 1.4 } + // }, { + // id: 'pallet1', + // t: 'pallet', + // v: true, + // tf: [[0.75, 0.075, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], + // dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 } + // }, { + // id: 'pallet2', + // t: 'pallet', + // v: true, + // tf: [[3, 0.075, 0.55], [0, 0, 0], [1.5, 1.2, 0.1]], + // dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 } + // }, { + // id: 'ptr1', + // t: 'ptr', + // v: true, + // tf: [[0.75, 0.075, 2], [0, 0, 0], [1.5, 1.2, 0.1]], + // dt: { in: [], out: [], center: [], ptrWidth: 1.5, ptrDepth: 1.5, ptrHeight: 1.98 } + // }, { + // id: 'ptr2', + // t: 'ptr', + // v: true, + // tf: [[3, 0.075, 2], [0, 0, 0], [1.5, 1.2, 0.1]], + // dt: { in: [], out: [], center: [], ptrWidth: 1.5, ptrDepth: 1.5, ptrHeight: 1.98 } + // }, { + // id: 'pallet3', + // t: 'pallet', + // v: true, + // tf: [[3, 0.175, 1.88], [0, 0, 0], [1.5, 1.2, 0.1]], + // dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 } + // }, { + // id: 'pallet4', + // t: 'pallet', + // v: true, + // tf: [[0.75, 0.175, 3.5], [0, 0, 0], [1.5, 1.2, 0.1]], + // dt: { in: [], out: [], center: [], palletWidth: 1, palletDepth: 1.2 } + // } ] }, { diff --git a/src/modules/charger/ChargerRenderer.ts b/src/modules/charger/ChargerRenderer.ts index 68ad179..e3d5904 100644 --- a/src/modules/charger/ChargerRenderer.ts +++ b/src/modules/charger/ChargerRenderer.ts @@ -77,11 +77,6 @@ export default class ChargerRenderer extends BaseRenderer { // 设置位置 group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) - - this.fillObjectUserDataFromItem(item, group) - this.afterCreateOrUpdatePoint(item, option, group) - this.tempViewport.entityManager.appendObject(item.id, group) - this.appendToScene(group) return group } diff --git a/src/modules/clx/ClxRenderer.ts b/src/modules/clx/ClxRenderer.ts index 6e3b971..9ea6eaa 100644 --- a/src/modules/clx/ClxRenderer.ts +++ b/src/modules/clx/ClxRenderer.ts @@ -78,11 +78,6 @@ export default class ClxRenderer extends BaseRenderer { // 设置位置 group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) - - this.fillObjectUserDataFromItem(item, group) - this.afterCreateOrUpdatePoint(item, option, group) - this.tempViewport.entityManager.appendObject(item.id, group) - this.appendToScene(group) return group } diff --git a/src/modules/gstore/GstoreRenderer.ts b/src/modules/gstore/GstoreRenderer.ts index c06f2f2..f29076b 100644 --- a/src/modules/gstore/GstoreRenderer.ts +++ b/src/modules/gstore/GstoreRenderer.ts @@ -106,11 +106,6 @@ export default class GstoreRenderer extends BaseRenderer { // 设置位置 group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) - this.fillObjectUserDataFromItem(item, group) - this.afterCreateOrUpdatePoint(item, option, group) - this.tempViewport.entityManager.appendObject(item.id, group) - this.appendToScene(group) - return group } diff --git a/src/modules/measure/MeasureRenderer.ts b/src/modules/measure/MeasureRenderer.ts index 56eadf9..fdb3d8a 100644 --- a/src/modules/measure/MeasureRenderer.ts +++ b/src/modules/measure/MeasureRenderer.ts @@ -2,11 +2,10 @@ import * as THREE from 'three' import BaseRenderer from '@/core/base/BaseRenderer.ts' import { getLineId } from '@/core/ModelUtils.ts' import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js' -import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js' -import { Line2 } from 'three/examples/jsm/lines/Line2.js' import Constract from '@/core/Constract.ts' import InstancePointManager from '@/core/manager/InstancePointManager.ts' import LineSegmentManager from '@/core/manager/LineSegmentManager.ts' +import type { Object3DLike } from '@/types/ModelTypes.ts' /** * 辅助测量工具渲染器 @@ -30,7 +29,7 @@ export default class MeasureRenderer extends BaseRenderer { depthWrite: false, side: THREE.DoubleSide }) - pointGeometry = new THREE.PlaneGeometry(0.25, 0.25) + pointGeometry = new THREE.PlaneGeometry(1, 1) lineMaterial: LineMaterial = new LineMaterial({ color: 0xFF8C00, linewidth: 1, @@ -38,7 +37,7 @@ export default class MeasureRenderer extends BaseRenderer { dashed: false }) readonly defulePositionY = Constract.HEIGHT_MEASURE - readonly defaultScale: THREE.Vector3 = new THREE.Vector3(0.1, 0.1, 0.1) + readonly defaultScale: THREE.Vector3 = new THREE.Vector3(0.25, 0.1, 0.25) readonly defaultRotation: THREE.Vector3 = new THREE.Vector3(0, 0, 0) createPointManager(): InstancePointManager { @@ -52,7 +51,7 @@ export default class MeasureRenderer extends BaseRenderer { /** * 所有的点,必须使用同一个尺寸, 改属性也无效 */ - override afterCreateOrUpdatePoint(item: ItemJson, option: RendererCudOption, object: THREE.Object3D) { + override afterCreateOrUpdatePoint(item: ItemJson, option: RendererCudOption, object: Object3DLike) { super.afterCreateOrUpdatePoint(item, option, object) const point = object @@ -66,31 +65,55 @@ export default class MeasureRenderer extends BaseRenderer { } - createLineBasic(start: ItemJson, end: ItemJson, type: LinkType): THREE.Object3D { - const geom = new LineGeometry() - const obj = new Line2(geom, this.lineMaterial) - obj.frustumCulled = false - obj.name = MeasureRenderer.LINE_NAME - obj.uuid = getLineId(start.id, end.id, type) + // createLineBasic(start: ItemJson, end: ItemJson, type: LinkType): THREE.Object3D { + // const geom = new LineGeometry() + // const obj = new Line2(geom, this.lineMaterial) + // obj.frustumCulled = false + // obj.name = MeasureRenderer.LINE_NAME + // obj.uuid = getLineId(start.id, end.id, type) + // + // return obj + // } + // + // createPointBasic(item: ItemJson, option?: RendererCudOption): THREE.Object3D { + // // const tt = new THREE.BoxGeometry(1, 1, 1) + // // const obj = new THREE.Mesh(tt, this.movelinePoint) + // // obj.name = MeasureRenderer.POINT_NAME + // // obj.uuid = item.id + // // + // // return [obj] + // + // // 创建平面几何体 + // // const obj = new THREE.Mesh(this.pointGeometry,this.pointMaterial) + // // obj.name = MeasureRenderer.POINT_NAME + // // return obj + // } - return obj + createPointBasic(item: ItemJson, option?: RendererCudOption): Object3DLike { + // 不允许改变高度/角度/大小 + item.tf = [ + [item.tf[0][0], this.defulePositionY, item.tf[0][2]], + [this.defaultRotation.x, this.defaultRotation.y, this.defaultRotation.z], + [this.defaultScale.x, this.defaultScale.y, this.defaultScale.z] + ] + return this.pointManager.createPoint(item) } - createPointBasic(item: ItemJson, option?: RendererCudOption): THREE.Object3D { - // const tt = new THREE.BoxGeometry(1, 1, 1) - // const obj = new THREE.Mesh(tt, this.movelinePoint) - // obj.name = MeasureRenderer.POINT_NAME - // obj.uuid = item.id - // - // return [obj] - - // 创建平面几何体 - const obj = new THREE.Sprite(this.pointMaterial as THREE.SpriteMaterial) - obj.name = MeasureRenderer.POINT_NAME - return obj + createLineBasic(start: ItemJson, end: ItemJson, type: LinkType): Object3DLike { + const lineId = getLineId(start.id, end.id, type) + return this.lineSegmentManager.createLine(lineId, start.tf[0], end.tf[0], this.lineMaterial.color) } - // appendToScene(...objects: THREE.Object3D[]) { + // createLine(start: ItemJson, end: ItemJson, type: LinkType): Object3DLike { + // const lineId = getLineId(start.id, end.id, type) + // return this.lineSegmentManager.createLine(lineId, start.tf[0], end.tf[0], this.lineMaterial.color, { + // lineId: lineId, + // startId: start.id, + // endId: end.id + // }) + // } + +// appendToScene(...objects: THREE.Object3D[]) { // if (!this.group || this.group.parent !== this.tempViewport.scene.scene) { // if (this.group && this.group.parent !== this.tempViewport.scene.scene) { // // 幻影加载问题 @@ -108,7 +131,7 @@ export default class MeasureRenderer extends BaseRenderer { // this.group.add(...objects) // } - afterCreateOrUpdateLine(start: ItemJson, end: ItemJson, type: LinkType, option: RendererCudOption, object: THREE.Object3D) { + afterCreateOrUpdateLine(start: ItemJson, end: ItemJson, type: LinkType, option: RendererCudOption, object: Object3DLike) { super.afterCreateOrUpdateLine(start, end, type, option, object) const startPoint = this.tempViewport?.entityManager.findObjectById(start.id) @@ -147,7 +170,7 @@ export default class MeasureRenderer extends BaseRenderer { // } } - afterDeleteLine(start: ItemJson, end: ItemJson, type: LinkType, option: RendererCudOption, object: THREE.Object3D) { + afterDeleteLine(start: ItemJson, end: ItemJson, type: LinkType, option: RendererCudOption, object: Object3DLike) { super.afterDeleteLine(start, end, type, option, object) this.tempViewport.labelManager.removeLabel(object) diff --git a/src/modules/pallet/PalletRenderer.ts b/src/modules/pallet/PalletRenderer.ts index ec62fee..a575398 100644 --- a/src/modules/pallet/PalletRenderer.ts +++ b/src/modules/pallet/PalletRenderer.ts @@ -96,11 +96,6 @@ export default class PalletRenderer extends BaseRenderer { group.add(line as THREE.Object3D) // 设置位置 group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) - - this.fillObjectUserDataFromItem(item, group) - this.afterCreateOrUpdatePoint(item, option, group) - this.tempViewport.entityManager.appendObject(item.id, group) - this.appendToScene(group) return group } diff --git a/src/modules/ptr/PtrRenderer.ts b/src/modules/ptr/PtrRenderer.ts index bea62e4..816230b 100644 --- a/src/modules/ptr/PtrRenderer.ts +++ b/src/modules/ptr/PtrRenderer.ts @@ -78,11 +78,6 @@ export default class PtrRenderer extends BaseRenderer { // 设置位置 group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) - - this.fillObjectUserDataFromItem(item, group) - this.afterCreateOrUpdatePoint(item, option, group) - this.tempViewport.entityManager.appendObject(item.id, group) - this.appendToScene(group) return group } diff --git a/src/modules/rack/RackRenderer.ts b/src/modules/rack/RackRenderer.ts index 8470778..4698559 100644 --- a/src/modules/rack/RackRenderer.ts +++ b/src/modules/rack/RackRenderer.ts @@ -124,14 +124,8 @@ export default class RackRenderer extends BaseRenderer { // 设置位置 group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) - item.dt.rackWidth = rackWidth item.dt.rackHeight = rackHeight - - this.fillObjectUserDataFromItem(item, group) - this.afterCreateOrUpdatePoint(item, option, group) - this.tempViewport.entityManager.appendObject(item.id, group) - this.appendToScene(group) return group } diff --git a/src/types/ModelTypes.ts b/src/types/ModelTypes.ts new file mode 100644 index 0000000..f4b6f69 --- /dev/null +++ b/src/types/ModelTypes.ts @@ -0,0 +1,56 @@ +import { Object3D } from 'three' +import LineSegmentManager, { LineManageWrap } from '@/core/manager/LineSegmentManager.ts' +import InstancePointManager, { PointManageWrap } from '@/core/manager/InstancePointManager.ts' +import * as THREE from 'three' +// +// /** +// * 点数据接口, 用于平衡 Object3D 一致的取数方式 +// */ +// export interface PointData { +// uuid: string +// name: string +// color?: THREE.Color; +// visible: boolean +// +// userData: UserData +// position: THREE.Vector3 +// rotation: THREE.Euler +// scale: THREE.Vector3 +// +// meshIndex: number +// } +// +// /** +// * 线段数据接口, 用于平衡 Object3D 一致的取数方式 +// */ +// export interface LineSegmentData { +// uuid: string; +// name: string; +// color?: THREE.Color; +// visible?: boolean; +// userData: UserData; +// +// position: THREE.Vector3 +// rotation: THREE.Euler +// scale: THREE.Vector3 +// +// start: THREE.Vector3; +// end: THREE.Vector3; +// } + +export interface LineManageReference { + manager: LineSegmentManager + id: string +} + +export interface PointManagerReference { + manager: InstancePointManager + id: string +} + +export type Object3DLike = Object3D | LineManageWrap | PointManageWrap + +/** + * 坐标的范指型, 可以是 THREE.Vector3 或者三元数组 + */ +export type Vector3Like = THREE.Vector3 | [number, number, number] diff --git a/src/types/model.d.ts b/src/types/model.d.ts index ddd2d11..1a54c4d 100644 --- a/src/types/model.d.ts +++ b/src/types/model.d.ts @@ -212,3 +212,52 @@ interface ItemJson { [key: string]: any }, } + + + +/** + * Object3D 与 Mesh / Geometry 都能存储的用户相关数据 + */ +interface UserData { + /** + * 类型, 用于哪个模块处理该对象 + */ + t: string + + /** + * 实体 ID, 用于标识该对象对应的 ItemJson 的 id + */ + entityId: string + + /** + * createType='line' 时, 起点 ID + */ + startId?: string + + /** + * createType='line' 时, 终点 ID + */ + endId?: string + + /** + * 关联显示文本标签的 ID + */ + labelObjectId?: string + + /** + * 创建类型, 用于区分是点还是线 + */ + createType: 'point' | 'line' + + /** + * 是否可拖拽, 用于图形编辑器中拖拽操作 + */ + draggable: boolean + + /** + * 是否可选中, 用于图形编辑器中选中操作 + */ + selectable: boolean + + [key: string]: any +}