iflow-engine-base 3.4.12 → 3.5.0

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
- .originRotate{width:10px;height:10px;background-color:red}.versionText{position:absolute;right:10px;color:#86d9ff;z-index:1000;bottom:0;font-size:10px;background:transparent;pointer-events:none}.originDiv{position:absolute;top:100px;left:100px;width:30px;height:30px;border-radius:50%;z-index:1000;pointer-events:none}.tagDiv{color:gray;background:#fffc;padding:5px;font-size:12px}.catchPoint{pointer-events:none;stroke:#08dfd7;fill:transparent;stroke-width:2}.catchLine{position:absolute;width:10px;height:10px;pointer-events:none;background-color:green}.catchPlane{position:absolute;width:10px;height:10px;pointer-events:none;background-color:#ff0}.ViewCube{position:absolute;width:120px;height:120px;top:0;right:0;z-index:999}.homeViewWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-image:url(/assets/viewcube/home.png);background-size:100% 100%;background-repeat:no-repeat;background-color:#fff0;color:#fff;top:10px;right:100;width:20px;height:20px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.viewSettingWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-size:100% 100%;background-repeat:no-repeat;font-weight:800;background-color:#fff0;color:#fff;top:30px;right:100;width:20px;height:20px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.cameraToggleWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-color:#ffffffe6;color:#333;font-size:26px;font-weight:700;display:none;align-items:center;justify-content:center;border-radius:4px;box-shadow:0 2px 4px #0003;transition:all .3s ease;top:70px;right:90px;width:44px;height:44px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.cameraToggleWrapper.show{display:flex}.cameraToggleWrapper:hover{background-color:#fff;box-shadow:0 3px 6px #0000004d;transform:scale(1.1)}.screenshotWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-color:#ffffffe6;color:#333;font-size:20px;display:none;align-items:center;justify-content:center;border-radius:4px;box-shadow:0 2px 4px #0003;transition:all .3s ease;top:120px;right:90px;width:44px;height:44px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.screenshotWrapper.show{display:flex}.screenshotWrapper:hover{background-color:#fff;box-shadow:0 3px 6px #0000004d;transform:scale(1.1)}.fullscreenWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-color:#ffffffe6;color:#333;font-size:26px;font-weight:700;display:none;align-items:center;justify-content:center;border-radius:4px;box-shadow:0 2px 4px #0003;transition:all .3s ease;top:170px;right:90px;width:44px;height:44px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.fullscreenWrapper.show{display:flex}.fullscreenWrapper:hover{background-color:#fff;box-shadow:0 3px 6px #0000004d;transform:scale(1.1)}.measure-elevation{position:absolute;pointer-events:none}.measureSvg{position:absolute;width:1920px;height:1080px}.catch-point{position:absolute;width:10px;height:10px;background-color:red;border-radius:50%;pointer-events:none}.annotation-container{position:absolute;pointer-events:none;top:0;left:0}.measureLine{position:absolute;pointer-events:none;stroke:#009bea;fill:#009bea;filter:drop-shadow(1px 1px 2px rgba(0,0,0,.3))}.measureBack{cursor:pointer;pointer-events:auto;fill:#fff;padding:5px;top:-50px;rx:5;ry:5;filter:drop-shadow(1px 1px 2px rgba(0,0,0,.3))}.measureLabel{position:absolute;fill:#fff;font-size:14px;stroke:#009bea;font-weight:100;pointer-events:none}.measurePointer{fill:#009bea}.Hight{stroke:#fff;font-weight:500;filter:drop-shadow(2px 1px 2px rgba(255,255,255,1))}.allow-select{pointer-events:auto}.disallow-select{pointer-events:none}.angle-annotation{position:absolute;pointer-events:auto}.MapController{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.engine-2d-container{position:relative;width:100%;height:100%;overflow:hidden}.engine-2d-canvas{display:block;width:100%;height:100%;outline:none}.engine-2d-cad-cursor{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden}.engine-2d-cad-cursor__h{position:absolute;left:0;width:100%;height:1px;background:var(--e2d-cursor, rgba(255, 255, 255, .85));transform:translateY(-50%)}.engine-2d-cad-cursor__v{position:absolute;top:0;width:1px;height:100%;background:var(--e2d-cursor, rgba(255, 255, 255, .85));transform:translate(-50%)}.engine-2d-cad-cursor__box{position:absolute;width:8px;height:8px;border:1px solid var(--e2d-cursor, rgba(255, 255, 255, .85));transform:translate(-50%,-50%)}.engine-2d-context-menu{position:absolute;z-index:9999;min-width:140px;background:var(--e2d-bg2, #252526);border:1px solid var(--e2d-border, rgba(255, 255, 255, .12));border-radius:4px;box-shadow:0 4px 16px var(--e2d-shadow, rgba(0, 0, 0, .5));padding:4px 0;display:none;-webkit-user-select:none;user-select:none}.engine-2d-context-menu--visible{display:block}.engine-2d-context-menu__item{padding:7px 16px;font-size:13px;color:var(--e2d-text2, #cccccc);cursor:pointer;white-space:nowrap;transition:background .1s,color .1s}.engine-2d-context-menu__item:hover{background:var(--e2d-bg-accent, #094771);color:var(--e2d-text-accent, #ffffff)}.engine-2d-context-menu__divider{height:1px;background:var(--e2d-border, rgba(255, 255, 255, .1));margin:4px 0}.engine-2d-stats{position:absolute;top:10px;left:10px;background:var(--e2d-float-bg, rgba(0, 0, 0, .7));color:var(--e2d-text, #e0e0e0);padding:8px 12px;border-radius:4px;font-family:monospace;font-size:12px;pointer-events:none;-webkit-user-select:none;user-select:none}.engine-2d-stats div{margin:2px 0}.engine-2d-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--e2d-float-bg, rgba(0, 0, 0, .8));color:var(--e2d-text, #e0e0e0);padding:20px 40px;border-radius:8px;font-size:16px;text-align:center}.engine-2d-loading-spinner{border:3px solid var(--e2d-border, rgba(255, 255, 255, .3));border-top:3px solid var(--e2d-accent, #4fc3f7);border-radius:50%;width:40px;height:40px;animation:engine-2d-spin 1s linear infinite;margin:0 auto 10px}@keyframes engine-2d-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.engine-2d-error{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:#d32f2feb;color:#fff;padding:20px 40px;border-radius:8px;font-size:14px;max-width:80%;text-align:center}.engine-2d-controls-hint{position:absolute;bottom:10px;left:10px;background:var(--e2d-float-bg, rgba(0, 0, 0, .6));color:var(--e2d-text, #e0e0e0);border:1px solid var(--e2d-float-border, rgba(255, 255, 255, .08));padding:8px 12px;border-radius:4px;font-size:12px;pointer-events:none;-webkit-user-select:none;user-select:none}.engine-2d-controls-hint kbd{background:var(--e2d-icon-bg, rgba(255, 255, 255, .2));color:var(--e2d-text, #e0e0e0);padding:2px 6px;border-radius:3px;font-family:monospace}.engine-2d-search{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9998;display:none}.engine-2d-search--visible{display:block}.engine-2d-search__box{position:absolute;top:14%;left:50%;transform:translate(-50%);width:480px;max-width:calc(100% - 40px);background:var(--e2d-bg, #1e1f22);border:1px solid var(--e2d-border, rgba(255, 255, 255, .14));border-radius:10px;box-shadow:0 8px 40px var(--e2d-shadow-lg, rgba(0, 0, 0, .65)),0 2px 8px var(--e2d-shadow, rgba(0, 0, 0, .4));overflow:hidden;pointer-events:auto;animation:engine-2d-search-in .18s cubic-bezier(.34,1.2,.64,1)}@keyframes engine-2d-search-in{0%{opacity:0;transform:translate(-50%) translateY(-8px) scale(.97)}to{opacity:1;transform:translate(-50%) translateY(0) scale(1)}}.engine-2d-search__input-row{display:flex;align-items:center;padding:0 12px;gap:8px;height:48px}.engine-2d-search__icon{flex-shrink:0;color:var(--e2d-icon, rgba(255, 255, 255, .4));display:flex;align-items:center}.engine-2d-search__input{flex:1;background:transparent;border:none;outline:none;color:var(--e2d-text, #e0e0e0);font-size:14px;line-height:1.4;caret-color:var(--e2d-accent, #4fc3f7)}.engine-2d-search__input::placeholder{color:var(--e2d-text3, rgba(255, 255, 255, .25))}.engine-2d-search__clear{flex-shrink:0;background:var(--e2d-icon-bg, rgba(255, 255, 255, .08));border:none;border-radius:4px;color:var(--e2d-icon, rgba(255, 255, 255, .5));cursor:pointer;display:flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;opacity:0;pointer-events:none;transition:opacity .15s,background .15s,color .15s}.engine-2d-search__clear:hover{background:var(--e2d-icon-bg-hover, rgba(255, 255, 255, .16));color:var(--e2d-close-hover, #ffffff)}.engine-2d-search__divider{height:1px;background:var(--e2d-border2, rgba(255, 255, 255, .08));display:none}.engine-2d-search__status{padding:6px 16px;font-size:11px;color:var(--e2d-text3, rgba(255, 255, 255, .35));display:none;-webkit-user-select:none;user-select:none}.engine-2d-search__list{list-style:none;margin:0;padding:4px 0;max-height:320px;overflow-y:auto;display:none;scrollbar-width:thin;scrollbar-color:var(--e2d-scrollbar, rgba(255, 255, 255, .15)) transparent}.engine-2d-search__list::-webkit-scrollbar{width:4px}.engine-2d-search__list::-webkit-scrollbar-track{background:transparent}.engine-2d-search__list::-webkit-scrollbar-thumb{background:var(--e2d-scrollbar, rgba(255, 255, 255, .15));border-radius:2px}.engine-2d-search__item{display:flex;align-items:center;gap:8px;padding:8px 14px;cursor:pointer;transition:background .1s;min-height:38px;flex-wrap:nowrap}.engine-2d-search__item:hover,.engine-2d-search__item--active{background:var(--e2d-bg-hover, rgba(79, 195, 247, .08))}.engine-2d-search__item-badge{flex-shrink:0;font-size:10px;font-weight:500;padding:2px 6px;border-radius:3px;letter-spacing:.03em;white-space:nowrap}.engine-2d-search__item-name{flex:1;font-size:13px;color:var(--e2d-text, #e0e0e0);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.engine-2d-search__item-layer{flex-shrink:0;font-size:11px;color:var(--e2d-text3, rgba(255, 255, 255, .3));white-space:nowrap;max-width:100px;overflow:hidden;text-overflow:ellipsis}.engine-2d-search__item-desc{flex-shrink:0;font-size:11px;color:var(--e2d-text4, rgba(255, 255, 255, .25));white-space:nowrap;max-width:120px;overflow:hidden;text-overflow:ellipsis}.engine-2d-search__mark{background:transparent;color:var(--e2d-accent, #4fc3f7);font-weight:600}.engine-2d-mouse-coord{position:absolute;bottom:10px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:12px;background:var(--e2d-float-bg, rgba(0, 0, 0, .65));color:var(--e2d-text, #e0e0e0);padding:5px 14px;border-radius:4px;font-family:monospace;font-size:12px;pointer-events:none;-webkit-user-select:none;user-select:none;border:1px solid var(--e2d-float-border, rgba(255, 255, 255, .08))}.engine-2d-mouse-coord__label{color:var(--e2d-coord-label, rgba(255, 255, 255, .45));font-size:11px;letter-spacing:.05em}.engine-2d-mouse-coord__value{min-width:90px;color:var(--e2d-coord-value, #76c8ff)}.panorama-annotation-container{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1000;overflow:hidden}.panorama-annotation{position:absolute;pointer-events:auto;cursor:pointer;transform:translate(-50%,-50%);transition:opacity .2s ease,transform .2s ease;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.panorama-annotation:hover{z-index:1001;transform:translate(-50%,-50%) scale(1.1)}.panorama-annotation-icon{width:40px;height:40px}.panorama-annotation-icon img{width:100%;height:100%;object-fit:contain;display:block;filter:drop-shadow(0 2px 4px rgba(0,0,0,.3))}.panorama-annotation-text{max-width:200px;text-align:center;line-height:1.4}.panorama-annotation-link{transition:background-color .2s ease,transform .2s ease}.panorama-annotation-link:hover{z-index:1002}.panorama-annotation-link img{display:block;flex-shrink:0}.panorama-annotation.hidden{display:none!important}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.panorama-annotation.loading{animation:pulse 1.5s ease-in-out infinite}@media(max-width:768px){.panorama-annotation-icon{width:32px;height:32px}.panorama-annotation-text,.panorama-annotation-link{font-size:12px!important;padding:6px 10px!important}}
1
+ .originRotate{width:10px;height:10px;background-color:red}.versionText{position:absolute;right:10px;color:#86d9ff;z-index:1000;bottom:0;font-size:10px;background:transparent;pointer-events:none}.originDiv{position:absolute;top:100px;left:100px;width:30px;height:30px;border-radius:50%;z-index:1000;pointer-events:none}.tagDiv{color:gray;background:#fffc;padding:5px;font-size:12px}.catchPoint{pointer-events:none;stroke:#08dfd7;fill:transparent;stroke-width:2}.catchLine{position:absolute;width:10px;height:10px;pointer-events:none;background-color:green}.catchPlane{position:absolute;width:10px;height:10px;pointer-events:none;background-color:#ff0}.ViewCube{position:absolute;width:120px;height:120px;top:0;right:0;z-index:999}.homeViewWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-image:url(/assets/viewcube/home.png);background-size:100% 100%;background-repeat:no-repeat;background-color:#fff0;color:#fff;top:10px;right:100;width:20px;height:20px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.viewSettingWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-size:100% 100%;background-repeat:no-repeat;font-weight:800;background-color:#fff0;color:#fff;top:30px;right:100;width:20px;height:20px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.cameraToggleWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-color:#ffffffe6;color:#333;font-size:26px;font-weight:700;display:none;align-items:center;justify-content:center;border-radius:4px;box-shadow:0 2px 4px #0003;transition:all .3s ease;top:70px;right:90px;width:44px;height:44px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.cameraToggleWrapper.show{display:flex}.cameraToggleWrapper:hover{background-color:#fff;box-shadow:0 3px 6px #0000004d;transform:scale(1.1)}.screenshotWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-color:#ffffffe6;color:#333;font-size:20px;display:none;align-items:center;justify-content:center;border-radius:4px;box-shadow:0 2px 4px #0003;transition:all .3s ease;top:120px;right:90px;width:44px;height:44px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.screenshotWrapper.show{display:flex}.screenshotWrapper:hover{background-color:#fff;box-shadow:0 3px 6px #0000004d;transform:scale(1.1)}.fullscreenWrapper{position:absolute;cursor:pointer;pointer-events:auto;background-color:#ffffffe6;color:#333;font-size:26px;font-weight:700;display:none;align-items:center;justify-content:center;border-radius:4px;box-shadow:0 2px 4px #0003;transition:all .3s ease;top:170px;right:90px;width:44px;height:44px;z-index:999;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.fullscreenWrapper.show{display:flex}.fullscreenWrapper:hover{background-color:#fff;box-shadow:0 3px 6px #0000004d;transform:scale(1.1)}.measure-elevation{position:absolute;pointer-events:none}.measureSvg{position:absolute;width:1920px;height:1080px}.catch-point{position:absolute;width:10px;height:10px;background-color:red;border-radius:50%;pointer-events:none}.annotation-container{position:absolute;pointer-events:none;top:0;left:0}.measureLine{position:absolute;pointer-events:none;stroke:#009bea;fill:#009bea;filter:drop-shadow(0px 0px 2px rgba(0,0,0,.3))}.measureBack{cursor:pointer;pointer-events:auto;fill:#fff;padding:5px;top:-50px;rx:5;ry:5;filter:drop-shadow(0px 0px 3px rgba(0,0,0,.3));text-align:center}.measureLabel{position:absolute;fill:#fff;font-family:tahoma;font-size:14px;stroke:#009bea;font-weight:200;pointer-events:none;text-anchor:middle}.measurePointer{fill:#009bea}.Hight{stroke:#fff;font-weight:500;filter:drop-shadow(0px 0px 2px rgb(0,195,255))}.allow-select{pointer-events:auto}.disallow-select{pointer-events:none}.angle-annotation{position:absolute;pointer-events:auto}.MapController{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.engine-2d-container{position:relative;width:100%;height:100%;overflow:hidden}.engine-2d-canvas{display:block;width:100%;height:100%;outline:none}.engine-2d-cad-cursor{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden}.engine-2d-cad-cursor__h{position:absolute;left:0;width:100%;height:1px;background:var(--e2d-cursor, rgba(255, 255, 255, .85));transform:translateY(-50%)}.engine-2d-cad-cursor__v{position:absolute;top:0;width:1px;height:100%;background:var(--e2d-cursor, rgba(255, 255, 255, .85));transform:translate(-50%)}.engine-2d-cad-cursor__box{position:absolute;width:8px;height:8px;border:1px solid var(--e2d-cursor, rgba(255, 255, 255, .85));transform:translate(-50%,-50%)}.engine-2d-context-menu{position:absolute;z-index:9999;min-width:140px;background:var(--e2d-bg2, #252526);border:1px solid var(--e2d-border, rgba(255, 255, 255, .12));border-radius:4px;box-shadow:0 4px 16px var(--e2d-shadow, rgba(0, 0, 0, .5));padding:4px 0;display:none;-webkit-user-select:none;user-select:none}.engine-2d-context-menu--visible{display:block}.engine-2d-context-menu__item{padding:7px 16px;font-size:13px;color:var(--e2d-text2, #cccccc);cursor:pointer;white-space:nowrap;transition:background .1s,color .1s}.engine-2d-context-menu__item:hover{background:var(--e2d-bg-accent, #094771);color:var(--e2d-text-accent, #ffffff)}.engine-2d-context-menu__divider{height:1px;background:var(--e2d-border, rgba(255, 255, 255, .1));margin:4px 0}.engine-2d-stats{position:absolute;top:10px;left:10px;background:var(--e2d-float-bg, rgba(0, 0, 0, .7));color:var(--e2d-text, #e0e0e0);padding:8px 12px;border-radius:4px;font-family:monospace;font-size:12px;pointer-events:none;-webkit-user-select:none;user-select:none}.engine-2d-stats div{margin:2px 0}.engine-2d-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--e2d-float-bg, rgba(0, 0, 0, .8));color:var(--e2d-text, #e0e0e0);padding:20px 40px;border-radius:8px;font-size:16px;text-align:center}.engine-2d-loading-spinner{border:3px solid var(--e2d-border, rgba(255, 255, 255, .3));border-top:3px solid var(--e2d-accent, #4fc3f7);border-radius:50%;width:40px;height:40px;animation:engine-2d-spin 1s linear infinite;margin:0 auto 10px}@keyframes engine-2d-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.engine-2d-error{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:#d32f2feb;color:#fff;padding:20px 40px;border-radius:8px;font-size:14px;max-width:80%;text-align:center}.engine-2d-controls-hint{position:absolute;bottom:10px;left:10px;background:var(--e2d-float-bg, rgba(0, 0, 0, .6));color:var(--e2d-text, #e0e0e0);border:1px solid var(--e2d-float-border, rgba(255, 255, 255, .08));padding:8px 12px;border-radius:4px;font-size:12px;pointer-events:none;-webkit-user-select:none;user-select:none}.engine-2d-controls-hint kbd{background:var(--e2d-icon-bg, rgba(255, 255, 255, .2));color:var(--e2d-text, #e0e0e0);padding:2px 6px;border-radius:3px;font-family:monospace}.engine-2d-search{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9998;display:none}.engine-2d-search--visible{display:block}.engine-2d-search__box{position:absolute;top:14%;left:50%;transform:translate(-50%);width:480px;max-width:calc(100% - 40px);background:var(--e2d-bg, #1e1f22);border:1px solid var(--e2d-border, rgba(255, 255, 255, .14));border-radius:10px;box-shadow:0 8px 40px var(--e2d-shadow-lg, rgba(0, 0, 0, .65)),0 2px 8px var(--e2d-shadow, rgba(0, 0, 0, .4));overflow:hidden;pointer-events:auto;animation:engine-2d-search-in .18s cubic-bezier(.34,1.2,.64,1)}@keyframes engine-2d-search-in{0%{opacity:0;transform:translate(-50%) translateY(-8px) scale(.97)}to{opacity:1;transform:translate(-50%) translateY(0) scale(1)}}.engine-2d-search__input-row{display:flex;align-items:center;padding:0 12px;gap:8px;height:48px}.engine-2d-search__icon{flex-shrink:0;color:var(--e2d-icon, rgba(255, 255, 255, .4));display:flex;align-items:center}.engine-2d-search__input{flex:1;background:transparent;border:none;outline:none;color:var(--e2d-text, #e0e0e0);font-size:14px;line-height:1.4;caret-color:var(--e2d-accent, #4fc3f7)}.engine-2d-search__input::placeholder{color:var(--e2d-text3, rgba(255, 255, 255, .25))}.engine-2d-search__clear{flex-shrink:0;background:var(--e2d-icon-bg, rgba(255, 255, 255, .08));border:none;border-radius:4px;color:var(--e2d-icon, rgba(255, 255, 255, .5));cursor:pointer;display:flex;align-items:center;justify-content:center;width:22px;height:22px;padding:0;opacity:0;pointer-events:none;transition:opacity .15s,background .15s,color .15s}.engine-2d-search__clear:hover{background:var(--e2d-icon-bg-hover, rgba(255, 255, 255, .16));color:var(--e2d-close-hover, #ffffff)}.engine-2d-search__divider{height:1px;background:var(--e2d-border2, rgba(255, 255, 255, .08));display:none}.engine-2d-search__status{padding:6px 16px;font-size:11px;color:var(--e2d-text3, rgba(255, 255, 255, .35));display:none;-webkit-user-select:none;user-select:none}.engine-2d-search__list{list-style:none;margin:0;padding:4px 0;max-height:320px;overflow-y:auto;display:none;scrollbar-width:thin;scrollbar-color:var(--e2d-scrollbar, rgba(255, 255, 255, .15)) transparent}.engine-2d-search__list::-webkit-scrollbar{width:4px}.engine-2d-search__list::-webkit-scrollbar-track{background:transparent}.engine-2d-search__list::-webkit-scrollbar-thumb{background:var(--e2d-scrollbar, rgba(255, 255, 255, .15));border-radius:2px}.engine-2d-search__item{display:flex;align-items:center;gap:8px;padding:8px 14px;cursor:pointer;transition:background .1s;min-height:38px;flex-wrap:nowrap}.engine-2d-search__item:hover,.engine-2d-search__item--active{background:var(--e2d-bg-hover, rgba(79, 195, 247, .08))}.engine-2d-search__item-badge{flex-shrink:0;font-size:10px;font-weight:500;padding:2px 6px;border-radius:3px;letter-spacing:.03em;white-space:nowrap}.engine-2d-search__item-name{flex:1;font-size:13px;color:var(--e2d-text, #e0e0e0);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.engine-2d-search__item-layer{flex-shrink:0;font-size:11px;color:var(--e2d-text3, rgba(255, 255, 255, .3));white-space:nowrap;max-width:100px;overflow:hidden;text-overflow:ellipsis}.engine-2d-search__item-desc{flex-shrink:0;font-size:11px;color:var(--e2d-text4, rgba(255, 255, 255, .25));white-space:nowrap;max-width:120px;overflow:hidden;text-overflow:ellipsis}.engine-2d-search__mark{background:transparent;color:var(--e2d-accent, #4fc3f7);font-weight:600}.engine-2d-mouse-coord{position:absolute;bottom:10px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:12px;background:var(--e2d-float-bg, rgba(0, 0, 0, .65));color:var(--e2d-text, #e0e0e0);padding:5px 14px;border-radius:4px;font-family:monospace;font-size:12px;pointer-events:none;-webkit-user-select:none;user-select:none;border:1px solid var(--e2d-float-border, rgba(255, 255, 255, .08))}.engine-2d-mouse-coord__label{color:var(--e2d-coord-label, rgba(255, 255, 255, .45));font-size:11px;letter-spacing:.05em}.engine-2d-mouse-coord__value{min-width:90px;color:var(--e2d-coord-value, #76c8ff)}.panorama-annotation-container{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1000;overflow:hidden}.panorama-annotation{position:absolute;pointer-events:auto;cursor:pointer;transform:translate(-50%,-50%);transition:opacity .2s ease,transform .2s ease;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.panorama-annotation:hover{z-index:1001;transform:translate(-50%,-50%) scale(1.1)}.panorama-annotation-icon{width:40px;height:40px}.panorama-annotation-icon img{width:100%;height:100%;object-fit:contain;display:block;filter:drop-shadow(0 2px 4px rgba(0,0,0,.3))}.panorama-annotation-text{max-width:200px;text-align:center;line-height:1.4}.panorama-annotation-link{transition:background-color .2s ease,transform .2s ease}.panorama-annotation-link:hover{z-index:1002}.panorama-annotation-link img{display:block;flex-shrink:0}.panorama-annotation.hidden{display:none!important}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.panorama-annotation.loading{animation:pulse 1.5s ease-in-out infinite}@media(max-width:768px){.panorama-annotation-icon{width:32px;height:32px}.panorama-annotation-text,.panorama-annotation-link{font-size:12px!important;padding:6px 10px!important}}
package/dist/index.d.ts CHANGED
@@ -509,10 +509,14 @@ declare class Clipping {
509
509
  sectionBox: any;
510
510
  sectionFace: any;
511
511
  clippingStencil: any;
512
+ clippingCSGSimple: ClippingCSGOptimizedSimple | null;
512
513
  currentClippingMode: string;
514
+ fillCutFace: boolean;
513
515
  constructor(engine: any);
514
516
  init(): void;
515
517
  scaleBox(): void;
518
+ setFillCutFace(b: boolean): void;
519
+ getFillCutFace(): boolean;
516
520
  clippingModel(models: any): void;
517
521
  updateClippingValue(value: any): void;
518
522
  active(type: string): void;
@@ -543,6 +547,141 @@ declare class Clipping {
543
547
  }): void;
544
548
  }
545
549
 
550
+ /**
551
+ * ClippingCSGOptimizedSimple
552
+ *
553
+ * 作用:
554
+ * 1. 根据剖切平面,计算模型与“薄片平面体”的 CSG 相交结果。
555
+ * 2. 从相交结果中提取贴近平面的帽面三角形(cap)。
556
+ * 3. 合并 cap 几何并加入场景,作为剖切补面。
557
+ *
558
+ * 设计要点:
559
+ * - 先粗筛(octree box / mesh box),再做重计算(CSG),避免全量布尔运算。
560
+ * - 对补面做极小偏移,避免补面材质本身也挂 clippingPlanes 时被同平面裁掉。
561
+ * - 每次更新前先 clear,保证场景中只存在当前补面。
562
+ */
563
+ declare class ClippingCSGOptimizedSimple {
564
+ /** 引擎实例(包含 scene / models / engineStatus / octreeBox 等) */
565
+ private engine;
566
+ /** three-bvh-csg 计算器,负责执行布尔操作 */
567
+ private readonly evaluator;
568
+ /** 场景中补面 Mesh 的统一名前缀 */
569
+ private readonly fillMeshName;
570
+ /**
571
+ * 当前生成的补面集合。
572
+ * key:平面唯一键(face 或 plane-i-name)
573
+ * value:对应补面 Mesh
574
+ */
575
+ private readonly fillMeshes;
576
+ /** 单次最多参与 CSG 的候选 Mesh 数量(保护性能) */
577
+ private readonly maxCandidates;
578
+ /** 单个 mesh 最大三角面阈值(过大直接跳过,保护实时交互) */
579
+ private readonly maxTriangleCountPerMesh;
580
+ /** 补面统一材质(由你在构造器中挂了 clippingPlanes) */
581
+ private fillMaterial;
582
+ private readonly fillTextureRepeat;
583
+ private readonly fillTextureRotation;
584
+ constructor(engine: any);
585
+ /**
586
+ * 清理当前所有补面。
587
+ * - 从 scene 移除 mesh
588
+ * - 释放 geometry / material 资源
589
+ */
590
+ clear(): void;
591
+ /**
592
+ * 单平面补面入口(face/x/y/z 模式可用)。
593
+ * 每次调用先 clear,再构建当前平面的补面。
594
+ */
595
+ updataFace(plane: any): void;
596
+ /**
597
+ * 多平面补面入口(box 模式可用)。
598
+ * 约定:传入的每个合法平面都分别生成一份补面。
599
+ */
600
+ updataFaces(planes: any[]): void;
601
+ /**
602
+ * 构建某一个平面的补面。
603
+ *
604
+ * 主流程:
605
+ * 1) 拿场景包围盒,确定平面体尺寸。
606
+ * 2) 基于 octree 与 plane 相交,筛候选 mesh。
607
+ * 3) 再按 mesh world box 与复杂度做二次筛选。
608
+ * 4) 对每个候选 mesh 执行 CSG INTERSECTION。
609
+ * 5) 从交集几何中提取贴近平面的 cap 三角形。
610
+ * 6) 合并 cap,做轻微偏移,创建补面 mesh。
611
+ */
612
+ private buildSinglePlaneFill;
613
+ /**
614
+ * 获取补面偏移距离。
615
+ * - 可通过 engine.engineStatus.clippingFaceOffset 覆盖
616
+ * - 默认按模型尺度自适应并带最小值
617
+ */
618
+ private getFaceOffsetDistance;
619
+ /**
620
+ * 获取补面偏移方向。
621
+ * - 可通过 engine.engineStatus.clippingFaceOffsetSign 指定(1/-1)
622
+ * - 默认 -1,即沿 -normal 方向偏移
623
+ */
624
+ private getFaceOffsetSign;
625
+ /**
626
+ * 使用 octree + plane 相交快速收集候选 mesh。
627
+ *
628
+ * 过程:
629
+ * - 遍历 engineStatus.models -> lod.octreeBox
630
+ * - 只取与 plane 相交的 octree 节点元素 id
631
+ * - 跳过隐藏/半透明/实例化节点
632
+ * - 收集节点 infos 里的 mesh,并按 uuid 去重
633
+ */
634
+ private collectCandidateMeshesFromOctree;
635
+ /**
636
+ * 收集当前 model url 下需要忽略的元素 id(隐藏 + 半透明)。
637
+ */
638
+ private getIgnoredIds;
639
+ /**
640
+ * 深度遍历 octree,返回与 plane 相交节点中的 element id 集合。
641
+ */
642
+ private collectIntersectElementIds;
643
+ /**
644
+ * 将引擎 octree 节点坐标转换为 three.js 的 Box3(含单位/坐标系转换)。
645
+ */
646
+ private octreeNodeToBox3;
647
+ /**
648
+ * 候选 mesh 二次筛选:
649
+ * - 必须存在有效 position
650
+ * - 三角面数不能超过阈值
651
+ * - world bbox 必须与 plane 相交
652
+ */
653
+ private filterMeshesByBoxAndComplexity;
654
+ /**
655
+ * 构造“薄片平面体” Brush:
656
+ * - 几何为 BoxGeometry(size, size, thickness)
657
+ * - 旋转到 plane.normal
658
+ * - 平移到 plane 上
659
+ */
660
+ private createPlaneBrush;
661
+ /**
662
+ * 将场景 mesh 转为世界坐标 Brush。
663
+ */
664
+ private createWorldBrushFromMesh;
665
+ /**
666
+ * 统一 CSG 输入属性,避免属性不一致报错(例如 uv 缺失)。
667
+ * 目标属性固定为:position / normal / uv
668
+ */
669
+ private toCsgReadyGeometry;
670
+ /**
671
+ * 从 CSG 相交结果中提取补面三角形。
672
+ *
673
+ * 判定条件:
674
+ * - 三角形法线与 plane.normal 足够平行(|dot| >= 0.9)
675
+ * - 三角形顶点到平面的距离 spread 足够小
676
+ * - 三角形平均距离落在薄片附近,且位于有效侧
677
+ *
678
+ * 提取后将三角形顶点投影回 plane,保证补面共面。
679
+ */
680
+ private extractPlaneCapGeometry;
681
+ private applyPlanarUv;
682
+ private getPlaneBasis;
683
+ }
684
+
546
685
  declare class ComposerModule {
547
686
  private engine;
548
687
  composer: any;
@@ -1431,11 +1570,11 @@ declare class EngineModelModule {
1431
1570
  /**
1432
1571
  * 设置输出 Pass 开关
1433
1572
  */
1434
- private setOutputPass;
1573
+ setOutputPass(enabled: boolean): void;
1435
1574
  /**
1436
1575
  * 设置 FXAA Pass 开关
1437
1576
  */
1438
- private setFXAA;
1577
+ setFXAA(enabled: boolean): void;
1439
1578
  /**
1440
1579
  * 设置性能模式
1441
1580
  */
@@ -2588,8 +2727,15 @@ declare class MiniMap {
2588
2727
  private miniMapContainer;
2589
2728
  private overlayCanvas;
2590
2729
  private overlayCtx;
2730
+ private levelToolbar;
2731
+ private modelSelect;
2732
+ private levelSelect;
2733
+ private levelModels;
2734
+ private levelDataSignature;
2735
+ private selectedModelUrl;
2591
2736
  private isVisible;
2592
2737
  private readonly mapSize;
2738
+ private readonly levelJumpEyeOffset;
2593
2739
  private currentHalfSize;
2594
2740
  private readonly minHalfSize;
2595
2741
  private readonly maxHalfSize;
@@ -2600,33 +2746,33 @@ declare class MiniMap {
2600
2746
  private dragMode;
2601
2747
  private lastMouseX;
2602
2748
  private lastMouseY;
2749
+ private readonly loadingCompletedEventName;
2750
+ private readonly onLoadingCompleted;
2603
2751
  constructor(engine: any);
2604
2752
  getstate(): boolean;
2605
2753
  private init;
2606
- /**
2607
- * 世界坐标 XZ → 小地图像素坐标
2608
- * 小地图 up=(0,0,-1):-Z 朝屏幕上方,+X 朝屏幕右方
2609
- */
2754
+ private initLevelSelectors;
2755
+ private createSelectElement;
2756
+ private bindControlEventBlock;
2757
+ private readonly onModelChange;
2758
+ private readonly onLevelChange;
2759
+ private refreshLevelSelectors;
2760
+ private pickSelectedModelUrl;
2761
+ private fillModelSelect;
2762
+ private refreshLevelOptionsByModel;
2763
+ private jumpToElevation;
2764
+ private collectModelLevels;
2765
+ private normalizeLevelData;
2766
+ private getModelDisplayName;
2767
+ private buildLevelSignature;
2610
2768
  private worldToPixel;
2611
- /** 小地图像素坐标 → 世界坐标 XZ */
2612
2769
  private pixelToWorld;
2613
2770
  private setupEvents;
2614
- /** 滚轮缩放小地图视野 */
2615
2771
  private readonly onWheel;
2616
- /**
2617
- * 点击指示器(中心 25px 范围)→ 进入旋转拖拽模式
2618
- * 点击其他位置 → 计算世界坐标,直接将相机传送过去
2619
- */
2620
2772
  private readonly onMouseDown;
2621
2773
  private readonly onMouseMove;
2622
2774
  private readonly onMouseUp;
2623
- /**
2624
- * 传送:点击小地图空白区域 → 计算世界坐标,将相机和 target 平移过去
2625
- */
2626
2775
  private handleTeleport;
2627
- /**
2628
- * 旋转:拖动指示器尖端 → 绕 controls.target 旋转主相机水平轨道角
2629
- */
2630
2776
  private handleRotate;
2631
2777
  private drawOverlay;
2632
2778
  show(): void;
@@ -3653,46 +3799,86 @@ declare interface SearchResult {
3653
3799
  description?: string;
3654
3800
  }
3655
3801
 
3802
+ /** 引擎设置管理器,负责渲染、显示和环境参数的统一管理 */
3656
3803
  declare class Setting {
3804
+ /** 引擎实例引用 */
3657
3805
  private engine;
3806
+ /** 当前生效的设置项 */
3658
3807
  private settings;
3808
+ /** 环境设置的应用版本号,用于防止异步操作的竞态条件 */
3659
3809
  private environmentApplyVersion;
3660
3810
  constructor(engine: any);
3811
+ /** 初始化(当前为空实现) */
3661
3812
  init(): void;
3813
+ /** 获取当前设置的深拷贝 */
3662
3814
  getSettings(): EngineSettings;
3815
+ /** 获取地面、HDR、天空的预设列表 */
3663
3816
  getPresetLists(): {
3664
3817
  ground: SettingPresetItem[];
3665
3818
  hdr: SettingPresetItem[];
3666
3819
  sky: SettingPresetItem[];
3667
3820
  };
3821
+ /** 批量更新设置(支持部分更新) */
3668
3822
  setSettings(data: Partial<EngineSettings>): Promise<void>;
3823
+ /** 重置所有设置为默认值 */
3669
3824
  resetToDefault(): Promise<void>;
3825
+ /** 设置渲染模式(simple: 简易, balance: 均衡, advanced: 高级) */
3670
3826
  setRenderMode(mode: RenderMode): void;
3827
+ /** 设置对比度(0~100) */
3671
3828
  setContrast(value: number): void;
3829
+ /** 设置饱和度(0~100) */
3672
3830
  setSaturation(value: number): void;
3831
+ /** 设置阴影强度(0~100) */
3673
3832
  setShadowIntensity(value: number): void;
3833
+ /** 设置光照强度(0~100),调整环境光亮度 */
3674
3834
  setLightIntensity(value: number): void;
3835
+ /** 设置 GTAO(屏幕空间环境光遮蔽)强度(0~100) */
3675
3836
  setGTAOIntensity(value: number): void;
3837
+ /** 设置是否显示模型边缘线 */
3676
3838
  setShowEdge(show: boolean): void;
3839
+ /** 设置边缘线透明度(0~100) */
3677
3840
  setEdgeOpacity(value: number): void;
3841
+ /** 设置是否显示网格 */
3678
3842
  setShowGrid(show: boolean): void;
3843
+ /** 设置是否显示楼层 */
3679
3844
  setShowLevel(show: boolean): void;
3845
+ /** 设置是否显示地面 */
3680
3846
  setShowGround(show: boolean): void;
3847
+ /** 设置当前使用的地面 ID */
3681
3848
  setGroundId(id: string): void;
3849
+ /** 设置地面高度 */
3682
3850
  setGroundHeight(height: number): void;
3851
+ /** 设置环境类型(none: 无, hdr: HDR贴图, sky: 天空) */
3683
3852
  setEnvironmentType(type: EnvironmentType): Promise<void>;
3853
+ /** 设置 HDR 贴图 ID,当前环境为 hdr 时立即生效 */
3684
3854
  setHdrId(id: string): Promise<void>;
3855
+ /** 设置 HDR 强度(0~100),仅在 hdr 模式下生效 */
3685
3856
  setHdrIntensity(value: number): void;
3857
+ /** 设置天空预设方案,当前环境为 sky 时立即生效 */
3686
3858
  setSkyPreset(preset: SkyPresetName): void;
3859
+ /** 设置天空自定义参数,当前环境为 sky 时立即生效 */
3687
3860
  setSkyParams(params: SkyParams): void;
3861
+ /** 设置天空亮度(0~100),仅在 sky 模式下生效 */
3688
3862
  setSkyIntensity(value: number): void;
3863
+ /** 直接设置场景中环境光的强度 */
3689
3864
  setAmbientLightIntensity(intensity: number): void;
3865
+ /** 一次性应用所有渲染设置 */
3690
3866
  private _applyRenderSettings;
3867
+ /** 一次性应用所有显示设置 */
3691
3868
  private _applyDisplaySettings;
3869
+ /**
3870
+ * 应用环境设置。
3871
+ * 先关闭当前 HDR 和天空,再根据类型重新启用。
3872
+ * 使用版本号机制防止多次异步调用之间的竞态条件。
3873
+ */
3692
3874
  private _applyEnvironmentSettings;
3875
+ /** 在场景中查找平行光并执行回调操作 */
3693
3876
  private _updateDirectionalLight;
3877
+ /** 合并环境设置,处理 skyPreset 与 skyParams 的联动关系 */
3694
3878
  private _mergeEnvironmentSettings;
3879
+ /** 将原始数据转换为标准预设项 */
3695
3880
  private _toPresetItem;
3881
+ /** 深拷贝工具方法 */
3696
3882
  private _clone;
3697
3883
  }
3698
3884
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iflow-engine-base",
3
- "version": "3.4.12",
3
+ "version": "3.5.0",
4
4
  "description": "BIM Engine SDK for Vue2, Vue3, React and HTML",
5
5
  "main": "./dist/bim-engine-sdk.umd.js",
6
6
  "module": "./dist/bim-engine-sdk.es.js",