fl-web-component 2.0.19-beta.0 → 2.0.19-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- @charset "UTF-8";.fl-model-containor[data-v-a4813dca]{width:100%;height:100%;position:relative;cursor:pointer}[data-v-a4813dca] .tips-label{width:60px;color:#000;font:12px Helvetica;margin-top:-3em;padding:5px;text-align:center;vertical-align:middle;background-color:khaki}[data-v-a4813dca] .measure-label{max-width:100px;margin-top:-1em;border:10px;border-radius:5px;padding:3px 10px;cursor:pointer;color:#009bea;background-color:#f4f4f4;-webkit-box-shadow:0 1px 3px 1px rgba(0,0,0,.25);box-shadow:0 1px 3px 1px rgba(0,0,0,.25)}[data-v-a4813dca] .circle-tag{width:10px;height:10px;margin-top:5px;border-radius:50%;background-color:#ff5000}[data-v-a4813dca] .measure-label-font{word-break:break-all}[data-v-a4813dca] .mark-label-img{padding-top:5px;width:20px;height:20px}.loading-overlay[data-v-a4813dca]{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.7);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;z-index:1000;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease,visibility .3s ease;transition:opacity .3s ease,visibility .3s ease}.loading-overlay--visible[data-v-a4813dca]{opacity:1;visibility:visible}.loading-content[data-v-a4813dca]{background:#fff;border-radius:12px;padding:30px;text-align:center;-webkit-box-shadow:0 8px 32px rgba(0,0,0,.3);box-shadow:0 8px 32px rgba(0,0,0,.3);min-width:300px;max-width:400px}.loading-spinner[data-v-a4813dca]{width:40px;height:40px;border:4px solid #f3f3f3;border-top:4px solid #409eff;border-radius:50%;-webkit-animation:spin-a4813dca 1s linear infinite;animation:spin-a4813dca 1s linear infinite;margin:0 auto 20px}@-webkit-keyframes spin-a4813dca{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin-a4813dca{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.loading-text[data-v-a4813dca]{font-size:16px;font-weight:500;color:#333;margin-bottom:20px}.loading-this.progress-bar[data-v-a4813dca]{width:100%;height:8px;background-color:#f0f0f0;border-radius:4px;overflow:hidden;margin-bottom:15px}.loading-this.progress-fill[data-v-a4813dca]{height:100%;background:-webkit-gradient(linear,left top,right top,from(#409eff),to(#67c23a));background:linear-gradient(90deg,#409eff,#67c23a);border-radius:4px;-webkit-transition:width .3s ease;transition:width .3s ease}.loading-details[data-v-a4813dca]{font-size:12px;color:#666;line-height:1.5}.lil-this.gui{background:hsla(0,0%,100%,.95)!important;border:1px solid #e0e0e0!important;border-radius:8px!important;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15)!important;box-shadow:0 4px 12px rgba(0,0,0,.15)!important;backdrop-filter:blur(10px)!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important}.lil-this.gui .title{background:linear-gradient(135deg,#f8f9fa,#e9ecef)!important;color:#495057!important;border-bottom:1px solid #dee2e6!important;font-weight:600!important;padding:0 12px!important;border-radius:8px 8px 0 0!important}.lil-this.gui .controller{border-bottom:1px solid #f1f3f4!important;background:transparent!important}.lil-this.gui .controller:last-child{border-bottom:none!important}.lil-this.gui .controller .name{color:#495057!important;font-weight:500!important;font-size:12px!important}.lil-this.gui .controller .widget{background:#f8f9fa!important;border:1px solid #ced4da!important;border-radius:4px!important;color:#495057!important}.lil-this.gui .controller .widget:focus,.lil-this.gui .controller .widget:hover{border-color:#80bdff!important;-webkit-box-shadow:0 0 0 2px rgba(0,123,255,.25)!important;box-shadow:0 0 0 2px rgba(0,123,255,.25)!important}.lil-this.gui .controller .widget:focus{outline:none!important}.lil-this.gui .controller input[type=range]{background:#e9ecef!important;height:4px!important;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;border-radius:2px!important}.lil-this.gui .controller.number .fill{border-right:solid #008de9}.lil-this.gui .controller input[type=range]::-webkit-slider-thumb{background:#007bff!important;border:2px solid #fff!important;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2)!important;box-shadow:0 2px 4px rgba(0,0,0,.2)!important;width:16px!important;height:16px!important;border-radius:50%!important;-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important}.lil-this.gui .controller input[type=range]::-moz-range-thumb{background:#007bff!important;border:2px solid #fff!important;box-shadow:0 2px 4px rgba(0,0,0,.2)!important;width:16px!important;height:16px!important;border-radius:50%!important;cursor:pointer!important}.lil-this.gui .controller .option{background:#fff!important;color:#495057!important;border-bottom:1px solid #f1f3f4!important}.lil-this.gui .controller .option:hover{background:#f8f9fa!important}.lil-this.gui .controller .option:last-child{border-bottom:none!important}.lil-this.gui input:active{background:#e6eff4}.lil-this.gui .controller button{background:linear-gradient(135deg,#007bff,#0056b3)!important;color:#fff!important;border:none!important;border-radius:4px!important;font-weight:500!important;-webkit-transition:all .2s ease!important;transition:all .2s ease!important}.lil-this.gui .controller button:hover{background:linear-gradient(135deg,#0056b3,#004085)!important;-webkit-transform:translateY(-1px)!important;transform:translateY(-1px)!important;-webkit-box-shadow:0 4px 8px rgba(0,123,255,.3)!important;box-shadow:0 4px 8px rgba(0,123,255,.3)!important}.lil-this.gui .controller .color{border:2px solid #fff!important;border-radius:4px!important;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.1)!important;box-shadow:0 2px 4px rgba(0,0,0,.1)!important}.lil-this.gui .controller.number .slider,.lil-this.gui .controller.number .slider:hover{background-color:#e6eff4}.lil-this.gui input,.lil-this.gui input:hover,.lil-this.gui input[type=number]:focus,.lil-this.gui input[type=text]:focus{background:#e6eff4}.lil-this.gui .controller>.name{min-width:25px}.lil-this.gui .controller.number input{color:#2e3136}.lil-this.gui .controller.number .slider:active{background-color:#e6eff4}.lil-this.gui .folder>.title{background:linear-gradient(135deg,#f1f3f4,#e9ecef)!important;color:#495057!important;border-bottom:1px solid #dee2e6!important}.lil-this.gui .folder>.title:before{color:#6c757d!important}.lil-this.gui .folder.closed>.children{display:none!important}#konva-container[data-v-b313ab6c]{z-index:3;width:100%;height:100%;cursor:pointer;overflow:hidden}span[data-v-f547d5c6]{font-weight:bolder}.text[data-v-f547d5c6]{margin-top:20px}.line[data-v-f547d5c6]{border-bottom:1px solid #dcdfe6;margin:20px 0}.center[data-v-f547d5c6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.center .cen span[data-v-f547d5c6],.center .top span[data-v-f547d5c6]{color:"#53a8ff";display:inline-block;width:30px;height:30px;text-align:center;line-height:30px;border:1px solid;padding:5px;margin-bottom:10px;background-color:#e9f3ff}.center .cen span[data-v-f547d5c6]{margin:10px}.button[data-v-f547d5c6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:end;margin-top:20px}@font-face{font-family:iconfont;src:url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff2?t=1646635700216) format("woff2"),url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff?t=1646635700216) format("woff"),url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.ttf?t=1646635700216) format("truetype")}.iconfont[data-v-f547d5c6]{font-family:iconfont!important;font-size:50px;font-style:normal;color:"#53a8ff";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-shubiao[data-v-f547d5c6]:before{content:""}.main_body[data-v-4b17bce0]{position:relative;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.classification_title[data-v-4b17bce0]{margin:0 0 10px 0;color:#fff;font-size:14px;cursor:default}.toolbar[data-v-4b17bce0]{z-index:10;position:absolute;width:520px;padding:8px 16px;border-radius:6px;-webkit-box-shadow:0 2px 10px 0 rgba(6,29,44,.25);box-shadow:0 2px 10px 0 rgba(6,29,44,.25);background-color:#fff;top:10px;left:50%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translateX(-50%);transform:translateX(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}.icon_toolbar[data-v-4b17bce0],.text_toolbar[data-v-4b17bce0]{float:left;width:32px;height:32px;padding:0!important;background-repeat:no-repeat;background-size:24px;background-position:50%}.icon_active[data-v-4b17bce0],.icon_toolbar[data-v-4b17bce0]:hover,.text_toolbar[data-v-4b17bce0]:hover{background-color:#eee}[data-v-4b17bce0].icon_color .el-color-picker__trigger{height:24px;margin-top:4px;width:24px!important}[data-v-4b17bce0].el-color-picker--medium,[data-v-4b17bce0].el-color-picker--medium .el-color-picker__trigger{width:24px!important;height:24px!important}.canvas_container[data-v-4b17bce0]{position:relative;width:100%;height:100%;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.canvas_container canvas[data-v-4b17bce0]{position:absolute;left:0}.canvas_container #ctx_front[data-v-4b17bce0]{z-index:5;background-color:transparent}.canvas_container #ctx_back[data-v-4b17bce0]{z-index:3}.canvas_container #ctx_base[data-v-4b17bce0]{z-index:1}#text[data-v-4b17bce0]{position:absolute;z-index:-1;resize:none;outline:none;border:1px dashed #9c9c9c;overflow:hidden;background:transparent;line-height:30px;display:none}#text[data-v-4b17bce0]:hover{border:1px dashed #53a8ff}#svg-component[data-v-2572c0e2],#svg-tigger[data-v-2572c0e2]{cursor:pointer;height:100%;width:100%;position:relative}#toolbar-show[data-v-2572c0e2]{z-index:20;position:absolute;width:100%;height:100%;top:0;left:0;overflow:hidden;background:#fff}
1
+ @charset "UTF-8";.fl-model-containor[data-v-1f8c13ba]{width:100%;height:100%;position:relative;cursor:pointer}[data-v-1f8c13ba] .tips-label{width:60px;color:#000;font:12px Helvetica;margin-top:-3em;padding:5px;text-align:center;vertical-align:middle;background-color:khaki}[data-v-1f8c13ba] .measure-label{max-width:100px;margin-top:-1em;border:10px;border-radius:5px;padding:3px 10px;cursor:pointer;color:#009bea;background-color:#f4f4f4;-webkit-box-shadow:0 1px 3px 1px rgba(0,0,0,.25);box-shadow:0 1px 3px 1px rgba(0,0,0,.25)}[data-v-1f8c13ba] .circle-tag{width:10px;height:10px;margin-top:5px;border-radius:50%;background-color:#ff5000}[data-v-1f8c13ba] .measure-label-font{word-break:break-all}[data-v-1f8c13ba] .mark-label-img{padding-top:5px;width:20px;height:20px}.loading-overlay[data-v-1f8c13ba]{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.7);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;z-index:1000;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease,visibility .3s ease;transition:opacity .3s ease,visibility .3s ease}.loading-overlay--visible[data-v-1f8c13ba]{opacity:1;visibility:visible}.loading-content[data-v-1f8c13ba]{background:#fff;border-radius:12px;padding:30px;text-align:center;-webkit-box-shadow:0 8px 32px rgba(0,0,0,.3);box-shadow:0 8px 32px rgba(0,0,0,.3);min-width:300px;max-width:400px}.loading-spinner[data-v-1f8c13ba]{width:40px;height:40px;border:4px solid #f3f3f3;border-top:4px solid #409eff;border-radius:50%;-webkit-animation:spin-1f8c13ba 1s linear infinite;animation:spin-1f8c13ba 1s linear infinite;margin:0 auto 20px}@-webkit-keyframes spin-1f8c13ba{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin-1f8c13ba{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.loading-text[data-v-1f8c13ba]{font-size:16px;font-weight:500;color:#333;margin-bottom:20px}.loading-this.progress-bar[data-v-1f8c13ba]{width:100%;height:8px;background-color:#f0f0f0;border-radius:4px;overflow:hidden;margin-bottom:15px}.loading-this.progress-fill[data-v-1f8c13ba]{height:100%;background:-webkit-gradient(linear,left top,right top,from(#409eff),to(#67c23a));background:linear-gradient(90deg,#409eff,#67c23a);border-radius:4px;-webkit-transition:width .3s ease;transition:width .3s ease}.loading-details[data-v-1f8c13ba]{font-size:12px;color:#666;line-height:1.5}.lil-this.gui{background:hsla(0,0%,100%,.95)!important;border:1px solid #e0e0e0!important;border-radius:8px!important;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15)!important;box-shadow:0 4px 12px rgba(0,0,0,.15)!important;backdrop-filter:blur(10px)!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important}.lil-this.gui .title{background:linear-gradient(135deg,#f8f9fa,#e9ecef)!important;color:#495057!important;border-bottom:1px solid #dee2e6!important;font-weight:600!important;padding:0 12px!important;border-radius:8px 8px 0 0!important}.lil-this.gui .controller{border-bottom:1px solid #f1f3f4!important;background:transparent!important}.lil-this.gui .controller:last-child{border-bottom:none!important}.lil-this.gui .controller .name{color:#495057!important;font-weight:500!important;font-size:12px!important}.lil-this.gui .controller .widget{background:#f8f9fa!important;border:1px solid #ced4da!important;border-radius:4px!important;color:#495057!important}.lil-this.gui .controller .widget:focus,.lil-this.gui .controller .widget:hover{border-color:#80bdff!important;-webkit-box-shadow:0 0 0 2px rgba(0,123,255,.25)!important;box-shadow:0 0 0 2px rgba(0,123,255,.25)!important}.lil-this.gui .controller .widget:focus{outline:none!important}.lil-this.gui .controller input[type=range]{background:#e9ecef!important;height:4px!important;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;border-radius:2px!important}.lil-this.gui .controller.number .fill{border-right:solid #008de9}.lil-this.gui .controller input[type=range]::-webkit-slider-thumb{background:#007bff!important;border:2px solid #fff!important;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2)!important;box-shadow:0 2px 4px rgba(0,0,0,.2)!important;width:16px!important;height:16px!important;border-radius:50%!important;-webkit-appearance:none!important;appearance:none!important;cursor:pointer!important}.lil-this.gui .controller input[type=range]::-moz-range-thumb{background:#007bff!important;border:2px solid #fff!important;box-shadow:0 2px 4px rgba(0,0,0,.2)!important;width:16px!important;height:16px!important;border-radius:50%!important;cursor:pointer!important}.lil-this.gui .controller .option{background:#fff!important;color:#495057!important;border-bottom:1px solid #f1f3f4!important}.lil-this.gui .controller .option:hover{background:#f8f9fa!important}.lil-this.gui .controller .option:last-child{border-bottom:none!important}.lil-this.gui input:active{background:#e6eff4}.lil-this.gui .controller button{background:linear-gradient(135deg,#007bff,#0056b3)!important;color:#fff!important;border:none!important;border-radius:4px!important;font-weight:500!important;-webkit-transition:all .2s ease!important;transition:all .2s ease!important}.lil-this.gui .controller button:hover{background:linear-gradient(135deg,#0056b3,#004085)!important;-webkit-transform:translateY(-1px)!important;transform:translateY(-1px)!important;-webkit-box-shadow:0 4px 8px rgba(0,123,255,.3)!important;box-shadow:0 4px 8px rgba(0,123,255,.3)!important}.lil-this.gui .controller .color{border:2px solid #fff!important;border-radius:4px!important;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.1)!important;box-shadow:0 2px 4px rgba(0,0,0,.1)!important}.lil-this.gui .controller.number .slider,.lil-this.gui .controller.number .slider:hover{background-color:#e6eff4}.lil-this.gui input,.lil-this.gui input:hover,.lil-this.gui input[type=number]:focus,.lil-this.gui input[type=text]:focus{background:#e6eff4}.lil-this.gui .controller>.name{min-width:25px}.lil-this.gui .controller.number input{color:#2e3136}.lil-this.gui .controller.number .slider:active{background-color:#e6eff4}.lil-this.gui .folder>.title{background:linear-gradient(135deg,#f1f3f4,#e9ecef)!important;color:#495057!important;border-bottom:1px solid #dee2e6!important}.lil-this.gui .folder>.title:before{color:#6c757d!important}.lil-this.gui .folder.closed>.children{display:none!important}#konva-container[data-v-b313ab6c]{z-index:3;width:100%;height:100%;cursor:pointer;overflow:hidden}span[data-v-f547d5c6]{font-weight:bolder}.text[data-v-f547d5c6]{margin-top:20px}.line[data-v-f547d5c6]{border-bottom:1px solid #dcdfe6;margin:20px 0}.center[data-v-f547d5c6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.center .cen span[data-v-f547d5c6],.center .top span[data-v-f547d5c6]{color:"#53a8ff";display:inline-block;width:30px;height:30px;text-align:center;line-height:30px;border:1px solid;padding:5px;margin-bottom:10px;background-color:#e9f3ff}.center .cen span[data-v-f547d5c6]{margin:10px}.button[data-v-f547d5c6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:end;margin-top:20px}@font-face{font-family:iconfont;src:url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff2?t=1646635700216) format("woff2"),url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff?t=1646635700216) format("woff"),url(//at.alicdn.com/t/font_3226805_qqvo3ag3r8.ttf?t=1646635700216) format("truetype")}.iconfont[data-v-f547d5c6]{font-family:iconfont!important;font-size:50px;font-style:normal;color:"#53a8ff";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-shubiao[data-v-f547d5c6]:before{content:""}.main_body[data-v-4b17bce0]{position:relative;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.classification_title[data-v-4b17bce0]{margin:0 0 10px 0;color:#fff;font-size:14px;cursor:default}.toolbar[data-v-4b17bce0]{z-index:10;position:absolute;width:520px;padding:8px 16px;border-radius:6px;-webkit-box-shadow:0 2px 10px 0 rgba(6,29,44,.25);box-shadow:0 2px 10px 0 rgba(6,29,44,.25);background-color:#fff;top:10px;left:50%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-transform:translateX(-50%);transform:translateX(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;justify-content:space-around}.icon_toolbar[data-v-4b17bce0],.text_toolbar[data-v-4b17bce0]{float:left;width:32px;height:32px;padding:0!important;background-repeat:no-repeat;background-size:24px;background-position:50%}.icon_active[data-v-4b17bce0],.icon_toolbar[data-v-4b17bce0]:hover,.text_toolbar[data-v-4b17bce0]:hover{background-color:#eee}[data-v-4b17bce0].icon_color .el-color-picker__trigger{height:24px;margin-top:4px;width:24px!important}[data-v-4b17bce0].el-color-picker--medium,[data-v-4b17bce0].el-color-picker--medium .el-color-picker__trigger{width:24px!important;height:24px!important}.canvas_container[data-v-4b17bce0]{position:relative;width:100%;height:100%;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.canvas_container canvas[data-v-4b17bce0]{position:absolute;left:0}.canvas_container #ctx_front[data-v-4b17bce0]{z-index:5;background-color:transparent}.canvas_container #ctx_back[data-v-4b17bce0]{z-index:3}.canvas_container #ctx_base[data-v-4b17bce0]{z-index:1}#text[data-v-4b17bce0]{position:absolute;z-index:-1;resize:none;outline:none;border:1px dashed #9c9c9c;overflow:hidden;background:transparent;line-height:30px;display:none}#text[data-v-4b17bce0]:hover{border:1px dashed #53a8ff}#svg-component[data-v-2572c0e2],#svg-tigger[data-v-2572c0e2]{cursor:pointer;height:100%;width:100%;position:relative}#toolbar-show[data-v-2572c0e2]{z-index:20;position:absolute;width:100%;height:100%;top:0;left:0;overflow:hidden;background:#fff}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fl-web-component",
3
- "version": "2.0.19-beta.0",
3
+ "version": "2.0.19-beta.2",
4
4
  "scripts": {
5
5
  "postinstall": "patch-package",
6
6
  "tip1": "仅调试本组件不涉及业务组件,请执行dev",
@@ -165,6 +165,7 @@ import { onContextHandle } from './component/context';
165
165
 
166
166
  const isDebug = process.env.NODE_ENV !== 'production' || process.env.VUE_APP_IS_WATCH === true;
167
167
  // const isDebug = false;
168
+ const COLLISION_PENETRATION_EPSILON = 0.1;
168
169
 
169
170
  export default {
170
171
  name: 'FlModel',
@@ -1769,6 +1770,84 @@ export default {
1769
1770
  }
1770
1771
  node.items.push({ id, box });
1771
1772
  },
1773
+ _isCollisionBoxAvailable(box) {
1774
+ if (!box || !box.isBox3 || box.isEmpty()) return false;
1775
+ if (box.userData && box.userData.visible === false) return false;
1776
+ return true;
1777
+ },
1778
+ _formatCollisionPairId(id) {
1779
+ const value = String(id);
1780
+ const numberValue = Number(value);
1781
+ return Number.isFinite(numberValue) ? numberValue : id;
1782
+ },
1783
+ _getBoxMinPenetration(boxA, boxB) {
1784
+ const x = Math.min(boxA.max.x - boxB.min.x, boxB.max.x - boxA.min.x);
1785
+ const y = Math.min(boxA.max.y - boxB.min.y, boxB.max.y - boxA.min.y);
1786
+ const z = Math.min(boxA.max.z - boxB.min.z, boxB.max.z - boxA.min.z);
1787
+ return Math.min(x, y, z);
1788
+ },
1789
+ _isCollisionBoxMatched(boxA, boxB) {
1790
+ if (!this._isCollisionBoxAvailable(boxA) || !this._isCollisionBoxAvailable(boxB))
1791
+ return false;
1792
+ if (!boxA.intersectsBox(boxB)) return false;
1793
+ return this._getBoxMinPenetration(boxA, boxB) > COLLISION_PENETRATION_EPSILON;
1794
+ },
1795
+ _queryOctreeByBox(box) {
1796
+ const results = [];
1797
+ const root = this._octree;
1798
+ if (!root || !this._isCollisionBoxAvailable(box)) return results;
1799
+
1800
+ const stack = [root];
1801
+ while (stack.length) {
1802
+ const node = stack.pop();
1803
+ if (!node || !node.box || !this._isCollisionBoxMatched(node.box, box)) continue;
1804
+
1805
+ if (node.children) {
1806
+ for (let i = 0; i < 8; i++) {
1807
+ stack.push(node.children[i]);
1808
+ }
1809
+ }
1810
+
1811
+ if (node.items && node.items.length) {
1812
+ for (let i = 0; i < node.items.length; i++) {
1813
+ const item = node.items[i];
1814
+ if (item && this._isCollisionBoxMatched(item.box, box)) {
1815
+ results.push(item);
1816
+ }
1817
+ }
1818
+ }
1819
+ }
1820
+
1821
+ return results;
1822
+ },
1823
+ getOctreeCollisionPairs() {
1824
+ const pairs = [];
1825
+ if (!this._boxIndex || this._boxIndex.size === 0) return { pairs };
1826
+
1827
+ if (!this._octree) {
1828
+ this.buildOctreeFromBoxIndex();
1829
+ }
1830
+ if (!this._octree) return { pairs };
1831
+
1832
+ this._boxIndex.forEach((boxA, idA) => {
1833
+ if (!this._isCollisionBoxAvailable(boxA)) return;
1834
+
1835
+ const hits = this._queryOctreeByBox(boxA);
1836
+ for (let i = 0; i < hits.length; i++) {
1837
+ const item = hits[i];
1838
+ if (!item || String(item.id) === String(idA)) continue;
1839
+ const boxB = item.box;
1840
+ if (!this._isCollisionBoxMatched(boxA, boxB)) continue;
1841
+
1842
+ pairs.push({
1843
+ idA: this._formatCollisionPairId(idA),
1844
+ idB: this._formatCollisionPairId(item.id),
1845
+ });
1846
+ }
1847
+ });
1848
+
1849
+ return { pairs };
1850
+ },
1772
1851
  _getCurrentFrustum() {
1773
1852
  // 确保相机矩阵是最新的
1774
1853
  if (this.camera) {
@@ -3804,6 +3883,7 @@ export default {
3804
3883
  this.skipNextRenderFrame = true;
3805
3884
 
3806
3885
  const intersects = this.getRaycasterObjects(event);
3886
+ console.log(intersects)
3807
3887
  const shouldBlockCamera = intersects.some(item =>
3808
3888
  this.isActiveTransformControlIntersection(item)
3809
3889
  );
@@ -3838,9 +3918,12 @@ export default {
3838
3918
  this.mouse.x = (x / rect.width) * 2 - 1;
3839
3919
  this.mouse.y = -(y / rect.height) * 2 + 1;
3840
3920
  this.raycaster.setFromCamera(this.mouse, this.camera);
3841
- return this.scene && this.scene.children
3842
- ? this.raycaster.intersectObjects(this.scene.children, true)
3843
- : [];
3921
+ if (this.scene && this.scene.children) {
3922
+ let intersects = this.raycaster.intersectObjects(this.scene.children, true)
3923
+ return intersects.filter(item => item.object.type === 'Mesh')
3924
+ }
3925
+ return []
3926
+
3844
3927
  },
3845
3928
  isTransformControlIntersection(intersection) {
3846
3929
  let current = intersection && intersection.object ? intersection.object : null;
@@ -45,10 +45,17 @@ MeasureClearDistance.prototype = {
45
45
 
46
46
  _this.raycaster.setFromCamera(mouse, this.camera);
47
47
  let intersects = _this.raycaster.intersectObjects(_this.scene.children, true);
48
- if (intersects.length > 0) {
49
- return intersects[0]
48
+ let l = intersects.length
49
+ let obj = null
50
+ if (l > 0) {
51
+ for (let index = 0; index < l; index++) {
52
+ if (intersects[index].object.type === 'Mesh') {
53
+ obj = intersects[index]
54
+ break
55
+ }
56
+ }
50
57
  }
51
- return null
58
+ return obj
52
59
  },
53
60
  createLine(p1, p2, config = { color: 0xff0000 }) {
54
61
  const lineMaterial = new THREE.LineBasicMaterial({
@@ -91,10 +98,15 @@ MeasureClearDistance.prototype = {
91
98
  let lastTime = new Date().getTime();
92
99
  if (lastTime - this.firstTime < 300) {
93
100
  const measureObj = _this.getPosition(e);
94
-
101
+ console.log(measureObj)
95
102
  if (measureObj) {
96
103
  _this.selectedObjects.push(measureObj)
97
-
104
+ // 高亮选中的
105
+ // const instanceInfo = measureObj.object.userData?.instancesMap?.get(measureObj.object.name);
106
+ // const { instanceIndex } = instanceInfo;
107
+ let instanceIndex = measureObj.instanceId
108
+ measureObj.object.setColorAt(instanceIndex, new THREE.Color(0x53a8ff));
109
+ measureObj.object.instanceColor.needsUpdate = true;
98
110
  if (_this.selectedObjects.length % 2 === 0) {
99
111
  _this.calculateClearDistance()
100
112
  }
@@ -109,13 +121,29 @@ MeasureClearDistance.prototype = {
109
121
  const obj1 = this.selectedObjects[l - 2];
110
122
  const obj2 = this.selectedObjects[l - 1];
111
123
  const isParallel = this.checkParallelism(obj1.object, obj1.instanceId, obj2.object, obj2.instanceId);
112
- console.log(isParallel)
113
- const pts1 = this.getInstanceSurfacePoints(obj1.object, obj1.instanceId, 600);
114
- const pts2 = this.getInstanceSurfacePoints(obj2.object, obj2.instanceId, 600);
115
- if (pts1.length === 0 || pts2.length === 0) {
124
+
125
+ if (!isParallel) {
126
+ Message.warning('请选择两个平行的物体');
116
127
  return
117
128
  }
118
- const closestPair = this.findClosestPair(pts1, pts2);
129
+ // 全局采样
130
+ const localPts1 = this.sampleGlobal(obj1.object.geometry, 1000);
131
+ const localPts2 = this.sampleGlobal(obj2.object.geometry, 1000);
132
+ const wm1 = this.getInstanceWorldMatrix(obj1.object, obj1.instanceId);
133
+ const wm2 = this.getInstanceWorldMatrix(obj2.object, obj2.instanceId);
134
+ const worldPts1 = localPts1.map(p => p.clone().applyMatrix4(wm1));
135
+ const worldPts2 = localPts2.map(p => p.clone().applyMatrix4(wm2));
136
+ let closestPair = this.findClosestPair(worldPts1, worldPts2);
137
+ // 局部精细搜索
138
+ const radius = closestPair.distance * 2 + 0.1;
139
+ const localPts1Fine = this.sampleLocal(obj1.object, obj1.instanceId, closestPair.point1, radius, 1000);
140
+ const localPts2Fine = this.sampleLocal(obj2.object, obj2.instanceId, closestPair.point2, radius, 1000);
141
+ const combined1 = worldPts1.filter(p => p.distanceTo(closestPair.point1) < radius).concat(localPts1Fine);
142
+ const combined2 = worldPts2.filter(p => p.distanceTo(closestPair.point2) < radius).concat(localPts2Fine);
143
+ if (combined1.length > 0 && combined2.length > 0) {
144
+ closestPair = this.findClosestPair(combined1, combined2, true);
145
+ }
146
+
119
147
  const position = new THREE.Vector3((closestPair.point1.x + closestPair.point2.x) / 2, (closestPair.point1.y + closestPair.point2.y) / 2, (closestPair.point1.z + closestPair.point2.z) / 2);
120
148
  // 将测量结果显示在页面中
121
149
  const circleTag1 = this.createLabel('circle-tag', '', closestPair.point1);
@@ -131,109 +159,84 @@ MeasureClearDistance.prototype = {
131
159
  this.scene.add(line);
132
160
  this.scene.add(label);
133
161
  },
134
- getInstanceSurfacePoints(instancedMesh, instanceId, maxPoints = 1000) {
135
- const geometry = instancedMesh.geometry;
136
- // let localPoints = this.generateGenericLocalPoints(geometry, maxPoints);
137
- let localPoints = this.sampleGeometrySurface(geometry, maxPoints);
138
- const worldMatrix = this.getInstanceWorldMatrix(instancedMesh, instanceId);
139
- const worldPoints = localPoints.map(p => p.clone().applyMatrix4(worldMatrix));
140
- return worldPoints.slice(0, maxPoints);
141
- },
142
- sampleGeometrySurface(geometry, maxPoints = 600) {
143
- const positions = geometry.getAttribute('position');
144
- if (!positions) return [];
145
-
146
- // 获取三角形(优先使用索引)
147
- let triangles = [];
148
- if (geometry.index) {
149
- const index = geometry.index.array;
150
- for (let i = 0; i < index.length; i += 3) {
151
- const a = new THREE.Vector3(positions.getX(index[i]), positions.getY(index[i]), positions.getZ(index[i]));
152
- const b = new THREE.Vector3(positions.getX(index[i + 1]), positions.getY(index[i + 1]), positions.getZ(index[i + 1]));
153
- const c = new THREE.Vector3(positions.getX(index[i + 2]), positions.getY(index[i + 2]), positions.getZ(index[i + 2]));
154
- triangles.push([a, b, c]);
155
- }
156
- } else {
157
- // 无索引时,每三个顶点组成一个三角形
158
- for (let i = 0; i < positions.count; i += 3) {
159
- const a = new THREE.Vector3(positions.getX(i), positions.getY(i), positions.getZ(i));
160
- const b = new THREE.Vector3(positions.getX(i + 1), positions.getY(i + 1), positions.getZ(i + 1));
161
- const c = new THREE.Vector3(positions.getX(i + 2), positions.getY(i + 2), positions.getZ(i + 2));
162
- triangles.push([a, b, c]);
163
- }
164
- }
165
-
162
+ // 全部采样
163
+ sampleGlobal(geometry, maxPoints = 600) {
164
+ const triangles = this.extractTriangles(geometry);
166
165
  if (triangles.length === 0) return [];
167
-
168
- // 计算每个三角形的面积
169
- const areas = triangles.map(([a, b, c]) => {
170
- const ab = new THREE.Vector3().subVectors(b, a);
171
- const ac = new THREE.Vector3().subVectors(c, a);
166
+ const areas = triangles.map(t => {
167
+ const ab = new THREE.Vector3().subVectors(t.b, t.a);
168
+ const ac = new THREE.Vector3().subVectors(t.c, t.a);
172
169
  return new THREE.Vector3().crossVectors(ab, ac).length() * 0.5;
173
170
  });
174
- const totalArea = areas.reduce((sum, a) => sum + a, 0);
175
-
176
- // 按面积比例分配采样点数
171
+ const totalArea = areas.reduce((s, a) => s + a, 0);
177
172
  const points = [];
178
173
  for (let i = 0; i < triangles.length; i++) {
179
- const [a, b, c] = triangles[i];
180
- const area = areas[i];
181
- let samplesForFace = Math.round((area / totalArea) * maxPoints);
182
- if (samplesForFace < 1 && points.length < maxPoints) samplesForFace = 1; // 确保每个面至少一个点
183
-
184
- for (let j = 0; j < samplesForFace; j++) {
185
- // 重心坐标随机采样
186
- const u = Math.random();
187
- const v = Math.random() * (1 - u);
188
- const w = 1 - u - v;
189
- const point = new THREE.Vector3()
190
- .addScaledVector(a, u)
191
- .addScaledVector(b, v)
192
- .addScaledVector(c, w);
193
- points.push(point);
174
+ const { a, b, c } = triangles[i];
175
+ const count = Math.max(1, Math.round((areas[i] / totalArea) * maxPoints));
176
+ for (let j = 0; j < count; j++) {
177
+ const u = Math.random(), v = Math.random() * (1 - u), w = 1 - u - v;
178
+ points.push(new THREE.Vector3().addScaledVector(a, u).addScaledVector(b, v).addScaledVector(c, w));
194
179
  }
195
180
  }
196
-
197
- // 如果点数不够,随机补充
198
181
  while (points.length < maxPoints) {
199
- const triIdx = Math.floor(Math.random() * triangles.length);
200
- const [a, b, c] = triangles[triIdx];
201
- const u = Math.random();
202
- const v = Math.random() * (1 - u);
203
- const w = 1 - u - v;
204
- points.push(new THREE.Vector3().addScaledVector(a, u).addScaledVector(b, v).addScaledVector(c, w));
182
+ const t = triangles[Math.floor(Math.random() * triangles.length)];
183
+ const u = Math.random(), v = Math.random() * (1 - u), w = 1 - u - v;
184
+ points.push(new THREE.Vector3().addScaledVector(t.a, u).addScaledVector(t.b, v).addScaledVector(t.c, w));
205
185
  }
206
186
  return points.slice(0, maxPoints);
207
187
  },
208
- generateGenericLocalPoints(geometry, maxPoints = 1000) {
188
+ // 局部采样
189
+ sampleLocal(instancedMesh, instanceId, centerWorld, radius, pointsCount = 300) {
190
+ const worldMatrix = this.getInstanceWorldMatrix(instancedMesh, instanceId);
191
+ const invMatrix = new THREE.Matrix4().copy(worldMatrix).invert();
192
+ const centerLocal = centerWorld.clone().applyMatrix4(invMatrix);
193
+ const triangles = this.extractTriangles(instancedMesh.geometry);
194
+ if (triangles.length === 0) return [];
195
+
196
+ const relevantTris = triangles.filter(t => {
197
+ const box = new THREE.Box3().setFromPoints([t.a, t.b, t.c]);
198
+ return box.distanceToPoint(centerLocal) <= radius;
199
+ });
200
+ if (relevantTris.length === 0) return [];
201
+
202
+ const localPoints = [];
203
+ const perTri = Math.ceil(pointsCount / relevantTris.length);
204
+ for (const { a, b, c } of relevantTris) {
205
+ for (let j = 0; j < perTri; j++) {
206
+ const u = Math.random(), v = Math.random() * (1 - u), w = 1 - u - v;
207
+ const pt = new THREE.Vector3().addScaledVector(a, u).addScaledVector(b, v).addScaledVector(c, w);
208
+ if (pt.distanceTo(centerLocal) <= radius) localPoints.push(pt);
209
+ }
210
+ }
211
+ while (localPoints.length < pointsCount && relevantTris.length > 0) {
212
+ const { a, b, c } = relevantTris[Math.floor(Math.random() * relevantTris.length)];
213
+ const u = Math.random(), v = Math.random() * (1 - u), w = 1 - u - v;
214
+ const pt = new THREE.Vector3().addScaledVector(a, u).addScaledVector(b, v).addScaledVector(c, w);
215
+ if (pt.distanceTo(centerLocal) <= radius) localPoints.push(pt);
216
+ }
217
+ return localPoints.map(p => p.clone().applyMatrix4(worldMatrix));
218
+ },
219
+ extractTriangles(geometry) {
209
220
  const pos = geometry.getAttribute('position');
210
221
  if (!pos) return [];
211
- const allVerts = [];
212
- for (let i = 0; i < pos.count; i++) {
213
- allVerts.push(new THREE.Vector3(pos.getX(i), pos.getY(i), pos.getZ(i)));
214
- }
215
- let sourceVerts = allVerts;
222
+ const triangles = [];
216
223
  if (geometry.index) {
217
- const indexArr = geometry.index.array;
218
- const seen = new Set();
219
- sourceVerts = [];
220
- for (let i = 0; i < indexArr.length; i++) {
221
- const v = allVerts[indexArr[i]];
222
- const key = `${v.x.toFixed(4)},${v.y.toFixed(4)},${v.z.toFixed(4)}`;
223
- if (!seen.has(key)) {
224
- seen.add(key);
225
- sourceVerts.push(v.clone());
226
- }
224
+ const idx = geometry.index.array;
225
+ for (let i = 0; i < idx.length; i += 3) {
226
+ const a = new THREE.Vector3(pos.getX(idx[i]), pos.getY(idx[i]), pos.getZ(idx[i]));
227
+ const b = new THREE.Vector3(pos.getX(idx[i + 1]), pos.getY(idx[i + 1]), pos.getZ(idx[i + 1]));
228
+ const c = new THREE.Vector3(pos.getX(idx[i + 2]), pos.getY(idx[i + 2]), pos.getZ(idx[i + 2]));
229
+ triangles.push({ a, b, c });
230
+ }
231
+ } else {
232
+ for (let i = 0; i < pos.count; i += 3) {
233
+ const a = new THREE.Vector3(pos.getX(i), pos.getY(i), pos.getZ(i));
234
+ const b = new THREE.Vector3(pos.getX(i + 1), pos.getY(i + 1), pos.getZ(i + 1));
235
+ const c = new THREE.Vector3(pos.getX(i + 2), pos.getY(i + 2), pos.getZ(i + 2));
236
+ triangles.push({ a, b, c });
227
237
  }
228
238
  }
229
- if (sourceVerts.length > maxPoints) {
230
- const step = Math.ceil(sourceVerts.length / maxPoints);
231
- const sampled = [];
232
- for (let i = 0; i < sourceVerts.length; i += step) sampled.push(sourceVerts[i]);
233
- sourceVerts = sampled;
234
- }
235
- return sourceVerts;
236
-
239
+ return triangles;
237
240
  },
238
241
  findClosestPair(points1, points2) {
239
242
  let minDist = Infinity;
@@ -241,8 +244,8 @@ MeasureClearDistance.prototype = {
241
244
  const c2 = new THREE.Vector3();
242
245
  for (const p1 of points1) {
243
246
  for (const p2 of points2) {
244
- const d = p1.distanceTo(p2);
245
- if (d < minDist) {
247
+ const d = Number((p1.distanceTo(p2)).toFixed(2));
248
+ if (d <= minDist) {
246
249
  minDist = d;
247
250
  c1.copy(p1);
248
251
  c2.copy(p2);
@@ -251,38 +254,49 @@ MeasureClearDistance.prototype = {
251
254
  }
252
255
  return { point1: c1, point2: c2, distance: minDist };
253
256
  },
254
-
255
- // 平行判断 (基于包围盒主轴方向)
256
257
  checkParallelism(inst1, id1, inst2, id2) {
258
+ // 1. 获取世界矩阵
257
259
  const mat1 = this.getInstanceWorldMatrix(inst1, id1);
258
260
  const mat2 = this.getInstanceWorldMatrix(inst2, id2);
259
- const box1 = new THREE.Box3();
260
- const box2 = new THREE.Box3();
261
-
262
- // 确保包围盒存在
263
- if (!inst1.geometry.boundingBox) inst1.geometry.computeBoundingBox();
264
- if (!inst2.geometry.boundingBox) inst2.geometry.computeBoundingBox();
265
-
266
- box1.copy(inst1.geometry.boundingBox).applyMatrix4(mat1);
267
- box2.copy(inst2.geometry.boundingBox).applyMatrix4(mat2);
268
261
 
269
- const size1 = new THREE.Vector3(); box1.getSize(size1);
270
- const size2 = new THREE.Vector3(); box2.getSize(size2);
262
+ // 2. 提取纯旋转部分(消除缩放和位移)
263
+ const rotMat1 = new THREE.Matrix4().extractRotation(mat1);
264
+ const rotMat2 = new THREE.Matrix4().extractRotation(mat2);
271
265
 
272
- const getMainDir = (s) => {
273
- if (s.x >= s.y && s.x >= s.z) return new THREE.Vector3(1, 0, 0);
274
- if (s.y >= s.x && s.y >= s.z) return new THREE.Vector3(0, 1, 0);
275
- return new THREE.Vector3(0, 0, 1);
266
+ // 如果物体可能有非均匀缩放,extractRotation 可能会出错,
267
+ // 更稳健的方法是手动归一化列向量
268
+ const normalizeMatrix = (m) => {
269
+ const col0 = new THREE.Vector3().setFromMatrixColumn(m, 0).normalize();
270
+ const col1 = new THREE.Vector3().setFromMatrixColumn(m, 1).normalize();
271
+ const col2 = new THREE.Vector3().setFromMatrixColumn(m, 2).normalize();
272
+ const normMat = new THREE.Matrix4();
273
+ normMat.makeBasis(col0, col1, col2);
274
+ return normMat;
276
275
  };
277
- const d1 = getMainDir(size1);
278
- const d2 = getMainDir(size2);
276
+ const cleanRot1 = normalizeMatrix(rotMat1);
277
+ const cleanRot2 = normalizeMatrix(rotMat2);
279
278
 
280
- const rot1 = new THREE.Quaternion().setFromRotationMatrix(new THREE.Matrix4().extractRotation(mat1));
281
- const rot2 = new THREE.Quaternion().setFromRotationMatrix(new THREE.Matrix4().extractRotation(mat2));
282
- d1.applyQuaternion(rot1);
283
- d2.applyQuaternion(rot2);
279
+ // 3. 定义三个基向量(局部坐标系的X, Y, Z轴)
280
+ const axes = [
281
+ new THREE.Vector3(1, 0, 0),
282
+ new THREE.Vector3(0, 1, 0),
283
+ new THREE.Vector3(0, 0, 1)
284
+ ];
284
285
 
285
- return Math.abs(d1.dot(d2)) > 0.95;
286
+ // 4. 检查是否有任意一对基向量在世界空间中平行
287
+ const threshold = 0.99; // 提高阈值,更严格
288
+ for (const axis1 of axes) {
289
+ // 将局部基向量转换到世界方向
290
+ const worldDir1 = axis1.clone().applyMatrix4(cleanRot1).normalize();
291
+ for (const axis2 of axes) {
292
+ const worldDir2 = axis2.clone().applyMatrix4(cleanRot2).normalize();
293
+ const dot = Math.abs(worldDir1.dot(worldDir2));
294
+ if (dot > threshold) {
295
+ return true; // 只要有一对方向平行即判为平行
296
+ }
297
+ }
298
+ }
299
+ return false;
286
300
  },
287
301
  getInstanceWorldMatrix(instancedMesh, instanceId) {
288
302
  const matrix = new THREE.Matrix4();
@@ -303,10 +317,22 @@ MeasureClearDistance.prototype = {
303
317
  this.polyline.splice(0);
304
318
  this.labels.splice(0);
305
319
  this.firstTime = 0;
320
+ this.selectedObjects.forEach(item => {
321
+ let instanceIndex = item.instanceId
322
+ item.object.setColorAt(instanceIndex, item.object.material.userData.nColor);
323
+ item.object.instanceColor.needsUpdate = true;
324
+ })
325
+ this.selectedObjects.splice(0)
306
326
  }
307
327
  this.renderer.domElement.style.cursor = 'pointer';
308
328
  },
309
329
  clear() {
330
+ this.selectedObjects.forEach(item => {
331
+ let instanceIndex = item.instanceId
332
+ item.object.setColorAt(instanceIndex, item.object.material.userData.nColor);
333
+ item.object.instanceColor.needsUpdate = true;
334
+ })
335
+ this.selectedObjects.splice(0)
310
336
  this.remove(this.points);
311
337
  this.remove(this.polyline);
312
338
  this.remove(this.labels);