iflow-engine-base 3.9.204 → 3.9.205

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.
Files changed (406) hide show
  1. package/dist/bim-engine-sdk.es.js +7 -7
  2. package/dist/bim-engine-sdk.umd.js +61 -61
  3. package/dist/chunks/{engine-2d-FTvtmsww.js → engine-2d-DAiE1uAy.js} +3 -3
  4. package/dist/chunks/{engine-3d-CJwFNQj9.js → engine-3d-CdsLfd0i.js} +3 -3
  5. package/dist/chunks/{engine-720-DcbdciJn.js → engine-720-K9uF9wMA.js} +2 -2
  6. package/dist/chunks/{engine-gaussian-CSZcRBxh.js → engine-gaussian-x3jsCp15.js} +2 -2
  7. package/dist/chunks/{engine-gis-ocpyW-vf.js → engine-gis-BStgPU0Q.js} +6131 -6132
  8. package/dist/chunks/{sdk-assets-F7qFhuao.js → sdk-assets-1SXx8Tbf.js} +1 -1
  9. package/dist/chunks/{sdk-runtime-a0W8NqlU.js → sdk-runtime-cY1Wn7o-.js} +2 -2
  10. package/dist2d/dwg-preview.es.js +2 -2
  11. package/dist2d/dwg-preview.umd.js +2 -2
  12. package/distGaussian/gaussian.es.js +1 -1
  13. package/distGaussian/gaussian.umd.js +1 -1
  14. package/package.json +1 -1
  15. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_0.json +0 -1
  16. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_1.json +0 -1
  17. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_10.json +0 -1
  18. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_11.json +0 -1
  19. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_12.json +0 -1
  20. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_13.json +0 -1
  21. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_14.json +0 -1
  22. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_15.json +0 -1
  23. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_16.json +0 -1
  24. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_17.json +0 -1
  25. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_18.json +0 -1
  26. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_19.json +0 -1
  27. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_2.json +0 -1
  28. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_20.json +0 -1
  29. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_21.json +0 -1
  30. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_22.json +0 -1
  31. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_23.json +0 -1
  32. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_24.json +0 -1
  33. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_25.json +0 -1
  34. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_26.json +0 -1
  35. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_27.json +0 -1
  36. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_3.json +0 -1
  37. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_4.json +0 -1
  38. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_5.json +0 -1
  39. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_6.json +0 -1
  40. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_7.json +0 -1
  41. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_8.json +0 -1
  42. package/dist/Cesium/Assets/IAU2006_XYS/IAU2006_XYS_9.json +0 -1
  43. package/dist/Cesium/Assets/Images/bing_maps_credit.png +0 -0
  44. package/dist/Cesium/Assets/Images/cesium_credit.png +0 -0
  45. package/dist/Cesium/Assets/Images/google_earth_credit.png +0 -0
  46. package/dist/Cesium/Assets/Images/ion-credit.png +0 -0
  47. package/dist/Cesium/Assets/Textures/LensFlare/DirtMask.jpg +0 -0
  48. package/dist/Cesium/Assets/Textures/LensFlare/StarBurst.jpg +0 -0
  49. package/dist/Cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg +0 -0
  50. package/dist/Cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg +0 -0
  51. package/dist/Cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg +0 -0
  52. package/dist/Cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg +0 -0
  53. package/dist/Cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg +0 -0
  54. package/dist/Cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg +0 -0
  55. package/dist/Cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg +0 -0
  56. package/dist/Cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg +0 -0
  57. package/dist/Cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg +0 -0
  58. package/dist/Cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg +0 -0
  59. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg +0 -0
  60. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg +0 -0
  61. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg +0 -0
  62. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg +0 -0
  63. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg +0 -0
  64. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg +0 -0
  65. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg +0 -0
  66. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg +0 -0
  67. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg +0 -0
  68. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg +0 -0
  69. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg +0 -0
  70. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg +0 -0
  71. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg +0 -0
  72. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg +0 -0
  73. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg +0 -0
  74. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg +0 -0
  75. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg +0 -0
  76. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg +0 -0
  77. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg +0 -0
  78. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg +0 -0
  79. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg +0 -0
  80. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg +0 -0
  81. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg +0 -0
  82. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg +0 -0
  83. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg +0 -0
  84. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg +0 -0
  85. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg +0 -0
  86. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg +0 -0
  87. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg +0 -0
  88. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg +0 -0
  89. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg +0 -0
  90. package/dist/Cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg +0 -0
  91. package/dist/Cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml +0 -14
  92. package/dist/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
  93. package/dist/Cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
  94. package/dist/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
  95. package/dist/Cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
  96. package/dist/Cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
  97. package/dist/Cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
  98. package/dist/Cesium/Assets/Textures/maki/airfield.png +0 -0
  99. package/dist/Cesium/Assets/Textures/maki/airport.png +0 -0
  100. package/dist/Cesium/Assets/Textures/maki/alcohol-shop.png +0 -0
  101. package/dist/Cesium/Assets/Textures/maki/america-football.png +0 -0
  102. package/dist/Cesium/Assets/Textures/maki/art-gallery.png +0 -0
  103. package/dist/Cesium/Assets/Textures/maki/bakery.png +0 -0
  104. package/dist/Cesium/Assets/Textures/maki/bank.png +0 -0
  105. package/dist/Cesium/Assets/Textures/maki/bar.png +0 -0
  106. package/dist/Cesium/Assets/Textures/maki/baseball.png +0 -0
  107. package/dist/Cesium/Assets/Textures/maki/basketball.png +0 -0
  108. package/dist/Cesium/Assets/Textures/maki/beer.png +0 -0
  109. package/dist/Cesium/Assets/Textures/maki/bicycle.png +0 -0
  110. package/dist/Cesium/Assets/Textures/maki/building.png +0 -0
  111. package/dist/Cesium/Assets/Textures/maki/bus.png +0 -0
  112. package/dist/Cesium/Assets/Textures/maki/cafe.png +0 -0
  113. package/dist/Cesium/Assets/Textures/maki/camera.png +0 -0
  114. package/dist/Cesium/Assets/Textures/maki/campsite.png +0 -0
  115. package/dist/Cesium/Assets/Textures/maki/car.png +0 -0
  116. package/dist/Cesium/Assets/Textures/maki/cemetery.png +0 -0
  117. package/dist/Cesium/Assets/Textures/maki/cesium.png +0 -0
  118. package/dist/Cesium/Assets/Textures/maki/chemist.png +0 -0
  119. package/dist/Cesium/Assets/Textures/maki/cinema.png +0 -0
  120. package/dist/Cesium/Assets/Textures/maki/circle-stroked.png +0 -0
  121. package/dist/Cesium/Assets/Textures/maki/circle.png +0 -0
  122. package/dist/Cesium/Assets/Textures/maki/city.png +0 -0
  123. package/dist/Cesium/Assets/Textures/maki/clothing-store.png +0 -0
  124. package/dist/Cesium/Assets/Textures/maki/college.png +0 -0
  125. package/dist/Cesium/Assets/Textures/maki/commercial.png +0 -0
  126. package/dist/Cesium/Assets/Textures/maki/cricket.png +0 -0
  127. package/dist/Cesium/Assets/Textures/maki/cross.png +0 -0
  128. package/dist/Cesium/Assets/Textures/maki/dam.png +0 -0
  129. package/dist/Cesium/Assets/Textures/maki/danger.png +0 -0
  130. package/dist/Cesium/Assets/Textures/maki/disability.png +0 -0
  131. package/dist/Cesium/Assets/Textures/maki/dog-park.png +0 -0
  132. package/dist/Cesium/Assets/Textures/maki/embassy.png +0 -0
  133. package/dist/Cesium/Assets/Textures/maki/emergency-telephone.png +0 -0
  134. package/dist/Cesium/Assets/Textures/maki/entrance.png +0 -0
  135. package/dist/Cesium/Assets/Textures/maki/farm.png +0 -0
  136. package/dist/Cesium/Assets/Textures/maki/fast-food.png +0 -0
  137. package/dist/Cesium/Assets/Textures/maki/ferry.png +0 -0
  138. package/dist/Cesium/Assets/Textures/maki/fire-station.png +0 -0
  139. package/dist/Cesium/Assets/Textures/maki/fuel.png +0 -0
  140. package/dist/Cesium/Assets/Textures/maki/garden.png +0 -0
  141. package/dist/Cesium/Assets/Textures/maki/gift.png +0 -0
  142. package/dist/Cesium/Assets/Textures/maki/golf.png +0 -0
  143. package/dist/Cesium/Assets/Textures/maki/grocery.png +0 -0
  144. package/dist/Cesium/Assets/Textures/maki/hairdresser.png +0 -0
  145. package/dist/Cesium/Assets/Textures/maki/harbor.png +0 -0
  146. package/dist/Cesium/Assets/Textures/maki/heart.png +0 -0
  147. package/dist/Cesium/Assets/Textures/maki/heliport.png +0 -0
  148. package/dist/Cesium/Assets/Textures/maki/hospital.png +0 -0
  149. package/dist/Cesium/Assets/Textures/maki/ice-cream.png +0 -0
  150. package/dist/Cesium/Assets/Textures/maki/industrial.png +0 -0
  151. package/dist/Cesium/Assets/Textures/maki/land-use.png +0 -0
  152. package/dist/Cesium/Assets/Textures/maki/laundry.png +0 -0
  153. package/dist/Cesium/Assets/Textures/maki/library.png +0 -0
  154. package/dist/Cesium/Assets/Textures/maki/lighthouse.png +0 -0
  155. package/dist/Cesium/Assets/Textures/maki/lodging.png +0 -0
  156. package/dist/Cesium/Assets/Textures/maki/logging.png +0 -0
  157. package/dist/Cesium/Assets/Textures/maki/london-underground.png +0 -0
  158. package/dist/Cesium/Assets/Textures/maki/marker-stroked.png +0 -0
  159. package/dist/Cesium/Assets/Textures/maki/marker.png +0 -0
  160. package/dist/Cesium/Assets/Textures/maki/minefield.png +0 -0
  161. package/dist/Cesium/Assets/Textures/maki/mobilephone.png +0 -0
  162. package/dist/Cesium/Assets/Textures/maki/monument.png +0 -0
  163. package/dist/Cesium/Assets/Textures/maki/museum.png +0 -0
  164. package/dist/Cesium/Assets/Textures/maki/music.png +0 -0
  165. package/dist/Cesium/Assets/Textures/maki/oil-well.png +0 -0
  166. package/dist/Cesium/Assets/Textures/maki/park.png +0 -0
  167. package/dist/Cesium/Assets/Textures/maki/park2.png +0 -0
  168. package/dist/Cesium/Assets/Textures/maki/parking-garage.png +0 -0
  169. package/dist/Cesium/Assets/Textures/maki/parking.png +0 -0
  170. package/dist/Cesium/Assets/Textures/maki/pharmacy.png +0 -0
  171. package/dist/Cesium/Assets/Textures/maki/pitch.png +0 -0
  172. package/dist/Cesium/Assets/Textures/maki/place-of-worship.png +0 -0
  173. package/dist/Cesium/Assets/Textures/maki/playground.png +0 -0
  174. package/dist/Cesium/Assets/Textures/maki/police.png +0 -0
  175. package/dist/Cesium/Assets/Textures/maki/polling-place.png +0 -0
  176. package/dist/Cesium/Assets/Textures/maki/post.png +0 -0
  177. package/dist/Cesium/Assets/Textures/maki/prison.png +0 -0
  178. package/dist/Cesium/Assets/Textures/maki/rail-above.png +0 -0
  179. package/dist/Cesium/Assets/Textures/maki/rail-light.png +0 -0
  180. package/dist/Cesium/Assets/Textures/maki/rail-metro.png +0 -0
  181. package/dist/Cesium/Assets/Textures/maki/rail-underground.png +0 -0
  182. package/dist/Cesium/Assets/Textures/maki/rail.png +0 -0
  183. package/dist/Cesium/Assets/Textures/maki/religious-christian.png +0 -0
  184. package/dist/Cesium/Assets/Textures/maki/religious-jewish.png +0 -0
  185. package/dist/Cesium/Assets/Textures/maki/religious-muslim.png +0 -0
  186. package/dist/Cesium/Assets/Textures/maki/restaurant.png +0 -0
  187. package/dist/Cesium/Assets/Textures/maki/roadblock.png +0 -0
  188. package/dist/Cesium/Assets/Textures/maki/rocket.png +0 -0
  189. package/dist/Cesium/Assets/Textures/maki/school.png +0 -0
  190. package/dist/Cesium/Assets/Textures/maki/scooter.png +0 -0
  191. package/dist/Cesium/Assets/Textures/maki/shop.png +0 -0
  192. package/dist/Cesium/Assets/Textures/maki/skiing.png +0 -0
  193. package/dist/Cesium/Assets/Textures/maki/slaughterhouse.png +0 -0
  194. package/dist/Cesium/Assets/Textures/maki/soccer.png +0 -0
  195. package/dist/Cesium/Assets/Textures/maki/square-stroked.png +0 -0
  196. package/dist/Cesium/Assets/Textures/maki/square.png +0 -0
  197. package/dist/Cesium/Assets/Textures/maki/star-stroked.png +0 -0
  198. package/dist/Cesium/Assets/Textures/maki/star.png +0 -0
  199. package/dist/Cesium/Assets/Textures/maki/suitcase.png +0 -0
  200. package/dist/Cesium/Assets/Textures/maki/swimming.png +0 -0
  201. package/dist/Cesium/Assets/Textures/maki/telephone.png +0 -0
  202. package/dist/Cesium/Assets/Textures/maki/tennis.png +0 -0
  203. package/dist/Cesium/Assets/Textures/maki/theatre.png +0 -0
  204. package/dist/Cesium/Assets/Textures/maki/toilets.png +0 -0
  205. package/dist/Cesium/Assets/Textures/maki/town-hall.png +0 -0
  206. package/dist/Cesium/Assets/Textures/maki/town.png +0 -0
  207. package/dist/Cesium/Assets/Textures/maki/triangle-stroked.png +0 -0
  208. package/dist/Cesium/Assets/Textures/maki/triangle.png +0 -0
  209. package/dist/Cesium/Assets/Textures/maki/village.png +0 -0
  210. package/dist/Cesium/Assets/Textures/maki/warehouse.png +0 -0
  211. package/dist/Cesium/Assets/Textures/maki/waste-basket.png +0 -0
  212. package/dist/Cesium/Assets/Textures/maki/water.png +0 -0
  213. package/dist/Cesium/Assets/Textures/maki/wetland.png +0 -0
  214. package/dist/Cesium/Assets/Textures/maki/zoo.png +0 -0
  215. package/dist/Cesium/Assets/Textures/moonSmall.jpg +0 -0
  216. package/dist/Cesium/Assets/Textures/pin.svg +0 -1
  217. package/dist/Cesium/Assets/Textures/waterNormals.jpg +0 -0
  218. package/dist/Cesium/Assets/Textures/waterNormalsSmall.jpg +0 -0
  219. package/dist/Cesium/Assets/approximateTerrainHeights.json +0 -1
  220. package/dist/Cesium/Cesium.js +0 -18008
  221. package/dist/Cesium/ThirdParty/Workers/package.json +0 -1
  222. package/dist/Cesium/ThirdParty/Workers/zip-web-worker.js +0 -1
  223. package/dist/Cesium/ThirdParty/basis_transcoder.wasm +0 -0
  224. package/dist/Cesium/ThirdParty/draco_decoder.wasm +0 -0
  225. package/dist/Cesium/ThirdParty/google-earth-dbroot-parser.js +0 -1
  226. package/dist/Cesium/ThirdParty/wasm_splats_bg.wasm +0 -0
  227. package/dist/Cesium/ThirdParty/zip-module.wasm +0 -0
  228. package/dist/Cesium/Widgets/Animation/Animation.css +0 -127
  229. package/dist/Cesium/Widgets/Animation/lighter.css +0 -70
  230. package/dist/Cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css +0 -108
  231. package/dist/Cesium/Widgets/BaseLayerPicker/lighter.css +0 -22
  232. package/dist/Cesium/Widgets/Cesium3DTilesInspector/Cesium3DTilesInspector.css +0 -102
  233. package/dist/Cesium/Widgets/CesiumInspector/CesiumInspector.css +0 -113
  234. package/dist/Cesium/Widgets/CesiumWidget/CesiumWidget.css +0 -119
  235. package/dist/Cesium/Widgets/CesiumWidget/lighter.css +0 -14
  236. package/dist/Cesium/Widgets/FullscreenButton/FullscreenButton.css +0 -8
  237. package/dist/Cesium/Widgets/Geocoder/Geocoder.css +0 -70
  238. package/dist/Cesium/Widgets/Geocoder/lighter.css +0 -17
  239. package/dist/Cesium/Widgets/I3SBuildingSceneLayerExplorer/I3SBuildingSceneLayerExplorer.css +0 -27
  240. package/dist/Cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldHillshade.png +0 -0
  241. package/dist/Cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldImagery.png +0 -0
  242. package/dist/Cesium/Widgets/Images/ImageryProviders/ArcGisMapServiceWorldOcean.png +0 -0
  243. package/dist/Cesium/Widgets/Images/ImageryProviders/azureAerial.png +0 -0
  244. package/dist/Cesium/Widgets/Images/ImageryProviders/azureRoads.png +0 -0
  245. package/dist/Cesium/Widgets/Images/ImageryProviders/bingAerial.png +0 -0
  246. package/dist/Cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png +0 -0
  247. package/dist/Cesium/Widgets/Images/ImageryProviders/bingRoads.png +0 -0
  248. package/dist/Cesium/Widgets/Images/ImageryProviders/blueMarble.png +0 -0
  249. package/dist/Cesium/Widgets/Images/ImageryProviders/earthAtNight.png +0 -0
  250. package/dist/Cesium/Widgets/Images/ImageryProviders/googleContour.png +0 -0
  251. package/dist/Cesium/Widgets/Images/ImageryProviders/googleRoadmap.png +0 -0
  252. package/dist/Cesium/Widgets/Images/ImageryProviders/googleSatellite.png +0 -0
  253. package/dist/Cesium/Widgets/Images/ImageryProviders/googleSatelliteLabels.png +0 -0
  254. package/dist/Cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png +0 -0
  255. package/dist/Cesium/Widgets/Images/ImageryProviders/mapboxSatellite.png +0 -0
  256. package/dist/Cesium/Widgets/Images/ImageryProviders/mapboxStreets.png +0 -0
  257. package/dist/Cesium/Widgets/Images/ImageryProviders/mapboxTerrain.png +0 -0
  258. package/dist/Cesium/Widgets/Images/ImageryProviders/naturalEarthII.png +0 -0
  259. package/dist/Cesium/Widgets/Images/ImageryProviders/openStreetMap.png +0 -0
  260. package/dist/Cesium/Widgets/Images/ImageryProviders/sentinel-2.png +0 -0
  261. package/dist/Cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmooth.png +0 -0
  262. package/dist/Cesium/Widgets/Images/ImageryProviders/stadiaAlidadeSmoothDark.png +0 -0
  263. package/dist/Cesium/Widgets/Images/ImageryProviders/stamenToner.png +0 -0
  264. package/dist/Cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png +0 -0
  265. package/dist/Cesium/Widgets/Images/NavigationHelp/Mouse.svg +0 -84
  266. package/dist/Cesium/Widgets/Images/NavigationHelp/MouseLeft.svg +0 -76
  267. package/dist/Cesium/Widgets/Images/NavigationHelp/MouseMiddle.svg +0 -76
  268. package/dist/Cesium/Widgets/Images/NavigationHelp/MouseRight.svg +0 -76
  269. package/dist/Cesium/Widgets/Images/NavigationHelp/Touch.svg +0 -120
  270. package/dist/Cesium/Widgets/Images/NavigationHelp/TouchDrag.svg +0 -129
  271. package/dist/Cesium/Widgets/Images/NavigationHelp/TouchRotate.svg +0 -76
  272. package/dist/Cesium/Widgets/Images/NavigationHelp/TouchTilt.svg +0 -135
  273. package/dist/Cesium/Widgets/Images/NavigationHelp/TouchZoom.svg +0 -74
  274. package/dist/Cesium/Widgets/Images/TerrainProviders/CesiumWorldTerrain.png +0 -0
  275. package/dist/Cesium/Widgets/Images/TerrainProviders/Ellipsoid.png +0 -0
  276. package/dist/Cesium/Widgets/Images/TimelineIcons.png +0 -0
  277. package/dist/Cesium/Widgets/Images/info-loading.gif +0 -0
  278. package/dist/Cesium/Widgets/InfoBox/InfoBox.css +0 -92
  279. package/dist/Cesium/Widgets/InfoBox/InfoBoxDescription.css +0 -178
  280. package/dist/Cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css +0 -93
  281. package/dist/Cesium/Widgets/NavigationHelpButton/lighter.css +0 -38
  282. package/dist/Cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css +0 -15
  283. package/dist/Cesium/Widgets/ProjectionPicker/ProjectionPicker.css +0 -38
  284. package/dist/Cesium/Widgets/SceneModePicker/SceneModePicker.css +0 -56
  285. package/dist/Cesium/Widgets/SelectionIndicator/SelectionIndicator.css +0 -20
  286. package/dist/Cesium/Widgets/Timeline/Timeline.css +0 -103
  287. package/dist/Cesium/Widgets/Timeline/lighter.css +0 -23
  288. package/dist/Cesium/Widgets/VRButton/VRButton.css +0 -8
  289. package/dist/Cesium/Widgets/Viewer/Viewer.css +0 -107
  290. package/dist/Cesium/Widgets/VoxelInspector/VoxelInspector.css +0 -16
  291. package/dist/Cesium/Widgets/lighter.css +0 -237
  292. package/dist/Cesium/Widgets/lighterShared.css +0 -46
  293. package/dist/Cesium/Widgets/shared.css +0 -103
  294. package/dist/Cesium/Widgets/widgets.css +0 -1342
  295. package/dist/Cesium/Workers/chunk-35LM35A5.js +0 -26
  296. package/dist/Cesium/Workers/chunk-3R3BCVRR.js +0 -26
  297. package/dist/Cesium/Workers/chunk-44VKZ44M.js +0 -26
  298. package/dist/Cesium/Workers/chunk-4LOVZYQ2.js +0 -26
  299. package/dist/Cesium/Workers/chunk-55KTRCCC.js +0 -29
  300. package/dist/Cesium/Workers/chunk-5AJUPXGZ.js +0 -26
  301. package/dist/Cesium/Workers/chunk-5EEMCPIO.js +0 -26
  302. package/dist/Cesium/Workers/chunk-5HZ2G332.js +0 -26
  303. package/dist/Cesium/Workers/chunk-6K4BWAPV.js +0 -26
  304. package/dist/Cesium/Workers/chunk-6LZUEMFX.js +0 -26
  305. package/dist/Cesium/Workers/chunk-6NPJZ3PS.js +0 -26
  306. package/dist/Cesium/Workers/chunk-A3K5FM7E.js +0 -26
  307. package/dist/Cesium/Workers/chunk-AP7AMWJA.js +0 -26
  308. package/dist/Cesium/Workers/chunk-AZCCS55A.js +0 -63
  309. package/dist/Cesium/Workers/chunk-BXPFAIYZ.js +0 -26
  310. package/dist/Cesium/Workers/chunk-C4NHPSO2.js +0 -26
  311. package/dist/Cesium/Workers/chunk-CJGWLCOV.js +0 -26
  312. package/dist/Cesium/Workers/chunk-E4MSZ45D.js +0 -26
  313. package/dist/Cesium/Workers/chunk-FCRW2AGG.js +0 -28
  314. package/dist/Cesium/Workers/chunk-FMWRN5G2.js +0 -26
  315. package/dist/Cesium/Workers/chunk-FXWI4VL7.js +0 -26
  316. package/dist/Cesium/Workers/chunk-FYQCPFNB.js +0 -26
  317. package/dist/Cesium/Workers/chunk-G46AR6KP.js +0 -26
  318. package/dist/Cesium/Workers/chunk-GS4ZGDWD.js +0 -26
  319. package/dist/Cesium/Workers/chunk-GZABERXA.js +0 -26
  320. package/dist/Cesium/Workers/chunk-H6AHPUMX.js +0 -26
  321. package/dist/Cesium/Workers/chunk-IPQQ2USK.js +0 -26
  322. package/dist/Cesium/Workers/chunk-ITSDUOWL.js +0 -26
  323. package/dist/Cesium/Workers/chunk-J6WO2HA5.js +0 -26
  324. package/dist/Cesium/Workers/chunk-K3YIAZU7.js +0 -26
  325. package/dist/Cesium/Workers/chunk-K72DPWBT.js +0 -26
  326. package/dist/Cesium/Workers/chunk-LKQXJXNV.js +0 -26
  327. package/dist/Cesium/Workers/chunk-LTHJTGXC.js +0 -26
  328. package/dist/Cesium/Workers/chunk-LUECBOIT.js +0 -26
  329. package/dist/Cesium/Workers/chunk-MUI5QV7K.js +0 -26
  330. package/dist/Cesium/Workers/chunk-OS2CBN2U.js +0 -26
  331. package/dist/Cesium/Workers/chunk-R5DFAOJG.js +0 -26
  332. package/dist/Cesium/Workers/chunk-R7QNYLFY.js +0 -26
  333. package/dist/Cesium/Workers/chunk-RH3WVPDR.js +0 -26
  334. package/dist/Cesium/Workers/chunk-RI3TXBVT.js +0 -26
  335. package/dist/Cesium/Workers/chunk-RU2T2U4O.js +0 -26
  336. package/dist/Cesium/Workers/chunk-SSYRCXAV.js +0 -26
  337. package/dist/Cesium/Workers/chunk-U4VWQPTS.js +0 -28
  338. package/dist/Cesium/Workers/chunk-UHTXIDKA.js +0 -26
  339. package/dist/Cesium/Workers/chunk-V74K6IQF.js +0 -29
  340. package/dist/Cesium/Workers/chunk-VELRZYUL.js +0 -26
  341. package/dist/Cesium/Workers/chunk-VXS2FTO4.js +0 -27
  342. package/dist/Cesium/Workers/chunk-VZ4ER5HI.js +0 -26
  343. package/dist/Cesium/Workers/chunk-WC7WZIXH.js +0 -26
  344. package/dist/Cesium/Workers/chunk-WM6AKY6B.js +0 -27
  345. package/dist/Cesium/Workers/chunk-WTIPXHS3.js +0 -26
  346. package/dist/Cesium/Workers/chunk-WZYIA4NB.js +0 -26
  347. package/dist/Cesium/Workers/chunk-XEBZTQHW.js +0 -26
  348. package/dist/Cesium/Workers/chunk-XFWEZBPW.js +0 -26
  349. package/dist/Cesium/Workers/chunk-YLWWFMFQ.js +0 -26
  350. package/dist/Cesium/Workers/chunk-YNBY2HFD.js +0 -26
  351. package/dist/Cesium/Workers/chunk-ZQTDDQLY.js +0 -26
  352. package/dist/Cesium/Workers/combineGeometry.js +0 -26
  353. package/dist/Cesium/Workers/createBoxGeometry.js +0 -26
  354. package/dist/Cesium/Workers/createBoxOutlineGeometry.js +0 -26
  355. package/dist/Cesium/Workers/createCircleGeometry.js +0 -26
  356. package/dist/Cesium/Workers/createCircleOutlineGeometry.js +0 -26
  357. package/dist/Cesium/Workers/createCoplanarPolygonGeometry.js +0 -26
  358. package/dist/Cesium/Workers/createCoplanarPolygonOutlineGeometry.js +0 -26
  359. package/dist/Cesium/Workers/createCorridorGeometry.js +0 -26
  360. package/dist/Cesium/Workers/createCorridorOutlineGeometry.js +0 -26
  361. package/dist/Cesium/Workers/createCylinderGeometry.js +0 -26
  362. package/dist/Cesium/Workers/createCylinderOutlineGeometry.js +0 -26
  363. package/dist/Cesium/Workers/createEllipseGeometry.js +0 -26
  364. package/dist/Cesium/Workers/createEllipseOutlineGeometry.js +0 -26
  365. package/dist/Cesium/Workers/createEllipsoidGeometry.js +0 -26
  366. package/dist/Cesium/Workers/createEllipsoidOutlineGeometry.js +0 -26
  367. package/dist/Cesium/Workers/createFrustumGeometry.js +0 -26
  368. package/dist/Cesium/Workers/createFrustumOutlineGeometry.js +0 -26
  369. package/dist/Cesium/Workers/createGeometry.js +0 -26
  370. package/dist/Cesium/Workers/createGroundPolylineGeometry.js +0 -26
  371. package/dist/Cesium/Workers/createPlaneGeometry.js +0 -26
  372. package/dist/Cesium/Workers/createPlaneOutlineGeometry.js +0 -26
  373. package/dist/Cesium/Workers/createPolygonGeometry.js +0 -26
  374. package/dist/Cesium/Workers/createPolygonOutlineGeometry.js +0 -26
  375. package/dist/Cesium/Workers/createPolylineGeometry.js +0 -26
  376. package/dist/Cesium/Workers/createPolylineVolumeGeometry.js +0 -26
  377. package/dist/Cesium/Workers/createPolylineVolumeOutlineGeometry.js +0 -26
  378. package/dist/Cesium/Workers/createRectangleGeometry.js +0 -26
  379. package/dist/Cesium/Workers/createRectangleOutlineGeometry.js +0 -26
  380. package/dist/Cesium/Workers/createSimplePolylineGeometry.js +0 -26
  381. package/dist/Cesium/Workers/createSphereGeometry.js +0 -26
  382. package/dist/Cesium/Workers/createSphereOutlineGeometry.js +0 -26
  383. package/dist/Cesium/Workers/createTaskProcessorWorker.js +0 -26
  384. package/dist/Cesium/Workers/createVectorTileClampedPolylines.js +0 -26
  385. package/dist/Cesium/Workers/createVectorTileGeometries.js +0 -26
  386. package/dist/Cesium/Workers/createVectorTilePoints.js +0 -26
  387. package/dist/Cesium/Workers/createVectorTilePolygons.js +0 -26
  388. package/dist/Cesium/Workers/createVectorTilePolylines.js +0 -26
  389. package/dist/Cesium/Workers/createVerticesFromCesium3DTilesTerrain.js +0 -26
  390. package/dist/Cesium/Workers/createVerticesFromGoogleEarthEnterpriseBuffer.js +0 -26
  391. package/dist/Cesium/Workers/createVerticesFromHeightmap.js +0 -26
  392. package/dist/Cesium/Workers/createVerticesFromQuantizedTerrainMesh.js +0 -26
  393. package/dist/Cesium/Workers/createWallGeometry.js +0 -26
  394. package/dist/Cesium/Workers/createWallOutlineGeometry.js +0 -26
  395. package/dist/Cesium/Workers/decodeDraco.js +0 -26
  396. package/dist/Cesium/Workers/decodeGoogleEarthEnterprisePacket.js +0 -26
  397. package/dist/Cesium/Workers/decodeI3S.js +0 -26
  398. package/dist/Cesium/Workers/gaussianSplatSorter.js +0 -26
  399. package/dist/Cesium/Workers/gaussianSplatTextureGenerator.js +0 -26
  400. package/dist/Cesium/Workers/incrementallyBuildTerrainPicker.js +0 -26
  401. package/dist/Cesium/Workers/transcodeKTX2.js +0 -56
  402. package/dist/Cesium/Workers/transferTypedArrayTest.js +0 -26
  403. package/dist/Cesium/Workers/upsampleQuantizedTerrainMesh.js +0 -26
  404. package/dist/Cesium/Workers/upsampleVerticesFromCesium3DTilesTerrain.js +0 -26
  405. package/dist/Cesium/index.cjs +0 -18008
  406. package/dist/Cesium/index.js +0 -18008
@@ -1,4 +1,4 @@
1
- const c = "__BIM_ENGINE_SDK_ASSET_BASE__", d = "https://unpkg.com/iflow-engine-base@3.9.16/dist/";
1
+ const c = "__BIM_ENGINE_SDK_ASSET_BASE__", d = "https://unpkg.com/iflow-engine-base@3.9.20/dist/";
2
2
  function l() {
3
3
  return typeof globalThis < "u" ? globalThis : null;
4
4
  }
@@ -1,6 +1,6 @@
1
1
  import { R as ra, b as Qe, V as lt, s as ta, aZ as na } from "./three-vendor-Dbcwwhki.js";
2
- import { J as rn, E as lr } from "./engine-2d-FTvtmsww.js";
3
- import { a as tn } from "./engine-3d-CJwFNQj9.js";
2
+ import { J as rn, E as lr } from "./engine-2d-DAiE1uAy.js";
3
+ import { a as tn } from "./engine-3d-CdsLfd0i.js";
4
4
  class il {
5
5
  /**
6
6
  * 构造函数
@@ -1487,7 +1487,7 @@ class ce {
1487
1487
  return i;
1488
1488
  }
1489
1489
  }
1490
- const Ht = "__BIM_ENGINE_SDK_ASSET_BASE__", Gt = "https://unpkg.com/iflow-engine-base@3.9.16/dist/";
1490
+ const Ht = "__BIM_ENGINE_SDK_ASSET_BASE__", Gt = "https://unpkg.com/iflow-engine-base@3.9.20/dist/";
1491
1491
  function $t() {
1492
1492
  return typeof globalThis < "u" ? globalThis : null;
1493
1493
  }
@@ -8987,7 +8987,7 @@ class Ui {
8987
8987
  this.unsubscribe(), this.el.remove();
8988
8988
  }
8989
8989
  }
8990
- const Wi = "3.9.204", Fi = {
8990
+ const Wi = "3.9.205", Fi = {
8991
8991
  version: Wi
8992
8992
  }, Ce = Fi.version;
8993
8993
  function Ye() {
@@ -62,7 +62,7 @@
62
62
  gl_FragColor = vec4(color, alpha);
63
63
  }
64
64
  `;class At{scene;camera;container;gridGroup;gridGeometry;gridMaterial;gridMesh;animationFrameId=null;resizeObserver;windowResizeHandler;lastState={zoom:-1,centerX:Number.NaN,centerY:Number.NaN,viewWidth:0,viewHeight:0,containerWidth:0,containerHeight:0,minorSpacing:0};largeGridColor=6052956;smallGridColor=3815994;desiredMinorPixelSize=28;coverageMultiplier=1.6;minSpacing=1e-4;minorThicknessPx=.4;majorThicknessPx=.6;minorLineOpacity=.05;majorLineOpacity=.2;baseRenderOrder=-20;gridZOffset=-.001;majorStep=5;gridUniforms={minorSpacing:{value:100},majorStep:{value:this.majorStep},worldPerPixel:{value:new _.Vector2(1,1)},minorThicknessPx:{value:this.minorThicknessPx},majorThicknessPx:{value:this.majorThicknessPx},minorColor:{value:new _.Color(this.smallGridColor)},majorColor:{value:new _.Color(this.largeGridColor)},minorOpacity:{value:this.minorLineOpacity},majorOpacity:{value:this.majorLineOpacity}};constructor(e,t,i){this.scene=e,this.camera=t,this.container=i,this.gridGroup=new _.Group,this.gridGroup.name="AdaptiveGridGroup",this.gridGroup.renderOrder=this.baseRenderOrder,this.gridGroup.visible=!0,this.gridGroup.position.set(0,0,this.gridZOffset),this.scene.add(this.gridGroup),this.createGridMesh(),this.updateGrid(!0),this.startMonitoring(),this.setupResizeObserver()}createGridMesh(){this.gridGeometry=new _.PlaneGeometry(1,1,1,1),this.gridMaterial=new _.ShaderMaterial({uniforms:this.gridUniforms,vertexShader:St,fragmentShader:Tt,transparent:!0,depthWrite:!1,depthTest:!1,side:_.DoubleSide,toneMapped:!1}),this.gridMesh=new _.Mesh(this.gridGeometry,this.gridMaterial),this.gridMesh.frustumCulled=!1,this.gridMesh.renderOrder=this.baseRenderOrder,this.gridGroup.add(this.gridMesh)}startMonitoring(){const e=()=>{this.updateGrid(),this.animationFrameId=requestAnimationFrame(e)};e()}stopMonitoring(){this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}setupResizeObserver(){typeof ResizeObserver<"u"?(this.resizeObserver=new ResizeObserver(()=>this.updateGrid(!0)),this.resizeObserver.observe(this.container)):(this.windowResizeHandler=()=>this.updateGrid(!0),window.addEventListener("resize",this.windowResizeHandler))}teardownResizeObserver(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=void 0),this.windowResizeHandler&&(window.removeEventListener("resize",this.windowResizeHandler),this.windowResizeHandler=void 0)}normalizeSpacing(e){const t=Math.max(e,this.minSpacing),i=Math.floor(Math.log10(t)),n=Math.pow(10,i),r=[1,2,5,10];for(const s of r){const o=s*n;if(t<=o)return o}return 10*n}updateGrid(e=!1){if(!this.gridMesh)return;const t=Math.max(1,this.container.clientWidth),i=Math.max(1,this.container.clientHeight),n=this.camera.zoom,r=this.camera.right-this.camera.left,s=this.camera.top-this.camera.bottom,o=Math.max(this.minSpacing,r/n),a=Math.max(this.minSpacing,s/n),l=this.camera.position.x,h=this.camera.position.y,f=o/t,p=a/i,d=f*this.desiredMinorPixelSize,y=this.normalizeSpacing(d),c=this.lastState;if(!e){const w=Math.abs(n-c.zoom)/Math.max(1e-4,c.zoom||1)>.02,M=Math.abs(y-c.minorSpacing)>c.minorSpacing*.05,S=Math.abs(l-c.centerX)>Math.max(y*.5,.01),E=Math.abs(h-c.centerY)>Math.max(y*.5,.01),R=Math.abs(o-c.viewWidth)>c.viewWidth*.01,D=Math.abs(a-c.viewHeight)>c.viewHeight*.01,j=t!==c.containerWidth||i!==c.containerHeight;if(!(w||M||S||E||R||D||j))return}const g=o*this.coverageMultiplier,v=a*this.coverageMultiplier;this.gridMesh.scale.set(g,v,1),this.gridMesh.position.set(l,h,0),this.gridUniforms.minorSpacing.value=y,this.gridUniforms.worldPerPixel.value.set(f,p),this.lastState={zoom:n,centerX:l,centerY:h,viewWidth:o,viewHeight:a,containerWidth:t,containerHeight:i,minorSpacing:y}}setVisible(e){this.gridGroup.visible=e}setColors(e,t){this.largeGridColor=e,this.smallGridColor=t,this.gridUniforms.majorColor.value.setHex(e),this.gridUniforms.minorColor.value.setHex(t)}setOpacity(e,t){this.minorLineOpacity=Math.max(0,Math.min(1,e)),this.majorLineOpacity=Math.max(0,Math.min(1,t)),this.gridUniforms.minorOpacity.value=this.minorLineOpacity,this.gridUniforms.majorOpacity.value=this.majorLineOpacity}dispose(){this.stopMonitoring(),this.teardownResizeObserver(),this.gridMesh&&this.gridGroup.remove(this.gridMesh),this.gridGeometry&&(this.gridGeometry.dispose(),this.gridGeometry=void 0),this.gridMaterial&&(this.gridMaterial.dispose(),this.gridMaterial=void 0),this.gridMesh=void 0}}class It{engine;scene;options;adaptiveGrid;axesHelper;constructor(e,t){this.engine=e,this.options=t,this.scene=this.createScene(),this.initHelpers()}createScene(){const e=new _.Scene,t=this.options.backgroundColor??1710618;return e.background=new _.Color(t),e.is2D=!0,e}initHelpers(){this.options.axesEnabled&&this.createAxes()}initGrid(){this.options.gridEnabled&&this.createGrid()}createGrid(e=1e3,t=50){this.adaptiveGrid&&(this.adaptiveGrid.dispose(),this.adaptiveGrid=void 0),this.adaptiveGrid=new At(this.scene,this.engine.cameraModule2d.orthographicCamera,this.engine.renderModule2d.container);const i=this.options.backgroundColor??1710618;this.updateGridColorsByBackground(i)}createAxes(e=100){this.axesHelper&&this.scene.remove(this.axesHelper),this.axesHelper=new _.AxesHelper(e),this.axesHelper.rotation.z=0,this.scene.add(this.axesHelper),this.scene.remove(this.axesHelper),this.scene.add(this.axesHelper),this.axesHelper.renderOrder=999}setBackgroundColor(e){this.scene.background=new _.Color(e),this.updateGridColorsByBackground(e)}updateGridColorsByBackground(e){if(!this.adaptiveGrid)return;const t=new _.Color(e);.299*t.r+.587*t.g+.114*t.b<.5?(this.adaptiveGrid.setColors(16777215,16777215),this.adaptiveGrid.setOpacity(.2,.3)):(this.adaptiveGrid.setColors(0,0),this.adaptiveGrid.setOpacity(.05,.2))}addObject(e){this.scene.add(e)}removeObject(e){this.scene.remove(e),e instanceof _.Mesh&&(e.geometry.dispose(),Array.isArray(e.material)?e.material.forEach(t=>t.dispose()):e.material.dispose())}clearScene(){for(let e=this.scene.children.length-1;e>=0;e--){const t=this.scene.children[e];t!==this.axesHelper&&(this.adaptiveGrid||this.removeObject(t))}this.engine.events&&this.engine.events.trigger("scene-cleared")}getObjects(e=!1){const t=[];return this.scene.children.forEach(i=>{(e||i!==this.axesHelper)&&t.push(i)}),t}getSceneStats(){let e=0,t=0,i=0;return this.scene.children.forEach(n=>{n instanceof _.Mesh?e++:n instanceof _.Line?t++:n instanceof _.Group&&i++}),{objectCount:this.scene.children.length,meshCount:e,lineCount:t,groupCount:i}}setGridVisible(e){this.adaptiveGrid&&this.adaptiveGrid.setVisible(e)}setAxesVisible(e){this.axesHelper&&(this.axesHelper.visible=e)}dispose(){this.clearScene(),this.adaptiveGrid&&(this.adaptiveGrid.dispose(),this.adaptiveGrid=void 0),this.axesHelper&&(this.scene.remove(this.axesHelper),this.axesHelper=void 0),this.scene.clear()}}class Lt{engine;isFree;highlightModels;highlightHoverModels;hideModels;translucentModels;models;constructor(e){this.engine=e,this.isFree=!0,this.highlightModels=[],this.hideModels=[],this.translucentModels=[],this.highlightHoverModels=[],this.models=[]}}class Pt{engine;orthographicCamera;container;frustumSize=1e3;near=.1;far=1e4;initialZoom=1;defaultPosition=new _.Vector3(0,0,1e3);constructor(e,t){this.engine=e,this.container=t,this.orthographicCamera=this.createOrthographicCamera()}createOrthographicCamera(){const e=this.container.clientWidth/this.container.clientHeight,t=this.frustumSize/2,i=t*e,n=new _.OrthographicCamera(-i,i,t,-t,this.near,this.far);return n.position.copy(this.defaultPosition),n.lookAt(0,0,0),n.zoom=this.initialZoom,n.updateProjectionMatrix(),n}animationId=null;animationStartTime=0;animationDuration=800;animationStartState={};animationTargetState={};fitToExtents(e,t=1.2,i=!0,n=800){const r=new _.Vector3(e.min[0],e.min[1]),s=new _.Vector3(e.max[0],e.max[1]);if(!(r.distanceTo(s)>.001)){console.warn("[CameraModule2d] Invalid extents, using default view"),this.resetView();return}const a=new _.Vector3;a.addVectors(r,s).multiplyScalar(.5);const l=new _.Vector3;l.subVectors(s,r);const f=Math.max(l.x,l.y)*t,p=this.container.clientWidth/this.container.clientHeight,d=f/2,y=d*p,c=-y,g=y,v=d,w=-d,M=a.x,S=a.y,E=1;if(!i){this.orthographicCamera.left=c,this.orthographicCamera.right=g,this.orthographicCamera.top=v,this.orthographicCamera.bottom=w,this.orthographicCamera.position.set(M,S,this.defaultPosition.z),this.orthographicCamera.zoom=E,this.orthographicCamera.updateProjectionMatrix(),this.engine.controlModule2d?.panControls&&(this.engine.controlModule2d.panControls.setPosition(M,S),this.engine.controlModule2d.panControls.setZoom(E)),this.engine.events&&this.engine.events.trigger("camera-changed",{type:"fit-to-extents",center:a,size:l});return}this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),this.animationStartState={left:this.orthographicCamera.left,right:this.orthographicCamera.right,top:this.orthographicCamera.top,bottom:this.orthographicCamera.bottom,x:this.orthographicCamera.position.x,y:this.orthographicCamera.position.y,zoom:this.orthographicCamera.zoom},this.animationTargetState={left:c,right:g,top:v,bottom:w,x:M,y:S,zoom:E},this.animationDuration=n,this.animationStartTime=performance.now(),this.animateFitToExtents(a,l)}easeOutCubic(e){return 1-Math.pow(1-e,3)}animateFitToExtents(e,t){const n=performance.now()-this.animationStartTime,r=Math.min(n/this.animationDuration,1),s=this.easeOutCubic(r),o=this.animationStartState,a=this.animationTargetState;this.orthographicCamera.left=this.lerp(o.left,a.left,s),this.orthographicCamera.right=this.lerp(o.right,a.right,s),this.orthographicCamera.top=this.lerp(o.top,a.top,s),this.orthographicCamera.bottom=this.lerp(o.bottom,a.bottom,s),this.orthographicCamera.position.x=this.lerp(o.x,a.x,s),this.orthographicCamera.position.y=this.lerp(o.y,a.y,s),this.orthographicCamera.zoom=this.lerp(o.zoom,a.zoom,s),this.orthographicCamera.updateProjectionMatrix(),this.engine.controlModule2d?.panControls&&(this.engine.controlModule2d.panControls.setPosition(this.orthographicCamera.position.x,this.orthographicCamera.position.y),this.engine.controlModule2d.panControls.setZoom(this.orthographicCamera.zoom)),this.engine.events&&this.engine.events.trigger("camera-changed",{type:"fit-to-extents",center:e,size:t,progress:s}),r<1?this.animationId=requestAnimationFrame(()=>this.animateFitToExtents(e,t)):this.animationId=null}lerp(e,t,i){return e+(t-e)*i}setZoom(e){this.orthographicCamera.zoom=e,this.orthographicCamera.updateProjectionMatrix(),this.engine.events&&this.engine.events.trigger("view-zoom-changed",{zoom:e})}getZoom(){return this.orthographicCamera.zoom}setPosition(e,t){this.orthographicCamera.position.set(e,t,this.defaultPosition.z),this.engine.events&&this.engine.events.trigger("view-pan-changed",{x:e,y:t})}getPosition(){return this.orthographicCamera.position.clone()}getViewState(){return{left:this.orthographicCamera.left,right:this.orthographicCamera.right,top:this.orthographicCamera.top,bottom:this.orthographicCamera.bottom,x:this.orthographicCamera.position.x,y:this.orthographicCamera.position.y,zoom:this.orthographicCamera.zoom}}applyViewState(e){this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),this.orthographicCamera.left=e.left,this.orthographicCamera.right=e.right,this.orthographicCamera.top=e.top,this.orthographicCamera.bottom=e.bottom,this.orthographicCamera.position.set(e.x,e.y,this.defaultPosition.z),this.orthographicCamera.zoom=e.zoom,this.orthographicCamera.updateProjectionMatrix(),this.engine.controlModule2d?.panControls&&(this.engine.controlModule2d.panControls.setPosition(e.x,e.y),this.engine.controlModule2d.panControls.setZoom(e.zoom)),this.engine.events?.trigger("camera-changed",{type:"restore-workspace-view"})}resetView(){this.orthographicCamera.position.copy(this.defaultPosition),this.orthographicCamera.zoom=this.initialZoom,this.orthographicCamera.updateProjectionMatrix(),this.engine.events&&this.engine.events.trigger("camera-reset")}getViewBounds(){const e=this.orthographicCamera,t=e.zoom,i=e.left/t,n=e.right/t,r=e.top/t,s=e.bottom/t,o=e.position.x,a=e.position.y;return{minX:o+i,maxX:o+n,minY:a+s,maxY:a+r,width:n-i,height:r-s}}screenToWorld(e,t){const i=new _.Vector3(e/this.container.clientWidth*2-1,-(t/this.container.clientHeight)*2+1,.5);return i.unproject(this.orthographicCamera),i}worldToScreen(e,t){const i=new _.Vector3(e,t,0);return i.project(this.orthographicCamera),{x:(i.x+1)/2*this.container.clientWidth,y:-(i.y-1)/2*this.container.clientHeight}}updateAspectRatio(){const e=this.container.clientWidth/this.container.clientHeight,t=this.frustumSize/2,i=t*e;this.orthographicCamera.left=-i,this.orthographicCamera.right=i,this.orthographicCamera.top=t,this.orthographicCamera.bottom=-t,this.orthographicCamera.updateProjectionMatrix()}setFrustumSize(e){this.frustumSize=e,this.updateAspectRatio()}getFrustumSize(){return this.frustumSize}dispose(){this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),this.orthographicCamera=null}}class Dt{engine;renderer;container;options;antialias=!0;alpha=!1;precision="highp";constructor(e,t,i){this.engine=e,this.container=t,this.options=i,this.renderer=this.createRenderer(),this.handleResize()}createRenderer(){const e=new _.WebGLRenderer({antialias:this.antialias,alpha:this.alpha,precision:this.precision}),t=this.container.clientWidth,i=this.container.clientHeight;return e.setSize(t,i),e.setPixelRatio(window.devicePixelRatio),e.autoClear=!0,e.sortObjects=!0,e.setClearColor(this.options.backgroundColor??1710618),this.container.appendChild(e.domElement),e}render(e,t){const i=performance.now();this.engine.events&&this.engine.events.trigger("render-start"),this.renderer.render(e,t);const n=performance.now()-i;this.engine.events&&this.engine.events.trigger("render-end",{renderTime:n})}handleResize(){window.addEventListener("resize",()=>{this.onWindowResize()})}onWindowResize(){const e=this.container.clientWidth,t=this.container.clientHeight;this.renderer.setSize(e,t),this.engine.cameraModule2d&&this.engine.cameraModule2d.updateAspectRatio(),this.engine.scene&&this.engine.camera&&this.render(this.engine.scene,this.engine.camera)}setSize(e,t){this.renderer.setSize(e,t),this.engine.cameraModule2d&&this.engine.cameraModule2d.updateAspectRatio()}getSize(){const e=this.renderer.getSize(new _.Vector2);return{width:e.x,height:e.y}}setBackgroundColor(e){this.renderer.setClearColor(new _.Color(e))}setPixelRatio(e){this.renderer.setPixelRatio(e)}getPixelRatio(){return this.renderer.getPixelRatio()}setAntialias(e){console.warn("Antialias cannot be changed after renderer creation")}clear(e=!0,t=!0,i=!1){this.renderer.clear(e,t,i)}getInfo(){const e=this.renderer.getContext();return{renderer:this.renderer.capabilities.isWebGL2?"WebGL 2.0":"WebGL 1.0",version:this.renderer.capabilities.getVersion(),vendor:this.renderer.capabilities.vendor,capabilities:{maxTextureSize:this.renderer.capabilities.maxTextureSize,maxRenderbufferSize:this.renderer.capabilities.maxRenderbufferSize,maxVertexAttribs:this.renderer.capabilities.maxVertexAttribs,maxVaryingVectors:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS)}}}dispose(){window.removeEventListener("resize",this.onWindowResize.bind(this)),this.renderer.dispose(),this.container.contains(this.renderer.domElement)&&this.container.removeChild(this.renderer.domElement),this.renderer=null}}class zt extends _.EventDispatcher{object;domElement;enabled=!0;enableZoom=!0;enablePan=!0;enableDamping=!1;dampingFactor=.05;zoomSpeed=1;touchZoomSpeed=1.35;minZoom=0;maxZoom=1/0;isDragging=!1;mouseButton=-1;previousMousePosition=new _.Vector2;targetPosition=new _.Vector3;targetZoom=1;isTouchZooming=!1;previousTouchDistance=0;previousTouchCenter=new _.Vector2;lastClickTime=0;doubleClickDelay=300;constructor(e,t){super(),this.object=e,this.domElement=t||document,this.targetPosition.copy(e.position),this.targetZoom=e.zoom,this.bindEvents()}bindEvents(){this.domElement.addEventListener("mousedown",this.onMouseDown.bind(this)),this.domElement.addEventListener("mousemove",this.onMouseMove.bind(this)),this.domElement.addEventListener("mouseup",this.onMouseUp.bind(this)),this.domElement.addEventListener("mouseleave",this.onMouseUp.bind(this)),this.domElement.addEventListener("wheel",this.onWheel.bind(this),{passive:!1}),this.domElement.addEventListener("dblclick",this.onDoubleClick.bind(this)),this.domElement.addEventListener("click",this.onClick.bind(this)),this.domElement.addEventListener("touchstart",this.onTouchStart.bind(this),{passive:!1}),this.domElement.addEventListener("touchmove",this.onTouchMove.bind(this),{passive:!1}),this.domElement.addEventListener("touchend",this.onTouchEnd.bind(this)),this.domElement.addEventListener("contextmenu",e=>{e.preventDefault()})}onMouseDown(e){this.enabled&&this.enablePan&&(e.button===0||e.button===1)&&(this.isDragging=!0,this.mouseButton=e.button,this.previousMousePosition.set(e.clientX,e.clientY),this.dispatchEvent({type:"start"}))}onMouseMove(e){if(!this.enabled||!this.isDragging)return;const t=e.clientX-this.previousMousePosition.x,i=e.clientY-this.previousMousePosition.y,r=1/(this.targetZoom||this.object.zoom),s=this.object.top-this.object.bottom,o=this.object.right-this.object.left,a=t/this.domElement.clientWidth*o*r,l=i/this.domElement.clientHeight*s*r;this.targetPosition.x-=a,this.targetPosition.y+=l,this.enableDamping||(this.object.position.copy(this.targetPosition),this.object.updateProjectionMatrix()),this.previousMousePosition.set(e.clientX,e.clientY),this.dispatchEvent({type:"change"})}onMouseUp(e){this.isDragging&&(this.isDragging=!1,this.mouseButton=-1,this.dispatchEvent({type:"end"}))}panByScreenDelta(e,t){const n=1/(this.targetZoom||this.object.zoom),r=this.object.top-this.object.bottom,s=this.object.right-this.object.left,o=e/this.domElement.clientWidth*s*n,a=t/this.domElement.clientHeight*r*n;this.targetPosition.x-=o,this.targetPosition.y+=a,this.applyImmediateIfNeeded()}zoomAroundScreenPoint(e,t,i){if(!Number.isFinite(i)||i<=0)return;const n=this.targetZoom;this.targetZoom*=i,this.minZoom>0&&(this.targetZoom=Math.max(this.minZoom,this.targetZoom)),this.maxZoom!==1/0&&(this.targetZoom=Math.min(this.targetZoom,this.maxZoom));const r=this.targetZoom;if(n===r)return;const s=(this.object.right-this.object.left)/2,o=(this.object.top-this.object.bottom)/2,a=this.domElement.getBoundingClientRect(),l=(e-a.left)/a.width*2-1,h=-((t-a.top)/a.height)*2+1;this.targetPosition.x+=l*s*(1/n-1/r),this.targetPosition.y+=h*o*(1/n-1/r),this.applyImmediateIfNeeded()}applyImmediateIfNeeded(){this.enableDamping||(this.object.zoom=this.targetZoom,this.object.position.copy(this.targetPosition),this.object.updateProjectionMatrix())}onWheel(e){if(!this.enabled||!this.enableZoom)return;e.preventDefault();const t=Math.pow(1.1,-Math.sign(e.deltaY)*this.zoomSpeed),i=this.targetZoom;this.targetZoom*=t,this.minZoom>0&&(this.targetZoom=Math.max(this.minZoom,this.targetZoom)),this.maxZoom!==1/0&&(this.targetZoom=Math.min(this.targetZoom,this.maxZoom));const n=this.targetZoom,r=(this.object.right-this.object.left)/2,s=(this.object.top-this.object.bottom)/2,o=this.domElement.getBoundingClientRect(),a=(e.clientX-o.left)/o.width*2-1,l=-((e.clientY-o.top)/o.height)*2+1;this.targetPosition.x+=a*r*(1/i-1/n),this.targetPosition.y+=l*s*(1/i-1/n),this.enableDamping||(this.object.zoom=n,this.object.position.copy(this.targetPosition),this.object.updateProjectionMatrix()),this.dispatchEvent({type:"change"})}onDoubleClick(e){this.enabled&&this.dispatchEvent({type:"doubleClick",event:e})}onClick(e){const t=performance.now();t-this.lastClickTime<this.doubleClickDelay||(this.lastClickTime=t)}onTouchStart(e){if(!this.enabled||e.touches.length<1)return;if(e.preventDefault(),e.touches.length>=2){const i=e.touches[0],n=e.touches[1];this.isDragging=!1,this.isTouchZooming=!0,this.previousTouchCenter.set((i.clientX+n.clientX)*.5,(i.clientY+n.clientY)*.5),this.previousTouchDistance=Math.hypot(i.clientX-n.clientX,i.clientY-n.clientY),this.dispatchEvent({type:"start"});return}const t=e.touches[0];this.isDragging=!0,this.isTouchZooming=!1,this.previousTouchDistance=0,this.previousMousePosition.set(t.clientX,t.clientY),this.dispatchEvent({type:"start"})}onTouchMove(e){if(!this.enabled||!this.isDragging&&!this.isTouchZooming)return;if(e.preventDefault(),e.touches.length>=2){const f=e.touches[0],p=e.touches[1],d=(f.clientX+p.clientX)*.5,y=(f.clientY+p.clientY)*.5,c=Math.hypot(f.clientX-p.clientX,f.clientY-p.clientY);if(!this.isTouchZooming||this.previousTouchDistance<=0){this.isDragging=!1,this.isTouchZooming=!0,this.previousTouchCenter.set(d,y),this.previousTouchDistance=c;return}if(this.panByScreenDelta(d-this.previousTouchCenter.x,y-this.previousTouchCenter.y),c>0){const g=Math.pow(c/this.previousTouchDistance,this.zoomSpeed*this.touchZoomSpeed);this.zoomAroundScreenPoint(d,y,g)}this.previousTouchCenter.set(d,y),this.previousTouchDistance=c,this.dispatchEvent({type:"change"});return}if(!this.isDragging||e.touches.length!==1)return;const t=e.touches[0],i=t.clientX-this.previousMousePosition.x,n=t.clientY-this.previousMousePosition.y,s=1/this.object.zoom,o=this.object.top-this.object.bottom,a=this.object.right-this.object.left,l=i/this.domElement.clientWidth*a*s,h=n/this.domElement.clientHeight*o*s;this.targetPosition.x-=l,this.targetPosition.y+=h,this.enableDamping||this.object.position.copy(this.targetPosition),this.previousMousePosition.set(t.clientX,t.clientY),this.dispatchEvent({type:"change"})}onTouchEnd(e){if(e.touches.length>=2){const t=e.touches[0],i=e.touches[1];this.previousTouchCenter.set((t.clientX+i.clientX)*.5,(t.clientY+i.clientY)*.5),this.previousTouchDistance=Math.hypot(t.clientX-i.clientX,t.clientY-i.clientY);return}if(e.touches.length===1){const t=e.touches[0];this.isDragging=!0,this.isTouchZooming=!1,this.previousTouchDistance=0,this.previousMousePosition.set(t.clientX,t.clientY);return}(this.isDragging||this.isTouchZooming)&&(this.isDragging=!1,this.isTouchZooming=!1,this.previousTouchDistance=0,this.dispatchEvent({type:"end"}))}update(){if(this.enabled&&this.enableDamping){const e=1-this.dampingFactor;this.object.position.x+=(this.targetPosition.x-this.object.position.x)*e,this.object.position.y+=(this.targetPosition.y-this.object.position.y)*e,this.object.zoom+=(this.targetZoom-this.object.zoom)*e,this.object.updateProjectionMatrix()}}reset(){this.targetPosition.set(0,0,this.object.position.z),this.targetZoom=1,this.enableDamping||(this.object.position.copy(this.targetPosition),this.object.zoom=this.targetZoom,this.object.updateProjectionMatrix()),this.dispatchEvent({type:"reset"})}setPosition(e,t){this.targetPosition.set(e,t,this.object.position.z),this.enableDamping||this.object.position.copy(this.targetPosition),this.dispatchEvent({type:"change"})}setZoom(e){this.targetZoom=e,this.minZoom>0&&(this.targetZoom=Math.max(this.minZoom,this.targetZoom)),this.maxZoom!==1/0&&(this.targetZoom=Math.min(this.targetZoom,this.maxZoom)),this.enableDamping||(this.object.zoom=this.targetZoom,this.object.updateProjectionMatrix()),this.dispatchEvent({type:"change"})}dispose(){this.enabled=!1,this.domElement.removeEventListener("mousedown",this.onMouseDown.bind(this)),this.domElement.removeEventListener("mousemove",this.onMouseMove.bind(this)),this.domElement.removeEventListener("mouseup",this.onMouseUp.bind(this)),this.domElement.removeEventListener("mouseleave",this.onMouseUp.bind(this)),this.domElement.removeEventListener("wheel",this.onWheel.bind(this)),this.domElement.removeEventListener("dblclick",this.onDoubleClick.bind(this)),this.domElement.removeEventListener("click",this.onClick.bind(this)),this.domElement.removeEventListener("touchstart",this.onTouchStart.bind(this)),this.domElement.removeEventListener("touchmove",this.onTouchMove.bind(this)),this.domElement.removeEventListener("touchend",this.onTouchEnd.bind(this))}}class Bt{engine;panControls;isActive=!0;constructor(e){this.engine=e,this.panControls=this.createPanControls(),this.init()}init(){this.panControls.addEventListener("doubleClick",this.onDoubleClick.bind(this)),this.panControls.addEventListener("change",this.onChange.bind(this))}createPanControls(){const e=new zt(this.engine.camera,this.engine.renderer.domElement);return e.enableZoom=!0,e.enablePan=!0,e.enableDamping=!0,e.dampingFactor=.05,e.zoomSpeed=1,e.minZoom=0,e.maxZoom=1/0,e}onDoubleClick(e){this.engine.cameraModule2d&&this.engine.cameraModule2d.resetView()}onChange(){this.engine.events&&this.engine.events.trigger("camera-changed",{type:"user-interaction"})}active(){this.isActive=!0,this.panControls.enabled=!0}disActive(){this.isActive=!1,this.panControls.enabled=!1}update(){this.isActive&&this.panControls.update()}reset(){this.panControls.reset()}setPosition(e,t){this.panControls.setPosition(e,t)}setZoom(e){this.panControls.setZoom(e)}getZoom(){return this.panControls.object.zoom}setEnableZoom(e){this.panControls.enableZoom=e}setEnablePan(e){this.panControls.enablePan=e}setEnableDamping(e){this.panControls.enableDamping=e}setDampingFactor(e){this.panControls.dampingFactor=Math.max(0,Math.min(e,1))}setZoomSpeed(e){this.panControls.zoomSpeed=Math.max(.1,e)}setZoomLimits(e,t){this.panControls.minZoom=e,this.panControls.maxZoom=t}dispose(){this.panControls.dispose(),this.panControls=null}}class Rt extends ue.Loader{constructor(e){super(e)}load(e,t,i,n){const r=this,s=new ue.FileLoader(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(e,function(o){const a=r.parse(JSON.parse(o));t&&t(a)},i,n)}parse(e){return new Nt(e)}}class Nt{constructor(e){this.isFont=!0,this.type="Font",this.data=e}generateShapes(e,t=100,i="ltr"){const n=[],r=Ot(e,t,this.data,i);for(let s=0,o=r.length;s<o;s++)n.push(...r[s].toShapes());return n}}function Ot(b,e,t,i){const n=Array.from(b),r=e/t.resolution,s=(t.boundingBox.yMax-t.boundingBox.yMin+t.underlineThickness)*r,o=[];let a=0,l=0;(i=="rtl"||i=="tb")&&n.reverse();for(let h=0;h<n.length;h++){const f=n[h];if(f===`
65
- `)a=0,l-=s;else{const p=Ut(f,r,a,l,t);i=="tb"?(a=0,l+=t.ascender*r):a+=p.offsetX,o.push(p.path)}}return o}function Ut(b,e,t,i,n){const r=n.glyphs[b]||n.glyphs["?"];if(!r){console.error('THREE.Font: character "'+b+'" does not exists in font family '+n.familyName+".");return}const s=new ue.ShapePath;let o,a,l,h,f,p,d,y;if(r.o){const c=r._cachedOutline||(r._cachedOutline=r.o.split(" "));for(let g=0,v=c.length;g<v;)switch(c[g++]){case"m":o=c[g++]*e+t,a=c[g++]*e+i,s.moveTo(o,a);break;case"l":o=c[g++]*e+t,a=c[g++]*e+i,s.lineTo(o,a);break;case"q":l=c[g++]*e+t,h=c[g++]*e+i,f=c[g++]*e+t,p=c[g++]*e+i,s.quadraticCurveTo(f,p,l,h);break;case"b":l=c[g++]*e+t,h=c[g++]*e+i,f=c[g++]*e+t,p=c[g++]*e+i,d=c[g++]*e+t,y=c[g++]*e+i,s.bezierCurveTo(f,p,d,y,l,h);break}}return{offsetX:r.ha*e,path:s}}class de{static async fromUrl(e,t){const i=await fetch(e);if(!i.ok)throw new Error(`FontJsonGenerator: 无法加载 ${e} (${i.status})`);const n=await i.arrayBuffer();return de.fromArrayBuffer(n,t)}static fromArrayBuffer(e,t){const i=xt.parse(e);return de._convert(i,t?.chars)}static toThreeFont(e){return new Rt().parse(e)}static _convert(e,t){const i={},n=e.unitsPerEm,r=f=>Math.round(f),s=f=>{const p=e.charToGlyph(f);if(!p||p.index===0)return;const d=de._commandsToTypefaceOutline(p.path.commands,r),y=p.getBoundingBox();i[f]={x_min:y.x1,x_max:y.x2,ha:p.advanceWidth??0,o:d.join(" ")}};if(t)for(const f of t)s(f);else{const f=e.tables.cmap?.glyphIndexMap??{};for(const p of Object.keys(f)){const d=Number.parseInt(p,10);d>0&&s(String.fromCodePoint(d))}}if(!i[" "]){const f=e.charToGlyph(" ");i[" "]={x_min:0,x_max:0,ha:f?.advanceWidth??Math.round(n/4),o:""}}const o=e.names,a=f=>o[f]?.en??o[f]?.zh??"",l=a("fontFamily")||"Custom Font",h=a("fontSubfamily")||"Regular";return{familyName:l,ascender:e.ascender,descender:e.descender,underlinePosition:e.tables.post?.underlinePosition??-100,underlineThickness:e.tables.post?.underlineThickness??50,boundingBox:{yMin:e.descender,xMin:0,yMax:e.ascender,xMax:n},resolution:n,original_font_information:{fontFamily:l,fontSubfamily:h},cssFontStyle:h.toLowerCase().includes("italic")?"italic":"normal",cssFontWeight:h.toLowerCase().includes("bold")?"bold":"normal",glyphs:i}}static _commandsToTypefaceOutline(e,t){const i=de._splitContours(e),n=de._createContourEntries(i),r=n.filter(a=>a.depth%2===0),s=n.filter(a=>a.depth%2===1),o=[];return r.sort((a,l)=>a.index-l.index).forEach(a=>{de._appendNormalizedContour(a.contour,!0,o,t),s.filter(l=>de._findParentSolid(l,r)===a).sort((l,h)=>l.index-h.index).forEach(l=>de._appendNormalizedContour(l.contour,!1,o,t))}),o}static _createContourEntries(e){return e.filter(t=>t.segments.length>0).map((t,i)=>{const n=de._samplePoint(t),r=e.reduce((s,o)=>o===t||o.points.length<3?s:de._pointInPolygon(n,o.points)?s+1:s,0);return{contour:t,index:i,depth:r,absArea:Math.abs(de._signedArea(t.points))}})}static _findParentSolid(e,t){const i=de._samplePoint(e.contour);return t.filter(n=>de._pointInPolygon(i,n.contour.points)).sort((n,r)=>n.absArea-r.absArea)[0]}static _appendNormalizedContour(e,t,i,n){const s=de._signedArea(e.points)<0===t?e.segments:de._reverseSegments(e.segments);de._appendContour(s,i,n)}static _splitContours(e){const t=[];let i=null,n=null;const r=()=>{i&&i.segments.length>0&&t.push(i),i=null,n=null};return e.forEach(s=>{if(s.type==="M"){r(),n={x:s.x,y:s.y},i={segments:[],points:[n]};return}if(!i||!n)return;if(s.type==="Z"){r();return}const o={x:s.x,y:s.y};s.type==="L"?i.segments.push({type:"L",start:n,end:o}):s.type==="Q"?i.segments.push({type:"Q",start:n,end:o,x1:s.x1,y1:s.y1}):s.type==="C"&&i.segments.push({type:"C",start:n,end:o,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2}),n=o,i.points.push(o)}),r(),t}static _appendContour(e,t,i){const n=e[0].start;t.push(`m ${i(n.x)} ${i(n.y)}`),e.forEach(r=>{r.type==="L"?t.push(`l ${i(r.end.x)} ${i(r.end.y)}`):r.type==="Q"?t.push(`q ${i(r.end.x)} ${i(r.end.y)} ${i(r.x1)} ${i(r.y1)}`):t.push(`b ${i(r.end.x)} ${i(r.end.y)} ${i(r.x1)} ${i(r.y1)} ${i(r.x2)} ${i(r.y2)}`)}),t.push("z")}static _reverseSegments(e){return e.slice().reverse().map(t=>t.type==="L"?{type:"L",start:t.end,end:t.start}:t.type==="Q"?{type:"Q",start:t.end,end:t.start,x1:t.x1,y1:t.y1}:{type:"C",start:t.end,end:t.start,x1:t.x2,y1:t.y2,x2:t.x1,y2:t.y1})}static _signedArea(e){let t=0;for(let i=0,n=e.length-1;i<e.length;n=i++)t+=e[n].x*e[i].y-e[i].x*e[n].y;return t/2}static _samplePoint(e){return e.points[0]}static _pointInPolygon(e,t){let i=!1;for(let n=0,r=t.length-1;n<t.length;r=n++){const s=t[n],o=t[r];s.y>e.y!=o.y>e.y&&e.x<(o.x-s.x)*(e.y-s.y)/(o.y-s.y)+s.x&&(i=!i)}return i}}const Vt="__BIM_ENGINE_SDK_ASSET_BASE__",jt="https://unpkg.com/iflow-engine-base@3.9.16/dist/";function Wt(){return typeof globalThis<"u"?globalThis:null}function je(b){return b.endsWith("/")?b:`${b}/`}function Qe(b){return/^(?:[a-z][a-z\d+\-.]*:)?\/\//i.test(b)||/^(?:data|blob):/i.test(b)}function Ft(b){return b.startsWith("./")||b.startsWith("../")}function ze(b,e){try{return e?new URL(b,e).toString():new URL(b).toString()}catch{return null}}function et(){return typeof document<"u"&&document.baseURI?document.baseURI:typeof location<"u"&&location.href?location.href:null}function Gt(b,e){const t=je(b);if(Qe(t))return t;const i=Be(e)||Ht()||et();return ze(t,i||void 0)||t}function Be(b){if(!b)return null;try{const e=et(),t=ze(b,e||void 0)||b,i=new URL(".",t),n=i.pathname.replace(/\\/g,"/");return n.endsWith("/chunks/")?new URL("../",i).toString():e&&/\/src\//.test(n)?je(e):i.toString()}catch{return null}}function Ht(){if(typeof document>"u")return null;const b=document.currentScript;if(b?.src)return Be(b.src);const e=document.getElementsByTagName("script");for(let t=e.length-1;t>=0;t-=1){const i=e[t]?.src;if(i&&/(?:bim-engine-sdk|iflow-engine-base|dwg-preview|gaussian)\.(?:es|umd)\.js(?:[?#].*)?$/.test(i))return Be(i)}return null}function $t(b){const t=Wt()?.[Vt];return typeof t=="string"&&t.length>0?Gt(t,b):je(jt)}function xe(b,e){if(Qe(b))return b;if(Ft(b)){const n=ze(b,Be(e)||void 0);if(n)return n}const t=b.replace(/^\/+/,""),i=$t(e);return ze(t,i)||t}class Zt{panel=null;listEl=null;isVisible=!1;delegate;constructor(e,t){this.delegate=t,this._buildPanel(e)}show(){this.panel&&(this.panel.style.display="flex",this.isVisible=!0)}hide(){this.panel&&(this.panel.style.display="none",this.isVisible=!1)}toggle(){this.isVisible?this.hide():this.show()}refresh(){this._renderList()}_buildPanel(e){const t=document.createElement("div");t.style.cssText=`
65
+ `)a=0,l-=s;else{const p=Ut(f,r,a,l,t);i=="tb"?(a=0,l+=t.ascender*r):a+=p.offsetX,o.push(p.path)}}return o}function Ut(b,e,t,i,n){const r=n.glyphs[b]||n.glyphs["?"];if(!r){console.error('THREE.Font: character "'+b+'" does not exists in font family '+n.familyName+".");return}const s=new ue.ShapePath;let o,a,l,h,f,p,d,y;if(r.o){const c=r._cachedOutline||(r._cachedOutline=r.o.split(" "));for(let g=0,v=c.length;g<v;)switch(c[g++]){case"m":o=c[g++]*e+t,a=c[g++]*e+i,s.moveTo(o,a);break;case"l":o=c[g++]*e+t,a=c[g++]*e+i,s.lineTo(o,a);break;case"q":l=c[g++]*e+t,h=c[g++]*e+i,f=c[g++]*e+t,p=c[g++]*e+i,s.quadraticCurveTo(f,p,l,h);break;case"b":l=c[g++]*e+t,h=c[g++]*e+i,f=c[g++]*e+t,p=c[g++]*e+i,d=c[g++]*e+t,y=c[g++]*e+i,s.bezierCurveTo(f,p,d,y,l,h);break}}return{offsetX:r.ha*e,path:s}}class de{static async fromUrl(e,t){const i=await fetch(e);if(!i.ok)throw new Error(`FontJsonGenerator: 无法加载 ${e} (${i.status})`);const n=await i.arrayBuffer();return de.fromArrayBuffer(n,t)}static fromArrayBuffer(e,t){const i=xt.parse(e);return de._convert(i,t?.chars)}static toThreeFont(e){return new Rt().parse(e)}static _convert(e,t){const i={},n=e.unitsPerEm,r=f=>Math.round(f),s=f=>{const p=e.charToGlyph(f);if(!p||p.index===0)return;const d=de._commandsToTypefaceOutline(p.path.commands,r),y=p.getBoundingBox();i[f]={x_min:y.x1,x_max:y.x2,ha:p.advanceWidth??0,o:d.join(" ")}};if(t)for(const f of t)s(f);else{const f=e.tables.cmap?.glyphIndexMap??{};for(const p of Object.keys(f)){const d=Number.parseInt(p,10);d>0&&s(String.fromCodePoint(d))}}if(!i[" "]){const f=e.charToGlyph(" ");i[" "]={x_min:0,x_max:0,ha:f?.advanceWidth??Math.round(n/4),o:""}}const o=e.names,a=f=>o[f]?.en??o[f]?.zh??"",l=a("fontFamily")||"Custom Font",h=a("fontSubfamily")||"Regular";return{familyName:l,ascender:e.ascender,descender:e.descender,underlinePosition:e.tables.post?.underlinePosition??-100,underlineThickness:e.tables.post?.underlineThickness??50,boundingBox:{yMin:e.descender,xMin:0,yMax:e.ascender,xMax:n},resolution:n,original_font_information:{fontFamily:l,fontSubfamily:h},cssFontStyle:h.toLowerCase().includes("italic")?"italic":"normal",cssFontWeight:h.toLowerCase().includes("bold")?"bold":"normal",glyphs:i}}static _commandsToTypefaceOutline(e,t){const i=de._splitContours(e),n=de._createContourEntries(i),r=n.filter(a=>a.depth%2===0),s=n.filter(a=>a.depth%2===1),o=[];return r.sort((a,l)=>a.index-l.index).forEach(a=>{de._appendNormalizedContour(a.contour,!0,o,t),s.filter(l=>de._findParentSolid(l,r)===a).sort((l,h)=>l.index-h.index).forEach(l=>de._appendNormalizedContour(l.contour,!1,o,t))}),o}static _createContourEntries(e){return e.filter(t=>t.segments.length>0).map((t,i)=>{const n=de._samplePoint(t),r=e.reduce((s,o)=>o===t||o.points.length<3?s:de._pointInPolygon(n,o.points)?s+1:s,0);return{contour:t,index:i,depth:r,absArea:Math.abs(de._signedArea(t.points))}})}static _findParentSolid(e,t){const i=de._samplePoint(e.contour);return t.filter(n=>de._pointInPolygon(i,n.contour.points)).sort((n,r)=>n.absArea-r.absArea)[0]}static _appendNormalizedContour(e,t,i,n){const s=de._signedArea(e.points)<0===t?e.segments:de._reverseSegments(e.segments);de._appendContour(s,i,n)}static _splitContours(e){const t=[];let i=null,n=null;const r=()=>{i&&i.segments.length>0&&t.push(i),i=null,n=null};return e.forEach(s=>{if(s.type==="M"){r(),n={x:s.x,y:s.y},i={segments:[],points:[n]};return}if(!i||!n)return;if(s.type==="Z"){r();return}const o={x:s.x,y:s.y};s.type==="L"?i.segments.push({type:"L",start:n,end:o}):s.type==="Q"?i.segments.push({type:"Q",start:n,end:o,x1:s.x1,y1:s.y1}):s.type==="C"&&i.segments.push({type:"C",start:n,end:o,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2}),n=o,i.points.push(o)}),r(),t}static _appendContour(e,t,i){const n=e[0].start;t.push(`m ${i(n.x)} ${i(n.y)}`),e.forEach(r=>{r.type==="L"?t.push(`l ${i(r.end.x)} ${i(r.end.y)}`):r.type==="Q"?t.push(`q ${i(r.end.x)} ${i(r.end.y)} ${i(r.x1)} ${i(r.y1)}`):t.push(`b ${i(r.end.x)} ${i(r.end.y)} ${i(r.x1)} ${i(r.y1)} ${i(r.x2)} ${i(r.y2)}`)}),t.push("z")}static _reverseSegments(e){return e.slice().reverse().map(t=>t.type==="L"?{type:"L",start:t.end,end:t.start}:t.type==="Q"?{type:"Q",start:t.end,end:t.start,x1:t.x1,y1:t.y1}:{type:"C",start:t.end,end:t.start,x1:t.x2,y1:t.y2,x2:t.x1,y2:t.y1})}static _signedArea(e){let t=0;for(let i=0,n=e.length-1;i<e.length;n=i++)t+=e[n].x*e[i].y-e[i].x*e[n].y;return t/2}static _samplePoint(e){return e.points[0]}static _pointInPolygon(e,t){let i=!1;for(let n=0,r=t.length-1;n<t.length;r=n++){const s=t[n],o=t[r];s.y>e.y!=o.y>e.y&&e.x<(o.x-s.x)*(e.y-s.y)/(o.y-s.y)+s.x&&(i=!i)}return i}}const Vt="__BIM_ENGINE_SDK_ASSET_BASE__",jt="https://unpkg.com/iflow-engine-base@3.9.20/dist/";function Wt(){return typeof globalThis<"u"?globalThis:null}function je(b){return b.endsWith("/")?b:`${b}/`}function Qe(b){return/^(?:[a-z][a-z\d+\-.]*:)?\/\//i.test(b)||/^(?:data|blob):/i.test(b)}function Ft(b){return b.startsWith("./")||b.startsWith("../")}function ze(b,e){try{return e?new URL(b,e).toString():new URL(b).toString()}catch{return null}}function et(){return typeof document<"u"&&document.baseURI?document.baseURI:typeof location<"u"&&location.href?location.href:null}function Gt(b,e){const t=je(b);if(Qe(t))return t;const i=Be(e)||Ht()||et();return ze(t,i||void 0)||t}function Be(b){if(!b)return null;try{const e=et(),t=ze(b,e||void 0)||b,i=new URL(".",t),n=i.pathname.replace(/\\/g,"/");return n.endsWith("/chunks/")?new URL("../",i).toString():e&&/\/src\//.test(n)?je(e):i.toString()}catch{return null}}function Ht(){if(typeof document>"u")return null;const b=document.currentScript;if(b?.src)return Be(b.src);const e=document.getElementsByTagName("script");for(let t=e.length-1;t>=0;t-=1){const i=e[t]?.src;if(i&&/(?:bim-engine-sdk|iflow-engine-base|dwg-preview|gaussian)\.(?:es|umd)\.js(?:[?#].*)?$/.test(i))return Be(i)}return null}function $t(b){const t=Wt()?.[Vt];return typeof t=="string"&&t.length>0?Gt(t,b):je(jt)}function xe(b,e){if(Qe(b))return b;if(Ft(b)){const n=ze(b,Be(e)||void 0);if(n)return n}const t=b.replace(/^\/+/,""),i=$t(e);return ze(t,i)||t}class Zt{panel=null;listEl=null;isVisible=!1;delegate;constructor(e,t){this.delegate=t,this._buildPanel(e)}show(){this.panel&&(this.panel.style.display="flex",this.isVisible=!0)}hide(){this.panel&&(this.panel.style.display="none",this.isVisible=!1)}toggle(){this.isVisible?this.hide():this.show()}refresh(){this._renderList()}_buildPanel(e){const t=document.createElement("div");t.style.cssText=`
66
66
  position:absolute; top:10px; right:10px;
67
67
  width:220px; max-height:480px;
68
68
  background:var(--e2d-bg,#1e1f22);
@@ -218,4 +218,4 @@
218
218
  <span class="engine-2d-search__item-name">${this.highlight(n.name,t)}</span>
219
219
  ${n.layer?`<span class="engine-2d-search__item-layer">${this.escapeHtml(n.layer)}</span>`:""}
220
220
  ${n.description?`<span class="engine-2d-search__item-desc">${this.escapeHtml(n.description)}</span>`:""}
221
- `,s.addEventListener("click",()=>this.selectResult(n)),s.addEventListener("mouseenter",()=>{this.activeIndex=r,this.highlightItem(this.resultList.querySelectorAll(".engine-2d-search__item"))}),this.resultList.appendChild(s)})}highlight(e,t){const i=this.escapeHtml(e),n=t.trim();if(!n)return i;const r=this.escapeRegExp(this.escapeHtml(n));return i.replace(new RegExp(`(${r})`,"gi"),'<mark class="engine-2d-search__mark">$1</mark>')}highlightItem(e){e.forEach((t,i)=>{t.classList.toggle("engine-2d-search__item--active",i===this.activeIndex)}),this.activeIndex>=0&&e[this.activeIndex]?.scrollIntoView({block:"nearest"})}selectResult(e){this.manager.onResultSelect(e),this.hide()}clearResults(){this.resultList.innerHTML="",this.resultList.style.display="none",this.statusEl.style.display="none";const e=this.wrapper.querySelector(".engine-2d-search__divider");e.style.display="none",this.currentResults=[],this.activeIndex=-1}escapeHtml(e){return String(e??"").replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[t]??t)}escapeRegExp(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}show(){this.wrapper.classList.add("engine-2d-search--visible"),requestAnimationFrame(()=>this.input.focus())}hide(){this.wrapper.classList.remove("engine-2d-search--visible"),this.clearResults(),this.input.value="",this.clearBtn.style.opacity="0",this.clearBtn.style.pointerEvents="none"}toggle(){this.wrapper.classList.contains("engine-2d-search--visible")?this.hide():this.show()}dispose(){this.input.removeEventListener("input",this.onInput),this.input.removeEventListener("keydown",this.onKeyDown),this.clearBtn.removeEventListener("click",this.onClear),document.removeEventListener("mousedown",this.onDocMouseDown),document.removeEventListener("keydown",this.onEscape),this.wrapper.parentElement?.removeChild(this.wrapper),this.debounceTimer!==null&&clearTimeout(this.debounceTimer)}}class _i{engine;searchUI=null;constructor(e){this.engine=e;const t=document.getElementById(e?.options?.containerId??"")??e?.container??null;t&&(this.searchUI=new Mi(t,this))}search(e){const t=this.normalize(e);return t?(this.engine.loaderModule2d?.model?.textItems??[]).map(n=>{const r=this.getMatchScore(n.text,t);return r==null?null:{id:n.id,name:n.text,type:"文字",layer:n.layer,description:this.getPositionDescription(n),score:r,target:n}}).filter(n=>n!==null).sort((n,r)=>(r.score??0)-(n.score??0)||n.name.length-r.name.length).slice(0,100):[]}onResultSelect(e){const t=e.target;t&&(this.engine.modelToolModule2d?.unhighlightAllModels?.(),this.engine.modelToolModule2d?.highlightModel?.([e.id]),this.fitToText(t))}fitToText(e){const t=e.min?.clone(),i=e.max?.clone(),n=e.anchor?.clone();if((!t||!i||t.distanceTo(i)<1e-6)&&n){const o=Math.max(Number(e.info?.height??100),100);this.engine.cameraModule2d?.fitToExtents({min:[n.x-o,n.y-o,0],max:[n.x+o,n.y+o,0]},2,!0,500);return}if(!t||!i)return;const r=new _.Vector3().subVectors(i,t),s=Math.max(r.x,r.y)<1e-6?2:2.5;this.engine.cameraModule2d?.fitToExtents({min:[t.x,t.y,t.z],max:[i.x,i.y,i.z]},s,!0,500)}getPositionDescription(e){const t=e.anchor??e.min;return t?`X:${t.x.toFixed(0)} Y:${t.y.toFixed(0)}`:""}normalize(e){return String(e??"").trim().toLowerCase().replace(/\s+/g,"")}getMatchScore(e,t){const i=this.normalize(e);if(!i)return null;const n=i.indexOf(t);if(n>=0)return 1e3-n-Math.max(0,i.length-t.length)*.01;let r=0,s=0;for(const o of t){const a=i.indexOf(o,r);if(a<0)return null;s+=a-r,r=a+1}return 500-s-Math.max(0,i.length-t.length)*.01}show(){this.searchUI?.show()}hide(){this.searchUI?.hide()}toggle(){this.searchUI?.toggle()}dispose(){this.searchUI?.dispose(),this.searchUI=null}}const ft={dark:{"--e2d-bg":"#1e1f22","--e2d-bg2":"#252526","--e2d-bg3":"#222222","--e2d-bg-hover":"rgba(79,195,247,0.08)","--e2d-bg-accent":"#094771","--e2d-icon-bg":"rgba(255,255,255,0.08)","--e2d-icon-bg-hover":"rgba(255,255,255,0.16)","--e2d-border":"rgba(255,255,255,0.12)","--e2d-border2":"#333333","--e2d-text":"#e0e0e0","--e2d-text2":"#cccccc","--e2d-text3":"rgba(255,255,255,0.35)","--e2d-text4":"#666666","--e2d-text-accent":"#ffffff","--e2d-accent":"#4fc3f7","--e2d-shadow":"rgba(0,0,0,0.50)","--e2d-shadow-lg":"rgba(0,0,0,0.65)","--e2d-cursor":"rgba(255,255,255,0.85)","--e2d-scrollbar":"rgba(255,255,255,0.15)","--e2d-float-bg":"rgba(0,0,0,0.65)","--e2d-float-border":"rgba(255,255,255,0.08)","--e2d-swatch-border":"#444444","--e2d-close":"#aaaaaa","--e2d-close-hover":"#ffffff","--e2d-icon":"rgba(255,255,255,0.4)","--e2d-coord-value":"#76c8ff","--e2d-coord-label":"rgba(255,255,255,0.45)"},light:{"--e2d-bg":"#ffffff","--e2d-bg2":"#ffffff","--e2d-bg3":"#eeeeee","--e2d-bg-hover":"rgba(25,118,210,0.06)","--e2d-bg-accent":"#e3f2fd","--e2d-icon-bg":"rgba(0,0,0,0.06)","--e2d-icon-bg-hover":"rgba(0,0,0,0.12)","--e2d-border":"rgba(0,0,0,0.12)","--e2d-border2":"#e0e0e0","--e2d-text":"#1a1a1a","--e2d-text2":"#444444","--e2d-text3":"rgba(0,0,0,0.40)","--e2d-text4":"#aaaaaa","--e2d-text-accent":"#1565c0","--e2d-accent":"#1976d2","--e2d-shadow":"rgba(0,0,0,0.15)","--e2d-shadow-lg":"rgba(0,0,0,0.22)","--e2d-cursor":"rgba(30,30,30,0.70)","--e2d-scrollbar":"rgba(0,0,0,0.18)","--e2d-float-bg":"#ffffff","--e2d-float-border":"rgba(0,0,0,0.10)","--e2d-swatch-border":"#cccccc","--e2d-close":"#777777","--e2d-close-hover":"#1a1a1a","--e2d-icon":"rgba(0,0,0,0.45)","--e2d-coord-value":"#1976d2","--e2d-coord-label":"rgba(0,0,0,0.50)"}};class Ci{container;current;constructor(e,t="dark"){this.container=e,this.current=t,this._apply(t)}_apply(e){const t=ft[e];for(const[i,n]of Object.entries(t))this.container.style.setProperty(i,n);this.container.setAttribute("data-e2d-theme",e)}setTheme(e){this.current=e,this._apply(e)}getTheme(){return this.current}toggle(){this.setTheme(this.current==="dark"?"light":"dark")}dispose(){for(const e of Object.keys(ft[this.current]))this.container.style.removeProperty(e);this.container.removeAttribute("data-e2d-theme")}}const pt={precision:3,unit:"m",areaUnit:"m²",scale:1};class Ge{manager;points=[];constructor(e){this.manager=e}active(){this.points=[],this.manager.setCurrentTool(this)}disActive(){this.points=[],this.manager.clearPreview()}clearAllPoints(){this.points=[],this.manager.clearPreview()}handleClick(e){this.points.push(e.clone())}handleMove(e){}handleDoubleClick(){}handleRightClick(){this.handleDoubleClick()}handleEnter(){this.handleDoubleClick()}handleEsc(){this.clearAllPoints()}}class Ei extends Ge{handleClick(e){super.handleClick(e),this.points.length===2&&(this.manager.addMeasurement("distance",this.points),this.clearAllPoints())}handleMove(e){this.points.length===1&&this.manager.drawPreview("distance",[this.points[0],e])}}class Si extends Ge{handleClick(e){super.handleClick(e),this.manager.drawPreview("area",this.points)}handleMove(e){this.points.length>0&&this.manager.drawPreview("area",[...this.points,e])}handleDoubleClick(){const e=this.manager.removeTrailingDuplicatePoint(this.points);e.length>=3&&this.manager.addMeasurement("area",e),this.clearAllPoints()}}class Ti extends Ge{handleClick(e){super.handleClick(e),this.points.length===3&&(this.manager.addMeasurement("angle",this.points),this.clearAllPoints())}handleMove(e){this.points.length>=2&&this.manager.drawPreview("angle",[...this.points,e])}}class Ai{distanceMeasure;areaMeasure;angleMeasure;annotationData={distanceAnnotation:[],areaAnnotation:[],angleAnnotation:[]};engine;container;annotationContainer;setting={...pt};isActive=!1;currentTool=null;previewRecord=null;mouseDownPoint=null;hasDraggedAfterMouseDown=!1;currentWorkspaceKey="model";constructor(e){this.engine=e,this.container=e.container,this.distanceMeasure=new Ei(this),this.areaMeasure=new Si(this),this.angleMeasure=new Ti(this),this.annotationContainer=document.createElement("div"),this.annotationContainer.className="annotation-container",this.annotationContainer.style.pointerEvents="none",this.annotationContainer.style.zIndex="20",this.container.appendChild(this.annotationContainer)}active(){if(this.isActive)return;this.isActive=!0,this.engine.interactionModule2d?.disActive?.();const e=this.engine.renderer.domElement;e.addEventListener("mousedown",this.handleMouseDown,!0),e.addEventListener("click",this.handleClick,!0),e.addEventListener("mousemove",this.handleMove,!0),e.addEventListener("dblclick",this.handleDoubleClick,!0),e.addEventListener("contextmenu",this.handleContextMenu,!0),window.addEventListener("keydown",this.handleKeyDown,!0)}disActive(){if(!this.isActive)return;this.quitDraw(),this.isActive=!1;const e=this.engine.renderer.domElement;e.removeEventListener("mousedown",this.handleMouseDown,!0),e.removeEventListener("click",this.handleClick,!0),e.removeEventListener("mousemove",this.handleMove,!0),e.removeEventListener("dblclick",this.handleDoubleClick,!0),e.removeEventListener("contextmenu",this.handleContextMenu,!0),window.removeEventListener("keydown",this.handleKeyDown,!0),this.engine.interactionModule2d?.active?.(),this.clearAll()}quitDraw(){this.currentTool?.disActive(),this.currentTool=null,this.clearPreview()}activate(e){this.active(),this.disActiveMeasureTools(),e==="distance"&&this.distanceMeasure.active(),e==="area"&&this.areaMeasure.active(),e==="angle"&&this.angleMeasure.active()}clearAllPoints(){this.distanceMeasure.clearAllPoints(),this.areaMeasure.clearAllPoints(),this.angleMeasure.clearAllPoints()}clearAll(){Object.values(this.annotationData).forEach(e=>this.removeRecords(e,t=>t.workspaceKey===this.currentWorkspaceKey)),this.clearPreview()}cancelCurrentSelectedAnnotation(){Object.values(this.annotationData).flat().forEach(e=>{e.highlight=!1,this.applyRecordHighlight(e,!1)})}saveSetting(e){this.setting={...this.setting,...e,precision:this.normalizePrecision(e.precision??this.setting.precision),scale:Number.isFinite(e.scale)&&e.scale>0?e.scale:this.setting.scale},this.refreshLabels()}setPrecision(e){this.saveSetting({precision:e})}getSetting(){return{...this.setting}}update(){this.updateRecords(Object.values(this.annotationData).flat().filter(e=>e.workspaceKey===this.currentWorkspaceKey)),this.previewRecord&&this.updateRecordSvg(this.previewRecord)}setWorkspace(e){!e||e===this.currentWorkspaceKey||(this.clearPreview(),this.cancelCurrentSelectedAnnotation(),this.currentWorkspaceKey=e,this.refreshWorkspaceVisibility())}dispose(){this.disActive(),this.clearAll(),this.annotationContainer.remove()}setCurrentTool(e){this.currentTool=e}drawPreview(e,t){this.clearPreview(),!(t.length<2)&&(this.previewRecord=this.createRecord(e,t,!0),this.annotationContainer.appendChild(this.previewRecord.container),this.updateRecordSvg(this.previewRecord))}clearPreview(){this.previewRecord?.container.remove(),this.previewRecord=null}addMeasurement(e,t){const i=this.createRecord(e,t,!1);return this.annotationContainer.appendChild(i.container),this.getRecords(e).push(i),this.updateRecordSvg(i),this.engine.events?.trigger?.("measure-changed",i),i}deleteSelected(){Object.values(this.annotationData).forEach(e=>{for(let t=e.length-1;t>=0;t--)e[t].workspaceKey===this.currentWorkspaceKey&&e[t].highlight&&(e[t].container.remove(),e.splice(t,1))})}removeTrailingDuplicatePoint(e){if(e.length<2)return e.map(r=>r.clone());const t=e.map(r=>r.clone()),i=t[t.length-1],n=t[t.length-2];return i.distanceTo(n)<1e-6&&t.pop(),t}disActiveMeasureTools(){this.distanceMeasure.disActive(),this.areaMeasure.disActive(),this.angleMeasure.disActive()}handleMouseDown=e=>{this.mouseDownPoint=new _.Vector2(e.clientX,e.clientY),this.hasDraggedAfterMouseDown=!1};handleClick=e=>{!this.currentTool||this.hasDraggedAfterMouseDown||(e.preventDefault(),e.stopImmediatePropagation(),this.currentTool.handleClick(this.eventToWorld(e)))};handleMove=e=>{this.currentTool&&(this.mouseDownPoint&&new _.Vector2(e.clientX,e.clientY).distanceTo(this.mouseDownPoint)>3&&(this.hasDraggedAfterMouseDown=!0),this.currentTool.handleMove(this.eventToWorld(e)))};handleDoubleClick=e=>{this.currentTool&&(e.preventDefault(),e.stopImmediatePropagation(),this.currentTool.handleDoubleClick())};handleContextMenu=e=>{this.currentTool&&(e.preventDefault(),e.stopImmediatePropagation(),this.currentTool.handleRightClick())};handleKeyDown=e=>{this.isActive&&(e.key==="Escape"&&(e.preventDefault(),e.stopImmediatePropagation(),this.currentTool?.handleEsc(),this.disActive(),this.engine.events?.trigger?.("quit_measure_draw",!0),window.dispatchEvent(new CustomEvent("D2MeasureQuit"))),(e.key==="Delete"||e.key==="Backspace")&&(e.preventDefault(),e.stopImmediatePropagation(),this.deleteSelected()),e.key==="Enter"&&this.currentTool&&(e.preventDefault(),this.currentTool.handleEnter()))};eventToWorld(e){const t=this.engine.renderer.domElement.getBoundingClientRect(),i=this.engine.cameraModule2d.screenToWorld(e.clientX-t.left,e.clientY-t.top);return i.z=0,i}createRecord(e,t,i){const n=document.createElement("div");n.className=`${e}-annotation`,n.style.position="absolute",n.style.left="0px",n.style.top="0px",n.style.pointerEvents="none";const r=this.createSvg(e);i&&(r.style.opacity="0.65"),n.appendChild(r);const s=this.computeValue(e,t),o={id:this.createId(),type:e,workspaceKey:this.currentWorkspaceKey,points:t.map(a=>a.clone()),container:n,svg:r,value:s,text:this.formatValue(e,s),isSelect:i};return i||this.bindRecordSelection(o),o}createSvg(e){const t=document.createElementNS("http://www.w3.org/2000/svg","svg");if(t.classList.add("measureSvg"),t.style.left="0",t.style.top="0",t.style.pointerEvents="none",e==="area"){const o=this.svgElement("polygon");o.setAttribute("fill","rgba(0, 155, 234, 0.12)"),o.setAttribute("stroke","none"),t.appendChild(o)}const i=e==="angle"?2:1;for(let o=0;o<i;o++){const a=this.svgElement("polyline");a.classList.add("measureLine"),a.setAttribute("stroke-width","2"),a.setAttribute("style","fill: none; opacity: 1;"),t.appendChild(a)}const n=e==="angle"?3:e==="distance"?2:0;for(let o=0;o<n;o++){const a=this.svgElement("circle");a.classList.add("measurePointer"),a.setAttribute("r","5"),t.appendChild(a)}const r=this.svgElement("rect");r.classList.add("measureBack"),r.setAttribute("width","100"),r.setAttribute("height","25"),r.style.pointerEvents="auto",r.style.cursor="pointer",t.appendChild(r);const s=this.svgElement("text");return s.classList.add("measureLabel"),s.setAttribute("text-anchor","middle"),t.appendChild(s),t}bindRecordSelection(e){e.svg.getElementsByTagName("rect")[0].addEventListener("click",i=>{i.preventDefault(),i.stopPropagation(),this.cancelCurrentSelectedAnnotation(),e.highlight=!0,this.applyRecordHighlight(e,!0),this.engine.events?.trigger?.("measure-click",e)})}applyRecordHighlight(e,t){[e.svg,...Array.from(e.svg.getElementsByTagName("polyline")),...Array.from(e.svg.getElementsByTagName("circle")),...Array.from(e.svg.getElementsByTagName("polygon")),...Array.from(e.svg.getElementsByTagName("rect")),...Array.from(e.svg.getElementsByTagName("text"))].forEach(n=>{n.classList.toggle("Hight",t),n.classList.toggle("measure-2d-selected",t)})}svgElement(e){return document.createElementNS("http://www.w3.org/2000/svg",e)}updateRecords(e){e.forEach(t=>this.updateRecordSvg(t))}updateRecordSvg(e){const t=this.container.clientWidth||1,i=this.container.clientHeight||1;e.svg.setAttribute("width",`${t}`),e.svg.setAttribute("height",`${i}`),e.svg.style.width=`${t}px`,e.svg.style.height=`${i}px`;const n=e.points.map(r=>this.worldToScreen(r));e.type==="distance"&&this.updateDistanceSvg(e,n),e.type==="area"&&this.updateAreaSvg(e,n),e.type==="angle"&&this.updateAngleSvg(e,n)}updateDistanceSvg(e,t){const[i,n]=t,r=e.svg.getElementsByTagName("polyline")[0],s=e.svg.getElementsByTagName("circle");r.setAttribute("points",`${i.x},${i.y} ${n.x},${n.y}`),s[0].setAttribute("cx",`${i.x}`),s[0].setAttribute("cy",`${i.y}`),s[1].setAttribute("cx",`${n.x}`),s[1].setAttribute("cy",`${n.y}`),this.updateLabel(e,(i.x+n.x)/2,(i.y+n.y)/2)}updateAreaSvg(e,t){const i=t.map(o=>`${o.x},${o.y}`).join(" "),r=(t.length>=3?[...t,t[0]]:t).map(o=>`${o.x},${o.y}`).join(" ");e.svg.getElementsByTagName("polygon")[0].setAttribute("points",t.length>=3?i:""),e.svg.getElementsByTagName("polyline")[0].setAttribute("points",r);const s=t.reduce((o,a)=>(o.x+=a.x,o.y+=a.y,o),{x:0,y:0});this.updateLabel(e,s.x/t.length,s.y/t.length)}updateAngleSvg(e,t){const[i,n,r]=t,s=e.svg.getElementsByTagName("polyline"),o=e.svg.getElementsByTagName("circle");s[0].setAttribute("points",`${i.x},${i.y} ${n.x},${n.y}`),s[1].setAttribute("points",`${n.x},${n.y} ${r.x},${r.y}`),[i,n,r].forEach((a,l)=>{o[l].setAttribute("cx",`${a.x}`),o[l].setAttribute("cy",`${a.y}`)}),this.updateLabel(e,n.x,n.y-30)}updateLabel(e,t,i){e.value=this.computeValue(e.type,e.points),e.text=this.formatValue(e.type,e.value);const n=e.svg.getElementsByTagName("rect")[0],r=e.svg.getElementsByTagName("text")[0],s=Math.max(100,e.text.length*9+22);n.setAttribute("x",`${t-s/2}`),n.setAttribute("y",`${i-12.5}`),n.setAttribute("width",`${s}`),r.setAttribute("x",`${t}`),r.setAttribute("y",`${i+4}`),r.textContent=e.text}worldToScreen(e){return this.engine.cameraModule2d.worldToScreen(e.x,e.y)}computeValue(e,t){return e==="distance"?t[0].distanceTo(t[1])*this.setting.scale:e==="angle"?this.computeAngle(t[0],t[1],t[2]):this.computeArea(t)*this.setting.scale*this.setting.scale}computeArea(e){if(e.length<3)return 0;let t=0;for(let i=0;i<e.length;i++){const n=e[i],r=e[(i+1)%e.length];t+=n.x*r.y-r.x*n.y}return Math.abs(t)/2}computeAngle(e,t,i){const n=e.clone().sub(t).normalize(),r=i.clone().sub(t).normalize(),s=_.MathUtils.clamp(n.dot(r),-1,1);return _.MathUtils.radToDeg(Math.acos(s))}formatValue(e,t){return e==="angle"?`${t.toFixed(this.setting.precision)}°`:e==="area"?`${t.toFixed(this.setting.precision)} ${this.setting.areaUnit??`${this.setting.unit}²`}`:`${t.toFixed(this.setting.precision)} ${this.setting.unit}`}refreshLabels(){Object.values(this.annotationData).flat().filter(e=>e.workspaceKey===this.currentWorkspaceKey).forEach(e=>{e.value=this.computeValue(e.type,e.points),e.text=this.formatValue(e.type,e.value),this.updateRecordSvg(e)})}refreshWorkspaceVisibility(){Object.values(this.annotationData).flat().forEach(e=>{e.container.style.display=e.workspaceKey===this.currentWorkspaceKey?"":"none"})}removeRecords(e,t){for(let i=e.length-1;i>=0;i-=1)t(e[i])&&(e[i].container.remove(),e.splice(i,1))}getRecords(e){return e==="distance"?this.annotationData.distanceAnnotation:e==="area"?this.annotationData.areaAnnotation:this.annotationData.angleAnnotation}normalizePrecision(e){return Number.isFinite(e)?Math.max(0,Math.min(8,Math.round(e))):pt.precision}createId(){return`measure-2d-${Date.now()}-${Math.random().toString(16).slice(2)}`}}const He={stroke:"#ff4d4f",fill:"rgba(255, 77, 79, 0.08)",strokeWidth:2,fontSize:16,cloudRadius:10},Ii={none:xe("/assets/icon/选择.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),line:xe("/assets/icon/线.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),arrow:xe("/assets/icon/箭头.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),rect:xe("/assets/icon/矩形.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),ellipse:xe("/assets/icon/圆形.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),polygon:xe("/assets/icon/面积.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),text:xe("/assets/icon/文字.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),cloudline:xe("/assets/icon/云线.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href)},Li="data:image/svg+xml;utf8,"+encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#1f2937" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 6h18"/><path d="M8 6V4h8v2"/><path d="M6 6l1 16h10l1-16"/><path d="M10 11v6"/><path d="M14 11v6"/></svg>'),Pi="data:image/svg+xml;utf8,"+encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#1f2937" stroke-width="2" stroke-linecap="round"><path d="M6 6l12 12"/><path d="M18 6L6 18"/></svg>');class Di{engine;container;layer;svg;toolbar;records=[];isActive=!1;currentType=null;style={...He};draft=null;draftStart=null;polygonPoints=[];currentWorkspaceKey="model";mouseDownPoint=null;hasDraggedAfterMouseDown=!1;buttons={};constructor(e){this.engine=e,this.container=e.container,getComputedStyle(this.container).position==="static"&&(this.container.style.position="relative"),this.layer=document.createElement("div"),this.layer.className="markup-2d-layer",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("markup-2d-svg"),this.layer.appendChild(this.svg),this.toolbar=this.createToolbar(),this.layer.appendChild(this.toolbar),this.container.appendChild(this.layer)}active(e){if(this.engine.measure?.quitDraw?.(),!this.isActive){this.isActive=!0,this.engine.interactionModule2d?.disActive?.();const t=this.engine.renderer.domElement;t.addEventListener("mousedown",this.handleMouseDown,!0),t.addEventListener("mousemove",this.handleMouseMove,!0),t.addEventListener("mouseup",this.handleMouseUp,!0),t.addEventListener("click",this.handleClick,!0),t.addEventListener("dblclick",this.handleDoubleClick,!0),t.addEventListener("wheel",this.blockDrawingEvent,!0),t.addEventListener("touchstart",this.blockDrawingEvent,!0),t.addEventListener("touchmove",this.blockDrawingEvent,!0),window.addEventListener("keydown",this.handleKeyDown,!0)}this.showToolbar(),e&&this.setDrawType(e)}show(){this.active()}hide(){this.hideToolbar(),this.disActive()}disActive(){if(!this.isActive)return;this.isActive=!1,this.currentType=null,this.clearDraft(),this.polygonPoints=[],this.syncToolbar();const e=this.engine.renderer.domElement;e.removeEventListener("mousedown",this.handleMouseDown,!0),e.removeEventListener("mousemove",this.handleMouseMove,!0),e.removeEventListener("mouseup",this.handleMouseUp,!0),e.removeEventListener("click",this.handleClick,!0),e.removeEventListener("dblclick",this.handleDoubleClick,!0),e.removeEventListener("wheel",this.blockDrawingEvent,!0),e.removeEventListener("touchstart",this.blockDrawingEvent,!0),e.removeEventListener("touchmove",this.blockDrawingEvent,!0),window.removeEventListener("keydown",this.handleKeyDown,!0),this.engine.interactionModule2d?.active?.()}setDrawType(e){this.currentType=e==="none"?null:e,this.clearDraft(),this.polygonPoints=[],this.syncToolbar()}update(){const e=this.container.clientWidth||1,t=this.container.clientHeight||1;this.svg.setAttribute("width",`${e}`),this.svg.setAttribute("height",`${t}`),this.svg.style.width=`${e}px`,this.svg.style.height=`${t}px`,this.records.forEach(i=>{i.element.style.display=i.data.workspaceKey===this.currentWorkspaceKey?"":"none",this.updateElement(i)}),this.draft&&this.updateElement(this.draft)}setWorkspace(e){!e||e===this.currentWorkspaceKey||(this.currentWorkspaceKey=e,this.clearDraft(),this.polygonPoints=[],this.cancelSelected(),this.update())}getData(){return this.records.map(e=>this.cloneData(e.data))}restoreData(e=[]){this.clearAll(!0),e.forEach(t=>this.addMarkup(t)),this.update()}get(){return{cameraViewState:this.engine.cameraModule2d?.getViewState?.()??null,markupData:this.getData()}}restore(e){e&&(e.cameraViewState&&this.engine.cameraModule2d?.applyViewState?.(e.cameraViewState),this.restoreData(e.markupData??[]))}addMarkup(e){const t={id:e.id??this.createId(),type:e.type,workspaceKey:e.workspaceKey??this.currentWorkspaceKey,points:e.points.map(n=>({x:n.x,y:n.y,z:n.z??0})),text:e.text,style:{...this.style,...e.style??{}}},i=this.createRecord(t);return this.records.push(i),this.svg.appendChild(i.element),this.updateElement(i),this.engine.events?.trigger?.("markup-changed",this.cloneData(t)),this.cloneData(t)}clearAll(e=!1){for(let t=this.records.length-1;t>=0;t-=1){const i=this.records[t];!e&&i.data.workspaceKey!==this.currentWorkspaceKey||(i.element.remove(),this.records.splice(t,1))}this.clearDraft()}deleteSelected(){for(let e=this.records.length-1;e>=0;e-=1)this.records[e].selected&&(this.records[e].element.remove(),this.records.splice(e,1));this.engine.events?.trigger?.("markup-changed",this.getData())}dispose(){this.disActive(),this.records.forEach(e=>e.element.remove()),this.records=[],this.layer.remove()}blockDrawingEvent=e=>{this.currentType&&(e instanceof MouseEvent&&this.engine.cadCursorUI?.updateFromMouseEvent?.(e),e.preventDefault(),e.stopImmediatePropagation())};handleMouseDown=e=>{this.currentType&&(this.blockDrawingEvent(e),this.mouseDownPoint=new _.Vector2(e.clientX,e.clientY),this.hasDraggedAfterMouseDown=!1)};handleMouseMove=e=>{if(this.currentType){if(this.blockDrawingEvent(e),this.mouseDownPoint&&e.buttons!==0){const t=new _.Vector2(e.clientX,e.clientY);this.hasDraggedAfterMouseDown=t.distanceTo(this.mouseDownPoint)>3}if(this.isMultiPointType(this.currentType)&&this.polygonPoints.length>0){this.drawMultiPointDraft(this.eventToWorld(e));return}!this.draft||!this.draftStart||(this.draft.data.points=[this.pointToData(this.draftStart),this.pointToData(this.eventToWorld(e))],this.updateElement(this.draft))}};handleMouseUp=e=>{this.currentType&&(this.blockDrawingEvent(e),this.mouseDownPoint=null)};handleClick=e=>{if(this.currentType&&(this.blockDrawingEvent(e),!this.hasDraggedAfterMouseDown)){if(this.currentType==="text"){const t=window.prompt("请输入标记文字","文字")??"";t.trim()&&this.addMarkup({type:"text",points:[this.pointToData(this.eventToWorld(e))],text:t.trim()});return}if(this.isTwoPointType(this.currentType)){const t=this.eventToWorld(e);this.draftStart?this.finishTwoPointDraft(t):this.startTwoPointDraft(t);return}this.isMultiPointType(this.currentType)&&(this.polygonPoints.push(this.eventToWorld(e)),this.drawMultiPointDraft())}};handleDoubleClick=e=>{if(!this.currentType||!this.isMultiPointType(this.currentType))return;this.blockDrawingEvent(e);const t=this.currentType==="cloudline"?2:3,i=this.removeTrailingDuplicatePoints(this.polygonPoints);i.length>=t&&this.addMarkup({type:this.currentType,points:i.map(n=>this.pointToData(n))}),this.polygonPoints=[],this.clearDraft()};handleKeyDown=e=>{if(this.isActive&&(e.key==="Escape"&&(e.preventDefault(),this.clearDraft(),this.polygonPoints=[],this.setDrawType("none")),(e.key==="Delete"||e.key==="Backspace")&&(e.preventDefault(),this.deleteSelected()),e.key==="Enter"&&this.currentType&&this.isMultiPointType(this.currentType))){e.preventDefault();const t=this.currentType==="cloudline"?2:3,i=this.removeTrailingDuplicatePoints(this.polygonPoints);i.length>=t&&this.addMarkup({type:this.currentType,points:i.map(n=>this.pointToData(n))}),this.polygonPoints=[],this.clearDraft()}};createToolbar(){const e=document.createElement("div");e.className="markup-2d-toolbar",[{type:"none",title:"选择"},{type:"line",title:"直线"},{type:"arrow",title:"箭头"},{type:"rect",title:"矩形"},{type:"ellipse",title:"圆形/椭圆"},{type:"polygon",title:"多边形,双击或 Enter 结束"},{type:"cloudline",title:"云线,双击或 Enter 结束"},{type:"text",title:"文字"}].forEach(a=>{const l=this.createIconButton(a.title,Ii[a.type]);l.onclick=()=>{this.active(),this.setDrawType(a.type)},a.type!=="none"&&(this.buttons[a.type]=l),e.appendChild(l)}),e.appendChild(this.createDivider());const i=document.createElement("input");i.type="color",i.value=this.style.stroke,i.title="颜色",i.oninput=()=>{this.style.stroke=i.value,this.style.fill=this.hexToTransparent(i.value)},e.appendChild(i);const n=document.createElement("input");n.type="number",n.min="1",n.max="20",n.value=`${this.style.strokeWidth}`,n.title="线宽",n.onchange=()=>{this.style.strokeWidth=this.normalizeNumber(n.valueAsNumber,1,20,He.strokeWidth)},e.appendChild(n);const r=document.createElement("input");r.type="number",r.min="10",r.max="72",r.value=`${this.style.fontSize}`,r.title="字号",r.onchange=()=>{this.style.fontSize=this.normalizeNumber(r.valueAsNumber,10,72,He.fontSize)},e.appendChild(r),e.appendChild(this.createDivider());const s=this.createIconButton("清空",Li);s.onclick=()=>this.clearAll(),e.appendChild(s);const o=this.createIconButton("关闭",Pi);return o.onclick=()=>{this.hideToolbar(),this.disActive()},e.appendChild(o),e}createDivider(){const e=document.createElement("div");return e.className="markup-2d-divider",e}createIconButton(e,t){const i=document.createElement("button");i.type="button",i.title=e,i.setAttribute("aria-label",e),i.classList.add("markup-2d-icon-button");const n=document.createElement("img");return n.src=t,n.alt=e,n.draggable=!1,i.appendChild(n),i}showToolbar(){this.toolbar.style.display="flex"}hideToolbar(){this.toolbar.style.display="none"}syncToolbar(){Object.entries(this.buttons).forEach(([e,t])=>{t?.classList.toggle("active",e===this.currentType)})}finishDraft(){if(!this.draft)return;const e=this.draft;this.draft=null,e.element.style.pointerEvents="auto",this.records.push(e),this.updateElement(e),this.engine.events?.trigger?.("markup-changed",this.cloneData(e.data))}clearDraft(){this.draft?.element.remove(),this.draft=null,this.draftStart=null}startTwoPointDraft(e){this.draftStart=e.clone(),this.draft=this.createRecord({id:this.createId(),type:this.currentType,workspaceKey:this.currentWorkspaceKey,points:[this.pointToData(e),this.pointToData(e)],style:{...this.style}}),this.draft.element.setAttribute("opacity","0.65"),this.draft.element.style.pointerEvents="none",this.svg.appendChild(this.draft.element),this.updateElement(this.draft)}finishTwoPointDraft(e){!this.draft||!this.draftStart||this.draftStart.distanceTo(e)<1e-6||(this.draft.data.points=[this.pointToData(this.draftStart),this.pointToData(e)],this.draft.element.removeAttribute("opacity"),this.finishDraft(),this.draftStart=null)}drawMultiPointDraft(e){if(this.clearDraft(),this.polygonPoints.length===0)return;const t=e?[...this.polygonPoints,e]:this.polygonPoints;this.draft=this.createRecord({id:this.createId(),type:this.currentType==="cloudline"?"cloudline":"polygon",workspaceKey:this.currentWorkspaceKey,points:t.map(i=>this.pointToData(i)),style:{...this.style}}),this.draft.element.setAttribute("opacity","0.65"),this.draft.element.style.pointerEvents="none",this.svg.appendChild(this.draft.element),this.updateElement(this.draft)}createRecord(e){const t=this.createElement(e.type);t.classList.add("markup-2d-shape");const i={data:this.cloneData(e),element:t};return this.applyStyle(i),this.bindSelection(i),i}createElement(e){return e==="rect"?this.svgElement("rect"):e==="ellipse"?this.svgElement("ellipse"):e==="text"?this.svgElement("text"):e==="polygon"||e==="cloudline"?this.svgElement("g"):this.svgElement("g")}bindSelection(e){e.element.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.cancelSelected(),e.selected=!0,e.element.classList.add("selected"),this.engine.events?.trigger?.("markup-click",this.cloneData(e.data))})}cancelSelected(){this.records.forEach(e=>{e.selected=!1,e.element.classList.remove("selected")})}updateElement(e){this.applyStyle(e);const t=e.data.points.map(i=>this.worldToScreen(i));e.data.type==="line"&&this.updateLine(e,t,!1),e.data.type==="arrow"&&this.updateLine(e,t,!0),e.data.type==="rect"&&this.updateRect(e,t),e.data.type==="ellipse"&&this.updateEllipse(e,t),e.data.type==="text"&&this.updateText(e,t[0]),e.data.type==="polygon"&&this.updatePolygon(e,t),e.data.type==="cloudline"&&this.updateCloudLine(e,t)}updateLine(e,t,i){const n=e.element;if(n.innerHTML="",t.length<2)return;const[r,s]=t,o=this.svgElement("line");if(o.setAttribute("x1",`${r.x}`),o.setAttribute("y1",`${r.y}`),o.setAttribute("x2",`${s.x}`),o.setAttribute("y2",`${s.y}`),this.applySvgPaint(o,e.data.style,!1),n.appendChild(o),e===this.draft&&this.drawVertexMarkers(n,t,e.data.style),!i)return;const a=this.createArrowHead(r,s,e.data.style.strokeWidth);this.applySvgPaint(a,e.data.style,!0),a.setAttribute("fill",e.data.style.stroke),n.appendChild(a)}updateRect(e,t){if(t.length<2)return;const[i,n]=t,r=e.element;r.setAttribute("x",`${Math.min(i.x,n.x)}`),r.setAttribute("y",`${Math.min(i.y,n.y)}`),r.setAttribute("width",`${Math.abs(n.x-i.x)}`),r.setAttribute("height",`${Math.abs(n.y-i.y)}`)}updateEllipse(e,t){if(t.length<2)return;const[i,n]=t,r=e.element;r.setAttribute("cx",`${(i.x+n.x)/2}`),r.setAttribute("cy",`${(i.y+n.y)/2}`),r.setAttribute("rx",`${Math.abs(n.x-i.x)/2}`),r.setAttribute("ry",`${Math.abs(n.y-i.y)/2}`)}updateText(e,t){const i=e.element;i.setAttribute("x",`${t.x}`),i.setAttribute("y",`${t.y}`),i.textContent=e.data.text??""}updatePolygon(e,t){const i=e.element;if(i.innerHTML="",t.length===0)return;const n=t.map(s=>`${s.x},${s.y}`).join(" "),r=t.length>=3?this.svgElement("polygon"):this.svgElement("polyline");r.setAttribute("points",n),this.applySvgPaint(r,e.data.style,t.length>=3),i.appendChild(r),e===this.draft&&this.drawVertexMarkers(i,t,e.data.style)}updateCloudLine(e,t){const i=e.element;if(i.innerHTML="",t.length===0)return;const n=this.svgElement("path");n.setAttribute("d",this.buildCloudPath(t,e.data.style.cloudRadius)),this.applySvgPaint(n,e.data.style,!1),i.appendChild(n),e===this.draft&&this.drawVertexMarkers(i,t,e.data.style)}drawVertexMarkers(e,t,i){t.forEach(n=>{const r=this.svgElement("circle");r.setAttribute("cx",`${n.x}`),r.setAttribute("cy",`${n.y}`),r.setAttribute("r",`${Math.max(3,i.strokeWidth+2)}`),r.setAttribute("fill",i.stroke),r.setAttribute("stroke","#ffffff"),r.setAttribute("stroke-width","1"),e.appendChild(r)})}applyStyle(e){e.data.type==="line"||e.data.type==="arrow"||e.data.type==="polygon"||e.data.type==="cloudline"||(this.applySvgPaint(e.element,e.data.style,e.data.type!=="text"&&e.data.type!=="cloudline"),e.data.type==="text"&&(e.element.setAttribute("font-size",`${e.data.style.fontSize}`),e.element.setAttribute("dominant-baseline","middle"),e.element.setAttribute("fill",e.data.style.stroke),e.element.setAttribute("stroke","none")))}applySvgPaint(e,t,i){e.setAttribute("stroke",t.stroke),e.setAttribute("stroke-width",`${t.strokeWidth}`),e.setAttribute("fill",i?t.fill:"none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round")}createArrowHead(e,t,i){const n=Math.atan2(t.y-e.y,t.x-e.x),r=Math.max(10,i*5),s={x:t.x-r*Math.cos(n-Math.PI/6),y:t.y-r*Math.sin(n-Math.PI/6)},o={x:t.x-r*Math.cos(n+Math.PI/6),y:t.y-r*Math.sin(n+Math.PI/6)},a=this.svgElement("polygon");return a.setAttribute("points",`${t.x},${t.y} ${s.x},${s.y} ${o.x},${o.y}`),a}buildCloudPath(e,t){if(e.length===0)return"";if(e.length===1)return`M ${e[0].x} ${e[0].y}`;const i=Math.max(4,t),n=[`M ${e[0].x} ${e[0].y}`];for(let r=0;r<e.length-1;r+=1){const s=e[r],o=e[r+1],a=o.x-s.x,l=o.y-s.y,h=Math.hypot(a,l);if(h<1e-6)continue;const f=Math.max(1,Math.ceil(h/(i*1.6)));for(let p=0;p<f;p+=1){const d=p/f,y=(p+1)/f,c=(d+y)/2,g={x:s.x+a*c-l/h*i*.7,y:s.y+l*c+a/h*i*.7},v={x:s.x+a*y,y:s.y+l*y};n.push(`Q ${g.x} ${g.y} ${v.x} ${v.y}`)}}return n.join(" ")}isMultiPointType(e){return e==="polygon"||e==="cloudline"}isTwoPointType(e){return e==="line"||e==="arrow"||e==="rect"||e==="ellipse"}removeTrailingDuplicatePoints(e){const t=e.map(i=>i.clone());for(;t.length>=2&&t[t.length-1].distanceTo(t[t.length-2])<1e-6;)t.pop();return t}eventToWorld(e){const t=this.engine.renderer.domElement.getBoundingClientRect(),i=this.engine.cameraModule2d.screenToWorld(e.clientX-t.left,e.clientY-t.top);return i.z=0,i}worldToScreen(e){return this.engine.cameraModule2d.worldToScreen(e.x,e.y)}pointToData(e){return{x:e.x,y:e.y,z:e.z}}svgElement(e){return document.createElementNS("http://www.w3.org/2000/svg",e)}cloneData(e){return{...e,points:e.points.map(t=>({...t})),style:{...e.style}}}hexToTransparent(e){const t=e.replace("#",""),i=parseInt(t.slice(0,2),16),n=parseInt(t.slice(2,4),16),r=parseInt(t.slice(4,6),16);return`rgba(${i}, ${n}, ${r}, 0.08)`}normalizeNumber(e,t,i,n){return Number.isFinite(e)?Math.max(t,Math.min(i,Math.round(e))):n}createId(){return`markup-2d-${Date.now()}-${Math.random().toString(16).slice(2)}`}}class zi{container;labelContainer;projectCoordinate;pickCoordinate;emitEvent;labels=new Map;clickCallbacks=new Set;pickResolver=null;isPicking=!1;constructor(e){this.container=e.container,this.projectCoordinate=e.projectCoordinate,this.pickCoordinate=e.pickCoordinate,this.emitEvent=e.emitEvent,this.labelContainer=document.createElement("div"),this.labelContainer.className=e.className??"bim-engine-label-container",this.labelContainer.style.cssText=["position:absolute","left:0","top:0","width:100%","height:100%","pointer-events:none","overflow:hidden","z-index:1200"].join(";"),this.container.appendChild(this.labelContainer)}pickPoint(){return this.cancelPick(),this.isPicking=!0,this.container.style.cursor="crosshair",this.addPickBlockers(),this.container.addEventListener("click",this.handlePickClick,!0),new Promise(e=>{this.pickResolver=e})}startPickPoint(e){const t=this.pickPoint();return e&&t.then(e),t}createLabel(e){const t=e.id??this.createId();if(this.labels.has(t))throw new Error(`LabelManager: label "${t}" already exists`);const i=this.createElement(t),n={id:t,coordinate:{...e.coordinate},icon:e.icon,name:e.name,data:e.data,size:e.iconSize??e.size??28,visible:e.visible??!0,element:i};return this.labels.set(t,n),this.labelContainer.appendChild(i),this.renderLabel(n),this.updateLabelPosition(n),this.emitEvent?.("label-created",this.toPayload(n)),t}updateLabel(e,t){const i=this.labels.get(e);return i?(t.coordinate&&(i.coordinate={...t.coordinate}),t.icon!==void 0&&(i.icon=t.icon),t.name!==void 0&&(i.name=t.name),t.data!==void 0&&(i.data=t.data),t.iconSize!==void 0&&(i.size=t.iconSize),t.size!==void 0&&(i.size=t.size),t.visible!==void 0&&(i.visible=t.visible),this.renderLabel(i),this.updateLabelPosition(i),this.emitEvent?.("label-updated",this.toPayload(i)),!0):!1}deleteLabel(e){const t=this.labels.get(e);return t?(t.element.remove(),this.labels.delete(e),this.emitEvent?.("label-deleted",{id:e}),!0):!1}removeLabel(e){return this.deleteLabel(e)}clearLabels(){Array.from(this.labels.keys()).forEach(e=>this.deleteLabel(e))}getLabel(e){return this.labels.get(e)}getLabels(){return Array.from(this.labels.values())}onLabelClick(e){return this.clickCallbacks.add(e),()=>this.offLabelClick(e)}offLabelClick(e){this.clickCallbacks.delete(e)}update(){this.labels.forEach(e=>this.updateLabelPosition(e))}cancelPick(){this.isPicking&&(this.isPicking=!1,this.container.style.cursor="",this.removePickBlockers(),this.container.removeEventListener("click",this.handlePickClick,!0),this.pickResolver?.(null),this.pickResolver=null)}dispose(){this.cancelPick(),this.clearLabels(),this.clickCallbacks.clear(),this.labelContainer.remove()}createElement(e){const t=document.createElement("div");return t.dataset.labelId=e,t.style.cssText=["position:absolute","display:flex","flex-direction:column","align-items:center","gap:5px","transform:translate(-50%, -100%)","pointer-events:auto","cursor:pointer","user-select:none","white-space:nowrap","font:12px/1.2 -apple-system,BlinkMacSystemFont,Segoe UI,Arial,sans-serif"].join(";"),t.addEventListener("click",i=>{i.preventDefault(),i.stopPropagation();const n=this.labels.get(e);if(!n)return;const r={id:e,label:n,coordinate:n.coordinate,originalEvent:i};this.clickCallbacks.forEach(s=>s(r)),this.emitEvent?.("label-click",r)}),t}renderLabel(e){e.element.innerHTML="";const t=document.createElement("img"),i=this.normalizeIconSize(e.size);t.src=e.icon,t.alt=e.name,t.style.cssText=[`width:${i.width}px`,`height:${i.height}px`,"object-fit:contain","display:block","filter:drop-shadow(0 3px 5px rgba(0,0,0,.32))"].join(";");const n=document.createElement("span");n.textContent=e.name,n.style.cssText=["max-width:160px","overflow:hidden","text-overflow:ellipsis","padding:5px 9px","border-radius:6px","background:rgba(15,23,42,.88)","color:#fff","border:1px solid rgba(255,255,255,.16)","box-shadow:0 3px 10px rgba(0,0,0,.24)"].join(";"),e.element.title=e.name,e.element.appendChild(n),e.element.appendChild(t)}updateLabelPosition(e){const t=this.projectCoordinate(e.coordinate);if(!(e.visible&&t!=null&&t.visible!==!1)||!t){e.element.style.display="none";return}e.element.style.display="flex",e.element.style.left=`${t.x}px`,e.element.style.top=`${t.y}px`}handlePickClick=e=>{e.preventDefault(),e.stopImmediatePropagation();const t=this.pickCoordinate(e);this.isPicking=!1,this.container.style.cursor="",this.removePickBlockers(),this.container.removeEventListener("click",this.handlePickClick,!0),this.pickResolver?.(t),this.pickResolver=null,t&&this.emitEvent?.("label-pick",t)};toPayload(e){return{id:e.id,coordinate:e.coordinate,icon:e.icon,name:e.name,data:e.data,size:e.size,visible:e.visible}}normalizeIconSize(e){return typeof e=="number"?{width:e,height:e}:{width:this.normalizeSizeValue(e.width,28),height:this.normalizeSizeValue(e.height,28)}}normalizeSizeValue(e,t){return Number.isFinite(e)&&e>0?e:t}createId(){return`label-${Date.now()}-${Math.random().toString(16).slice(2)}`}addPickBlockers(){this.container.addEventListener("mousedown",this.blockPickInteraction,!0),this.container.addEventListener("mouseup",this.blockPickInteraction,!0),this.container.addEventListener("touchstart",this.blockPickInteraction,!0),this.container.addEventListener("touchmove",this.blockPickInteraction,!0),this.container.addEventListener("touchend",this.blockPickInteraction,!0)}removePickBlockers(){this.container.removeEventListener("mousedown",this.blockPickInteraction,!0),this.container.removeEventListener("mouseup",this.blockPickInteraction,!0),this.container.removeEventListener("touchstart",this.blockPickInteraction,!0),this.container.removeEventListener("touchmove",this.blockPickInteraction,!0),this.container.removeEventListener("touchend",this.blockPickInteraction,!0)}blockPickInteraction=e=>{e.stopImmediatePropagation()}}class Bi{engine;manager;constructor(e){this.engine=e,this.manager=new zi({container:e.container,className:"bim-engine-label-container bim-engine-label-container-2d",projectCoordinate:t=>this.projectCoordinate(t),pickCoordinate:t=>this.pickCoordinate(t),emitEvent:(t,i)=>this.engine.events?.trigger?.(t,i)})}pickPoint(){return this.manager.pickPoint()}startPickPoint(e){return this.manager.startPickPoint(e)}createLabel(e){return this.manager.createLabel(e)}updateLabel(e,t){return this.manager.updateLabel(e,t)}deleteLabel(e){return this.manager.deleteLabel(e)}removeLabel(e){return this.manager.removeLabel(e)}clearLabels(){this.manager.clearLabels()}getLabel(e){return this.manager.getLabel(e)}getLabels(){return this.manager.getLabels()}onLabelClick(e){return this.manager.onLabelClick(e)}offLabelClick(e){this.manager.offLabelClick(e)}update(){this.manager.update()}dispose(){this.manager.dispose()}projectCoordinate(e){const t=this.engine.cameraModule2d.worldToScreen(e.x??0,e.y??0),i=this.engine.renderer.domElement.clientWidth,n=this.engine.renderer.domElement.clientHeight;return{x:t.x,y:t.y,visible:t.x>=0&&t.x<=i&&t.y>=0&&t.y<=n}}pickCoordinate(e){const t=this.engine.renderer.domElement.getBoundingClientRect(),i=this.engine.cameraModule2d.screenToWorld(e.clientX-t.left,e.clientY-t.top);return{x:i.x,y:i.y,z:0}}}class Ri{engine;mainViewPort=null;constructor(e){this.engine=e}saveMainViewPort(){const e=this.engine.cameraModule2d;return e?(this.mainViewPort={activeCamera:"orthographic",orthographicCamera:e.getViewState()},this.mainViewPort):null}setMainViewPort(e){this.mainViewPort=this.normalizeMainViewPort(e),this.goToMainPort()}goToMainPort(){const e=this.mainViewPort;e&&this.engine.cameraModule2d?.applyViewState(e.orthographicCamera)}resetMainViewPort(){this.mainViewPort=null,this.engine.resetView?.(),this.engine.fitToView?.()}normalizeMainViewPort(e){if(!e)return null;const t=e;return t.orthographicCamera?t:{activeCamera:"orthographic",orthographicCamera:e}}}class Ni{constructor(e,t){this.container=e,this.engine=t,this.el=document.createElement("div"),this.el.className="engine-2d-workspace-tabs",this.container.appendChild(this.el),this.unsubscribe=this.engine.events?.on(me.ModelLoaded,()=>this.refresh())??(()=>{}),this.refresh()}el;unsubscribe;loading=!1;refresh(){const e=this.engine.getLayouts?.()??[],t=this.engine.loaderModule2d?.getActiveWorkspace?.()??{type:"model"};this.el.innerHTML="",this.el.appendChild(this.createTab("模型",t.type==="model",()=>this.switchToModelSpace())),e.forEach((i,n)=>{const r=i.name||`布局${n+1}`;this.el.appendChild(this.createTab(r,t.type==="layout"&&t.layoutId===i.id,()=>this.switchToLayout(i.id)))}),this.el.style.display=e.length>0?"flex":"none"}createTab(e,t,i){const n=document.createElement("button");return n.type="button",n.className="engine-2d-workspace-tabs__item",n.classList.toggle("engine-2d-workspace-tabs__item--active",t),n.textContent=e,n.title=e,n.disabled=this.loading||t,n.addEventListener("click",i),n}async switchToModelSpace(){this.loading||await this.runSwitch(()=>this.engine.showModelSpace?.())}async switchToLayout(e){this.loading||await this.runSwitch(()=>this.engine.loadLayout?.(e))}async runSwitch(e){this.loading=!0,this.refresh();try{await e()}finally{this.loading=!1,this.refresh()}}dispose(){this.unsubscribe(),this.el.remove()}}const Ee={version:"3.9.204"}.version;function $e(){const b=globalThis.crypto?.subtle;if(!b)throw new Error("[BimEngine] Web Crypto API is required for secure sdkAuth credentials mode");return b}function Se(b){return new TextEncoder().encode(b)}function Te(b){return b.buffer.slice(b.byteOffset,b.byteOffset+b.byteLength)}function mt(b){let e="";return b.forEach(t=>{e+=String.fromCharCode(t)}),btoa(e)}function Oi(b){const e=b.getUTCFullYear(),t=String(b.getUTCMonth()+1).padStart(2,"0"),i=String(b.getUTCDate()).padStart(2,"0");return`${e}${t}${i}`}async function Ui(b){const e=await $e().digest("SHA-256",Te(Se(b)));return Array.from(new Uint8Array(e)).map(t=>t.toString(16).padStart(2,"0")).join("")}async function Vi(b,e){const t=$e(),i=await t.importKey("raw",Te(b),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return t.sign("HMAC",i,Te(Se(e)))}function ji(b){return Se([b.appId,b.engineType,b.requestDate,String(b.timestamp),b.nonce].join("|"))}async function Wi(b){const e=$e(),t=new Date,i=t.getTime(),n=Oi(t),r=globalThis.crypto.randomUUID(),s=globalThis.crypto.getRandomValues(new Uint8Array(12)),o=await Ui(b.appSecret),a=await Vi(Se(o),n),l=await e.importKey("raw",a,"AES-GCM",!1,["encrypt"]),h=JSON.stringify({appKey:b.appKey,appSecret:b.appSecret}),f=await e.encrypt({name:"AES-GCM",iv:s,additionalData:Te(ji({appId:b.appId,engineType:b.engineType,requestDate:n,timestamp:i,nonce:r})),tagLength:128},l,Te(Se(h)));return{appId:b.appId,engineType:b.engineType,requestDate:n,timestamp:i,nonce:r,iv:mt(s),cipherText:mt(new Uint8Array(f)),sdkVersion:b.sdkVersion,origin:b.origin,product:b.product}}const Ze=new Map;function Ne(b){return b.replace(/\/+$/,"")}function Oe(b){if(b)return b;if(typeof window<"u"&&typeof window.location?.origin=="string")return window.location.origin}function Fi(b,e){return JSON.stringify({endpoint:Ne(b.endpoint),token:b.token??"",appId:b.appId??"",appKey:b.appKey??"",appSecret:b.appSecret??"",origin:Oe(b.origin)??"",product:b.product??"",engineType:e,sdkVersion:Ee})}async function Ye(b,e,t){const i=typeof AbortController<"u"?new AbortController:void 0,n=i?setTimeout(()=>i.abort(),t):void 0;try{const r=await fetch(b,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:i?.signal}),s=await r.json().catch(()=>({}));if(!r.ok){const o=s?.error?.message??s?.message??`SDK authentication failed with status ${r.status}`;throw new Error(o)}return s}finally{n!=null&&clearTimeout(n)}}async function Gi(b,e){const t=await Ye(`${Ne(b.endpoint)}/oauth/sdk-verify`,{sdkToken:b.token,engineType:e,sdkVersion:Ee,origin:Oe(b.origin),product:b.product},b.timeoutMs??8e3);return t.sdkToken=b.token,t}async function Hi(b,e){const t=await Wi({appId:b.appId,appKey:b.appKey,appSecret:b.appSecret,engineType:e,sdkVersion:Ee,origin:Oe(b.origin),product:b.product}),i=await Ye(`${Ne(b.endpoint)}/oauth/sdk-token/secure`,t,b.timeoutMs??8e3),n=await Ye(`${Ne(b.endpoint)}/oauth/sdk-verify`,{sdkToken:i.sdkToken,engineType:e,sdkVersion:Ee,origin:Oe(b.origin),product:b.product},b.timeoutMs??8e3);return n.sdkToken=i.sdkToken,n}async function $i(b,e){const t=b?.sdkAuth;if(!t)throw new Error("[BimEngine] sdkAuth is required. Provide sdkAuth.token or sdkAuth.appId/appKey/appSecret");if(!t.endpoint)throw new Error("[BimEngine] sdkAuth.endpoint is required");if(!t.token&&!(t.appId&&t.appKey&&t.appSecret))throw new Error("[BimEngine] Provide sdkAuth.token or sdkAuth.appId/appKey/appSecret");const i=Fi(t,e),n=Ze.get(i);if(n){const s=await n;return b&&(b.__sdkAuthSession=s),s}const r=(t.token?Gi(t,e):Hi(t,e)).then(s=>{if(s.authorized!==!0)throw new Error("[BimEngine] SDK authorization rejected");return b&&(b.__sdkAuthSession=s),s}).catch(s=>{throw Ze.delete(i),s});return Ze.set(i,r),r}function Zi(b){return b.replace(/\/+$/,"")}async function Yi(b,e,t){const i=typeof AbortController<"u"?new AbortController:void 0,n=i?setTimeout(()=>i.abort(),t):void 0;try{const r=await fetch(b,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:i?.signal}),s=await r.json().catch(()=>({}));if(!r.ok){const o=s?.error?.message??s?.message??`ViewToken resolve failed with status ${r.status}`;throw new Error(o)}return s}finally{n!=null&&clearTimeout(n)}}async function Ki(b,e,t){const i=await $i(b,t),n=b?.sdkAuth;if(!n?.endpoint)throw new Error("[BimEngine] sdkAuth.endpoint is required for viewToken loading");if(!i?.sdkToken)throw new Error("[BimEngine] sdkToken is missing after SDK authorization");return Yi(`${Zi(n.endpoint)}/models/view-token/resolve`,{sdkToken:i.sdkToken,viewToken:e,engineType:t},n.timeoutMs??8e3)}class gt{options;container=null;animationId=null;isRendering=!1;fpsFrameCount=0;fpsLastCheck=0;currentFps=0;enablePerformanceMonitoring=!1;stats;modelToolModule2d;engineStatus2d;octreeBox2d;events;handelBehaved2d;interactionModule2d;sceneModule2d;cameraModule2d;renderModule2d;controlModule2d;loaderModule2d;layerManager;searchManager;themeManager;measure;markup;label;viewCube;cadCursorUI;contextMenuUI;loadingUI;workspaceTabsUI;versionEl=null;linkView2d3d;linkElement2d3d;scene=null;camera=null;renderer=null;dwgData=null;version=Ee;constructor(e){if(this.options=e,this.options.backgroundColor=this.options.backgroundColor??1710618,this.options.enablePerformanceMonitoring=this.options.enablePerformanceMonitoring??!1,this.options.showMouseCoordinates=this.options.showMouseCoordinates??!1,this.options.loadingStyle=this.options.loadingStyle??2,this.options.contextMenu=this.options.contextMenu??{items:[{action:"hideElement",label:"隐藏模型"},{action:"showAll",label:"显示全部"},{action:"hideLayer",label:"隐藏图层"},{action:"showAllLayers",label:"显示所有图层"},{action:"toggleBg",label:"切换背景"},{action:"layerManage",label:"图层管理"},{action:"linkElement2d3d",label:"模型联动",dividerBefore:!0}]},this.enablePerformanceMonitoring=e.enablePerformanceMonitoring??!1,this.container=document.getElementById(e.containerId),!this.container)throw new Error(`Container ${e.containerId} not found`);this.initialize(),this.handelBehaved2d=mi(this),this.interactionModule2d=new yi(this),this.interactionModule2d.init(),this.interactionModule2d.active()}initialize(){this.events=new Et(!1),this.sceneModule2d=new It(this,this.options),this.scene=this.sceneModule2d.scene,this.cameraModule2d=new Pt(this,this.container),this.camera=this.cameraModule2d.orthographicCamera,this.renderModule2d=new Dt(this,this.container,this.options),this.renderer=this.renderModule2d.renderer,this.controlModule2d=new Bt(this),this.loaderModule2d=new hi(this),this.themeManager=new Ci(this.container),this.layerManager=new tt(this),this.searchManager=new _i(this),this.measure=new Ai(this),this.markup=new Di(this),this.label=new Bi(this),this.viewCube=new Ri(this),this.octreeBox2d=new di(this),this.modelToolModule2d=new pi(this),this.engineStatus2d=new Lt(this),this.linkView2d3d=new ui(this),this.linkElement2d3d=new fi(this),this.sceneModule2d.initGrid(),this.cadCursorUI=new vi(this.container,this.renderer.domElement,this.options.cursorStyle??"short-crosshair"),this.cadCursorUI.setBackgroundColor(this.options.backgroundColor??1710618),this.loadingUI=new wi(this.container,this.options.loadingStyle),this.events.on(me.ModelLoadStart,()=>this.loadingUI.show("正在加载...",0)),this.events.on(me.ModelLoadProgress,e=>this.loadingUI.update(e.text,e.progress)),this.events.on(me.ModelLoaded,()=>this.loadingUI.hide()),this.events.on(me.ModelLoadError,()=>this.loadingUI.hide()),this.versionEl=document.createElement("div"),this.versionEl.className="engine-2d-version-text",this.updateVersionDisplay(),this.container.appendChild(this.versionEl),this.workspaceTabsUI=new Ni(this.container,this),this.contextMenuUI=new bi(this.container,this.renderer.domElement,e=>{if(e==="search"&&this.searchManager.show(),e==="layerManage"&&this.layerManager.toggle(),e==="hideElement"&&this.modelToolModule2d.hideModel(this.engineStatus2d.highlightModels),e==="showAll"&&this.modelToolModule2d.showAllModels(),e==="hideLayer"&&this.hideHighlightedLayers(),e==="showAllLayers"&&(this.layerManager.setAllLayersVisible(!0),this.layerManager.refresh()),e==="toggleBg"){const t=this.themeManager.getTheme()==="dark"?"light":"dark";this.setTheme(t)}if(e==="linkElement2d3d"){const t=this.linkElement2d3d.toggle();this.contextMenuUI.setMenuItemState("linkElement2d3d",t),!t&&!this.isModelSpaceActive()&&(this.modelToolModule2d.unHighlightModelHover(),this.modelToolModule2d.unhighlightAllModels()),console.log(`[EngineKernel2d] 二三维图元联动: ${t?"已开启":"已关闭"}`)}if(e==="linkView2d3d"){const t=this.linkView2d3d.toggle();this.contextMenuUI.setMenuItemState("linkView2d3d",t),console.log(`[EngineKernel2d] 图模关联: ${t?"已开启":"已关闭"}`)}},this.options.contextMenu?.items),this.contextMenuUI.setMenuItemStates({linkElement2d3d:this.linkElement2d3d.isEnabled(),linkView2d3d:this.linkView2d3d.isEnabled()}),this.initStatsMonitor(),this.startRendering(),console.log(`[EngineKernel2d] 2D Engine initialized (v${this.version})`)}startRendering(){this.isRendering||(this.isRendering=!0,this.fpsLastCheck=performance.now(),this.animate(),console.log("[EngineKernel2d] Rendering started"))}stopRendering(){this.isRendering=!1,this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),console.log("[EngineKernel2d] Rendering stopped")}animate=()=>{this.isRendering&&(this.animationId=requestAnimationFrame(this.animate),this.stats?.begin(),this.controlModule2d.update(),this.camera?.updateMatrixWorld(!0),this.measure?.update(),this.markup?.update(),this.label?.update(),this.scene&&this.camera&&this.renderer&&this.renderer.render(this.scene,this.camera),this.enablePerformanceMonitoring&&this.updatePerformanceStats(),this.stats?.end())};initStatsMonitor(){!(this.options.showStats??this.enablePerformanceMonitoring)||!this.container||(this.stats=new Ct,this.stats.showPanel(0),this.stats.dom.className="engine-2d-stats-monitor",this.stats.dom.style.position="absolute",this.stats.dom.style.top="0px",this.stats.dom.style.left="0px",this.stats.dom.style.zIndex="1000",this.container.appendChild(this.stats.dom))}updatePerformanceStats(){this.fpsFrameCount++;const e=performance.now();e-this.fpsLastCheck>=1e3&&(this.currentFps=this.fpsFrameCount,this.fpsFrameCount=0,this.fpsLastCheck=e,this.events.trigger(me.RenderEnd,{fps:this.currentFps}))}async loadModel(e,t){return await this.loaderModule2d.loadModel(e,t),{}}async loadModelByViewToken(e,t){const i=await Ki(this.options,e,"2d");if(i.assetCategory==="composite_model"&&i.urls.length>1)throw new Error("[BimEngine] 2D engine does not support composite_model viewToken loading");return this.loadModel(i.url,t)}getLayouts(){return this.loaderModule2d?.getLayouts()??[]}getActiveWorkspace(){return this.loaderModule2d?.getActiveWorkspace?.()??{type:"model",name:"模型"}}isModelSpaceActive(){return this.getActiveWorkspace().type==="model"}isElementLink2d3dEnabled(){return this.linkElement2d3d?.isEnabled?.()===!0}async loadLayout(e,t){await this.loaderModule2d.loadLayout(e,t)}async showModelSpace(e){await this.loaderModule2d.showModelSpace(e)}getLayers(){return this.loaderModule2d.getLayers()}getEntitiesByLayer(e){return this.loaderModule2d.getEntitiesByLayer(e)}setLayerVisible(e,t){this.layerManager?.setLayerVisible(e,t)}hideHighlightedLayers(){this.getLayersByModelIds(this.engineStatus2d?.highlightModels??[]).forEach(t=>this.layerManager?.setLayerVisible(t,!1)),this.layerManager?.refresh()}getLayersByModelIds(e){const t=new Set;return e.forEach(i=>{(this.loaderModule2d?.model?.nodeMap?.get(String(i))??this.loaderModule2d?.model?.nodeMap?.get(i))?.forEach(r=>{r?.layer&&t.add(r.layer)})}),Array.from(t)}setTheme(e){this.themeManager.setTheme(e);const t=e==="dark"?1710618:15790320;this.setBackgroundColor(t)}resetView(){this.cameraModule2d&&this.cameraModule2d.resetView()}fitToView(){const e=this.loaderModule2d?.getActiveWorkspaceExtents?.();if(this.getActiveWorkspace().type==="layout"&&e){this.cameraModule2d.fitToExtents(e);return}const t=this.dwgData?.metadata,i=t?.viewExtents??t?.extents;i&&this.cameraModule2d.fitToExtents(i)}setZoom(e){this.cameraModule2d&&this.cameraModule2d.setZoom(e)}getZoom(){return this.cameraModule2d?this.cameraModule2d.getZoom():1}updateVersionDisplay(){this.versionEl&&(this.versionEl.innerHTML=`v${this.version}`)}getPerformanceStats(){const e=this.sceneModule2d.getSceneStats();return{fps:this.currentFps,renderTime:0,entityCount:e.objectCount,visibleEntityCount:e.objectCount}}setBackgroundColor(e){this.options.backgroundColor=e,this.sceneModule2d&&this.sceneModule2d.setBackgroundColor(e),this.cadCursorUI?.setBackgroundColor(e),this.modelToolModule2d?.updateColorsForBackground(e),this.layerManager?.refresh()}clearScene(){this.sceneModule2d&&this.sceneModule2d.clearScene()}resize(){if(this.renderModule2d){const e=this.container?.clientWidth??0,t=this.container?.clientHeight??0;this.renderModule2d.setSize(e,t)}}captureImage(e){if(!this.renderer||!this.sceneModule2d)return console.error("[EngineKernel2d] Renderer or scene module not initialized"),null;const t=this.renderer.domElement,i=e?.format||"png",n=e?.quality||.92,r=`image/${i==="jpeg"?"jpeg":i}`,s=e?.transparent??!1,o=e?.hideGrid??!0,a=e?.hideAxes??!0,l=this.scene?.background??null;let h=!1,f=!1;this.sceneModule2d.adaptiveGrid&&(h=this.sceneModule2d.adaptiveGrid.gridGroup?.visible??!1,o&&this.sceneModule2d.adaptiveGrid.setVisible(!1)),this.sceneModule2d.axesHelper&&(f=this.sceneModule2d.axesHelper.visible??!1,a&&this.sceneModule2d.setAxesVisible(!1)),s&&this.scene&&(this.scene.background=null),this.scene&&this.camera&&this.renderer.render(this.scene,this.camera);const p=t.toDataURL(r,n);this.scene&&(this.scene.background=l),this.sceneModule2d.adaptiveGrid&&o&&this.sceneModule2d.adaptiveGrid.setVisible(h),this.sceneModule2d.axesHelper&&a&&this.sceneModule2d.setAxesVisible(f),this.scene&&this.camera&&this.renderer.render(this.scene,this.camera);const d={dataURL:p};if(e?.download){const y=e.filename||`capture-${Date.now()}.${i}`,c=document.createElement("a");c.href=p,c.download=y,c.style.display="none",document.body.appendChild(c),c.click(),c.remove(),console.log(`[EngineKernel2d] Image captured and downloaded: ${y}`)}else console.log("[EngineKernel2d] Image captured");return d}async captureImageAsync(e){if(!this.renderer||!this.sceneModule2d)return console.error("[EngineKernel2d] Renderer or scene module not initialized"),null;const t=this.renderer.domElement,i=e?.format||"png",n=e?.quality||.92,r=`image/${i==="jpeg"?"jpeg":i}`,s=e?.transparent??!1,o=e?.hideGrid??!0,a=e?.hideAxes??!0,l=this.scene?.background??null;let h=!1,f=!1;this.sceneModule2d.adaptiveGrid&&(h=this.sceneModule2d.adaptiveGrid.gridGroup?.visible??!1,o&&this.sceneModule2d.adaptiveGrid.setVisible(!1)),this.sceneModule2d.axesHelper&&(f=this.sceneModule2d.axesHelper.visible??!1,a&&this.sceneModule2d.setAxesVisible(!1)),s&&this.scene&&(this.scene.background=null),this.scene&&this.camera&&this.renderer.render(this.scene,this.camera);const p=t.toDataURL(r,n),d=await new Promise(c=>{t.toBlob(g=>{g&&c(g)},r,n)}),y=URL.createObjectURL(d);if(this.scene&&(this.scene.background=l),this.sceneModule2d.adaptiveGrid&&o&&this.sceneModule2d.adaptiveGrid.setVisible(h),this.sceneModule2d.axesHelper&&a&&this.sceneModule2d.setAxesVisible(f),this.scene&&this.camera&&this.renderer.render(this.scene,this.camera),e?.download){const c=e.filename||`capture-${Date.now()}.${i}`,g=document.createElement("a");g.href=y,g.download=c,g.style.display="none",document.body.appendChild(g),g.click(),g.remove(),console.log(`[EngineKernel2d] Image captured and downloaded: ${c}`)}else console.log("[EngineKernel2d] Image captured with Blob URL:",y);return{dataURL:p,blobURL:y,blob:d}}dispose(){console.log("[EngineKernel2d] Disposing engine..."),this.stopRendering(),this.cadCursorUI?.dispose(),this.contextMenuUI?.dispose(),this.loadingUI?.dispose(),this.workspaceTabsUI?.dispose(),this.versionEl?.parentElement?.removeChild(this.versionEl),this.searchManager?.dispose(),this.measure?.dispose(),this.markup?.dispose(),this.label?.dispose(),this.themeManager?.dispose(),this.loaderModule2d?.dispose(),this.controlModule2d?.dispose(),this.renderModule2d?.dispose(),this.cameraModule2d?.dispose(),this.sceneModule2d?.dispose(),this.events?.dispose(),this.stats?.dom?.parentElement&&this.stats.dom.parentElement.removeChild(this.stats.dom),this.scene=null,this.camera=null,this.renderer=null,this.dwgData=null,this.stats=void 0,this.versionEl=null,console.log("[EngineKernel2d] Engine disposed")}}function yt(b){return new gt(b)}ve.EngineKernel2d=gt,ve.createEngine2d=yt,ve.default=yt,Object.defineProperties(ve,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
221
+ `,s.addEventListener("click",()=>this.selectResult(n)),s.addEventListener("mouseenter",()=>{this.activeIndex=r,this.highlightItem(this.resultList.querySelectorAll(".engine-2d-search__item"))}),this.resultList.appendChild(s)})}highlight(e,t){const i=this.escapeHtml(e),n=t.trim();if(!n)return i;const r=this.escapeRegExp(this.escapeHtml(n));return i.replace(new RegExp(`(${r})`,"gi"),'<mark class="engine-2d-search__mark">$1</mark>')}highlightItem(e){e.forEach((t,i)=>{t.classList.toggle("engine-2d-search__item--active",i===this.activeIndex)}),this.activeIndex>=0&&e[this.activeIndex]?.scrollIntoView({block:"nearest"})}selectResult(e){this.manager.onResultSelect(e),this.hide()}clearResults(){this.resultList.innerHTML="",this.resultList.style.display="none",this.statusEl.style.display="none";const e=this.wrapper.querySelector(".engine-2d-search__divider");e.style.display="none",this.currentResults=[],this.activeIndex=-1}escapeHtml(e){return String(e??"").replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[t]??t)}escapeRegExp(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}show(){this.wrapper.classList.add("engine-2d-search--visible"),requestAnimationFrame(()=>this.input.focus())}hide(){this.wrapper.classList.remove("engine-2d-search--visible"),this.clearResults(),this.input.value="",this.clearBtn.style.opacity="0",this.clearBtn.style.pointerEvents="none"}toggle(){this.wrapper.classList.contains("engine-2d-search--visible")?this.hide():this.show()}dispose(){this.input.removeEventListener("input",this.onInput),this.input.removeEventListener("keydown",this.onKeyDown),this.clearBtn.removeEventListener("click",this.onClear),document.removeEventListener("mousedown",this.onDocMouseDown),document.removeEventListener("keydown",this.onEscape),this.wrapper.parentElement?.removeChild(this.wrapper),this.debounceTimer!==null&&clearTimeout(this.debounceTimer)}}class _i{engine;searchUI=null;constructor(e){this.engine=e;const t=document.getElementById(e?.options?.containerId??"")??e?.container??null;t&&(this.searchUI=new Mi(t,this))}search(e){const t=this.normalize(e);return t?(this.engine.loaderModule2d?.model?.textItems??[]).map(n=>{const r=this.getMatchScore(n.text,t);return r==null?null:{id:n.id,name:n.text,type:"文字",layer:n.layer,description:this.getPositionDescription(n),score:r,target:n}}).filter(n=>n!==null).sort((n,r)=>(r.score??0)-(n.score??0)||n.name.length-r.name.length).slice(0,100):[]}onResultSelect(e){const t=e.target;t&&(this.engine.modelToolModule2d?.unhighlightAllModels?.(),this.engine.modelToolModule2d?.highlightModel?.([e.id]),this.fitToText(t))}fitToText(e){const t=e.min?.clone(),i=e.max?.clone(),n=e.anchor?.clone();if((!t||!i||t.distanceTo(i)<1e-6)&&n){const o=Math.max(Number(e.info?.height??100),100);this.engine.cameraModule2d?.fitToExtents({min:[n.x-o,n.y-o,0],max:[n.x+o,n.y+o,0]},2,!0,500);return}if(!t||!i)return;const r=new _.Vector3().subVectors(i,t),s=Math.max(r.x,r.y)<1e-6?2:2.5;this.engine.cameraModule2d?.fitToExtents({min:[t.x,t.y,t.z],max:[i.x,i.y,i.z]},s,!0,500)}getPositionDescription(e){const t=e.anchor??e.min;return t?`X:${t.x.toFixed(0)} Y:${t.y.toFixed(0)}`:""}normalize(e){return String(e??"").trim().toLowerCase().replace(/\s+/g,"")}getMatchScore(e,t){const i=this.normalize(e);if(!i)return null;const n=i.indexOf(t);if(n>=0)return 1e3-n-Math.max(0,i.length-t.length)*.01;let r=0,s=0;for(const o of t){const a=i.indexOf(o,r);if(a<0)return null;s+=a-r,r=a+1}return 500-s-Math.max(0,i.length-t.length)*.01}show(){this.searchUI?.show()}hide(){this.searchUI?.hide()}toggle(){this.searchUI?.toggle()}dispose(){this.searchUI?.dispose(),this.searchUI=null}}const ft={dark:{"--e2d-bg":"#1e1f22","--e2d-bg2":"#252526","--e2d-bg3":"#222222","--e2d-bg-hover":"rgba(79,195,247,0.08)","--e2d-bg-accent":"#094771","--e2d-icon-bg":"rgba(255,255,255,0.08)","--e2d-icon-bg-hover":"rgba(255,255,255,0.16)","--e2d-border":"rgba(255,255,255,0.12)","--e2d-border2":"#333333","--e2d-text":"#e0e0e0","--e2d-text2":"#cccccc","--e2d-text3":"rgba(255,255,255,0.35)","--e2d-text4":"#666666","--e2d-text-accent":"#ffffff","--e2d-accent":"#4fc3f7","--e2d-shadow":"rgba(0,0,0,0.50)","--e2d-shadow-lg":"rgba(0,0,0,0.65)","--e2d-cursor":"rgba(255,255,255,0.85)","--e2d-scrollbar":"rgba(255,255,255,0.15)","--e2d-float-bg":"rgba(0,0,0,0.65)","--e2d-float-border":"rgba(255,255,255,0.08)","--e2d-swatch-border":"#444444","--e2d-close":"#aaaaaa","--e2d-close-hover":"#ffffff","--e2d-icon":"rgba(255,255,255,0.4)","--e2d-coord-value":"#76c8ff","--e2d-coord-label":"rgba(255,255,255,0.45)"},light:{"--e2d-bg":"#ffffff","--e2d-bg2":"#ffffff","--e2d-bg3":"#eeeeee","--e2d-bg-hover":"rgba(25,118,210,0.06)","--e2d-bg-accent":"#e3f2fd","--e2d-icon-bg":"rgba(0,0,0,0.06)","--e2d-icon-bg-hover":"rgba(0,0,0,0.12)","--e2d-border":"rgba(0,0,0,0.12)","--e2d-border2":"#e0e0e0","--e2d-text":"#1a1a1a","--e2d-text2":"#444444","--e2d-text3":"rgba(0,0,0,0.40)","--e2d-text4":"#aaaaaa","--e2d-text-accent":"#1565c0","--e2d-accent":"#1976d2","--e2d-shadow":"rgba(0,0,0,0.15)","--e2d-shadow-lg":"rgba(0,0,0,0.22)","--e2d-cursor":"rgba(30,30,30,0.70)","--e2d-scrollbar":"rgba(0,0,0,0.18)","--e2d-float-bg":"#ffffff","--e2d-float-border":"rgba(0,0,0,0.10)","--e2d-swatch-border":"#cccccc","--e2d-close":"#777777","--e2d-close-hover":"#1a1a1a","--e2d-icon":"rgba(0,0,0,0.45)","--e2d-coord-value":"#1976d2","--e2d-coord-label":"rgba(0,0,0,0.50)"}};class Ci{container;current;constructor(e,t="dark"){this.container=e,this.current=t,this._apply(t)}_apply(e){const t=ft[e];for(const[i,n]of Object.entries(t))this.container.style.setProperty(i,n);this.container.setAttribute("data-e2d-theme",e)}setTheme(e){this.current=e,this._apply(e)}getTheme(){return this.current}toggle(){this.setTheme(this.current==="dark"?"light":"dark")}dispose(){for(const e of Object.keys(ft[this.current]))this.container.style.removeProperty(e);this.container.removeAttribute("data-e2d-theme")}}const pt={precision:3,unit:"m",areaUnit:"m²",scale:1};class Ge{manager;points=[];constructor(e){this.manager=e}active(){this.points=[],this.manager.setCurrentTool(this)}disActive(){this.points=[],this.manager.clearPreview()}clearAllPoints(){this.points=[],this.manager.clearPreview()}handleClick(e){this.points.push(e.clone())}handleMove(e){}handleDoubleClick(){}handleRightClick(){this.handleDoubleClick()}handleEnter(){this.handleDoubleClick()}handleEsc(){this.clearAllPoints()}}class Ei extends Ge{handleClick(e){super.handleClick(e),this.points.length===2&&(this.manager.addMeasurement("distance",this.points),this.clearAllPoints())}handleMove(e){this.points.length===1&&this.manager.drawPreview("distance",[this.points[0],e])}}class Si extends Ge{handleClick(e){super.handleClick(e),this.manager.drawPreview("area",this.points)}handleMove(e){this.points.length>0&&this.manager.drawPreview("area",[...this.points,e])}handleDoubleClick(){const e=this.manager.removeTrailingDuplicatePoint(this.points);e.length>=3&&this.manager.addMeasurement("area",e),this.clearAllPoints()}}class Ti extends Ge{handleClick(e){super.handleClick(e),this.points.length===3&&(this.manager.addMeasurement("angle",this.points),this.clearAllPoints())}handleMove(e){this.points.length>=2&&this.manager.drawPreview("angle",[...this.points,e])}}class Ai{distanceMeasure;areaMeasure;angleMeasure;annotationData={distanceAnnotation:[],areaAnnotation:[],angleAnnotation:[]};engine;container;annotationContainer;setting={...pt};isActive=!1;currentTool=null;previewRecord=null;mouseDownPoint=null;hasDraggedAfterMouseDown=!1;currentWorkspaceKey="model";constructor(e){this.engine=e,this.container=e.container,this.distanceMeasure=new Ei(this),this.areaMeasure=new Si(this),this.angleMeasure=new Ti(this),this.annotationContainer=document.createElement("div"),this.annotationContainer.className="annotation-container",this.annotationContainer.style.pointerEvents="none",this.annotationContainer.style.zIndex="20",this.container.appendChild(this.annotationContainer)}active(){if(this.isActive)return;this.isActive=!0,this.engine.interactionModule2d?.disActive?.();const e=this.engine.renderer.domElement;e.addEventListener("mousedown",this.handleMouseDown,!0),e.addEventListener("click",this.handleClick,!0),e.addEventListener("mousemove",this.handleMove,!0),e.addEventListener("dblclick",this.handleDoubleClick,!0),e.addEventListener("contextmenu",this.handleContextMenu,!0),window.addEventListener("keydown",this.handleKeyDown,!0)}disActive(){if(!this.isActive)return;this.quitDraw(),this.isActive=!1;const e=this.engine.renderer.domElement;e.removeEventListener("mousedown",this.handleMouseDown,!0),e.removeEventListener("click",this.handleClick,!0),e.removeEventListener("mousemove",this.handleMove,!0),e.removeEventListener("dblclick",this.handleDoubleClick,!0),e.removeEventListener("contextmenu",this.handleContextMenu,!0),window.removeEventListener("keydown",this.handleKeyDown,!0),this.engine.interactionModule2d?.active?.(),this.clearAll()}quitDraw(){this.currentTool?.disActive(),this.currentTool=null,this.clearPreview()}activate(e){this.active(),this.disActiveMeasureTools(),e==="distance"&&this.distanceMeasure.active(),e==="area"&&this.areaMeasure.active(),e==="angle"&&this.angleMeasure.active()}clearAllPoints(){this.distanceMeasure.clearAllPoints(),this.areaMeasure.clearAllPoints(),this.angleMeasure.clearAllPoints()}clearAll(){Object.values(this.annotationData).forEach(e=>this.removeRecords(e,t=>t.workspaceKey===this.currentWorkspaceKey)),this.clearPreview()}cancelCurrentSelectedAnnotation(){Object.values(this.annotationData).flat().forEach(e=>{e.highlight=!1,this.applyRecordHighlight(e,!1)})}saveSetting(e){this.setting={...this.setting,...e,precision:this.normalizePrecision(e.precision??this.setting.precision),scale:Number.isFinite(e.scale)&&e.scale>0?e.scale:this.setting.scale},this.refreshLabels()}setPrecision(e){this.saveSetting({precision:e})}getSetting(){return{...this.setting}}update(){this.updateRecords(Object.values(this.annotationData).flat().filter(e=>e.workspaceKey===this.currentWorkspaceKey)),this.previewRecord&&this.updateRecordSvg(this.previewRecord)}setWorkspace(e){!e||e===this.currentWorkspaceKey||(this.clearPreview(),this.cancelCurrentSelectedAnnotation(),this.currentWorkspaceKey=e,this.refreshWorkspaceVisibility())}dispose(){this.disActive(),this.clearAll(),this.annotationContainer.remove()}setCurrentTool(e){this.currentTool=e}drawPreview(e,t){this.clearPreview(),!(t.length<2)&&(this.previewRecord=this.createRecord(e,t,!0),this.annotationContainer.appendChild(this.previewRecord.container),this.updateRecordSvg(this.previewRecord))}clearPreview(){this.previewRecord?.container.remove(),this.previewRecord=null}addMeasurement(e,t){const i=this.createRecord(e,t,!1);return this.annotationContainer.appendChild(i.container),this.getRecords(e).push(i),this.updateRecordSvg(i),this.engine.events?.trigger?.("measure-changed",i),i}deleteSelected(){Object.values(this.annotationData).forEach(e=>{for(let t=e.length-1;t>=0;t--)e[t].workspaceKey===this.currentWorkspaceKey&&e[t].highlight&&(e[t].container.remove(),e.splice(t,1))})}removeTrailingDuplicatePoint(e){if(e.length<2)return e.map(r=>r.clone());const t=e.map(r=>r.clone()),i=t[t.length-1],n=t[t.length-2];return i.distanceTo(n)<1e-6&&t.pop(),t}disActiveMeasureTools(){this.distanceMeasure.disActive(),this.areaMeasure.disActive(),this.angleMeasure.disActive()}handleMouseDown=e=>{this.mouseDownPoint=new _.Vector2(e.clientX,e.clientY),this.hasDraggedAfterMouseDown=!1};handleClick=e=>{!this.currentTool||this.hasDraggedAfterMouseDown||(e.preventDefault(),e.stopImmediatePropagation(),this.currentTool.handleClick(this.eventToWorld(e)))};handleMove=e=>{this.currentTool&&(this.mouseDownPoint&&new _.Vector2(e.clientX,e.clientY).distanceTo(this.mouseDownPoint)>3&&(this.hasDraggedAfterMouseDown=!0),this.currentTool.handleMove(this.eventToWorld(e)))};handleDoubleClick=e=>{this.currentTool&&(e.preventDefault(),e.stopImmediatePropagation(),this.currentTool.handleDoubleClick())};handleContextMenu=e=>{this.currentTool&&(e.preventDefault(),e.stopImmediatePropagation(),this.currentTool.handleRightClick())};handleKeyDown=e=>{this.isActive&&(e.key==="Escape"&&(e.preventDefault(),e.stopImmediatePropagation(),this.currentTool?.handleEsc(),this.disActive(),this.engine.events?.trigger?.("quit_measure_draw",!0),window.dispatchEvent(new CustomEvent("D2MeasureQuit"))),(e.key==="Delete"||e.key==="Backspace")&&(e.preventDefault(),e.stopImmediatePropagation(),this.deleteSelected()),e.key==="Enter"&&this.currentTool&&(e.preventDefault(),this.currentTool.handleEnter()))};eventToWorld(e){const t=this.engine.renderer.domElement.getBoundingClientRect(),i=this.engine.cameraModule2d.screenToWorld(e.clientX-t.left,e.clientY-t.top);return i.z=0,i}createRecord(e,t,i){const n=document.createElement("div");n.className=`${e}-annotation`,n.style.position="absolute",n.style.left="0px",n.style.top="0px",n.style.pointerEvents="none";const r=this.createSvg(e);i&&(r.style.opacity="0.65"),n.appendChild(r);const s=this.computeValue(e,t),o={id:this.createId(),type:e,workspaceKey:this.currentWorkspaceKey,points:t.map(a=>a.clone()),container:n,svg:r,value:s,text:this.formatValue(e,s),isSelect:i};return i||this.bindRecordSelection(o),o}createSvg(e){const t=document.createElementNS("http://www.w3.org/2000/svg","svg");if(t.classList.add("measureSvg"),t.style.left="0",t.style.top="0",t.style.pointerEvents="none",e==="area"){const o=this.svgElement("polygon");o.setAttribute("fill","rgba(0, 155, 234, 0.12)"),o.setAttribute("stroke","none"),t.appendChild(o)}const i=e==="angle"?2:1;for(let o=0;o<i;o++){const a=this.svgElement("polyline");a.classList.add("measureLine"),a.setAttribute("stroke-width","2"),a.setAttribute("style","fill: none; opacity: 1;"),t.appendChild(a)}const n=e==="angle"?3:e==="distance"?2:0;for(let o=0;o<n;o++){const a=this.svgElement("circle");a.classList.add("measurePointer"),a.setAttribute("r","5"),t.appendChild(a)}const r=this.svgElement("rect");r.classList.add("measureBack"),r.setAttribute("width","100"),r.setAttribute("height","25"),r.style.pointerEvents="auto",r.style.cursor="pointer",t.appendChild(r);const s=this.svgElement("text");return s.classList.add("measureLabel"),s.setAttribute("text-anchor","middle"),t.appendChild(s),t}bindRecordSelection(e){e.svg.getElementsByTagName("rect")[0].addEventListener("click",i=>{i.preventDefault(),i.stopPropagation(),this.cancelCurrentSelectedAnnotation(),e.highlight=!0,this.applyRecordHighlight(e,!0),this.engine.events?.trigger?.("measure-click",e)})}applyRecordHighlight(e,t){[e.svg,...Array.from(e.svg.getElementsByTagName("polyline")),...Array.from(e.svg.getElementsByTagName("circle")),...Array.from(e.svg.getElementsByTagName("polygon")),...Array.from(e.svg.getElementsByTagName("rect")),...Array.from(e.svg.getElementsByTagName("text"))].forEach(n=>{n.classList.toggle("Hight",t),n.classList.toggle("measure-2d-selected",t)})}svgElement(e){return document.createElementNS("http://www.w3.org/2000/svg",e)}updateRecords(e){e.forEach(t=>this.updateRecordSvg(t))}updateRecordSvg(e){const t=this.container.clientWidth||1,i=this.container.clientHeight||1;e.svg.setAttribute("width",`${t}`),e.svg.setAttribute("height",`${i}`),e.svg.style.width=`${t}px`,e.svg.style.height=`${i}px`;const n=e.points.map(r=>this.worldToScreen(r));e.type==="distance"&&this.updateDistanceSvg(e,n),e.type==="area"&&this.updateAreaSvg(e,n),e.type==="angle"&&this.updateAngleSvg(e,n)}updateDistanceSvg(e,t){const[i,n]=t,r=e.svg.getElementsByTagName("polyline")[0],s=e.svg.getElementsByTagName("circle");r.setAttribute("points",`${i.x},${i.y} ${n.x},${n.y}`),s[0].setAttribute("cx",`${i.x}`),s[0].setAttribute("cy",`${i.y}`),s[1].setAttribute("cx",`${n.x}`),s[1].setAttribute("cy",`${n.y}`),this.updateLabel(e,(i.x+n.x)/2,(i.y+n.y)/2)}updateAreaSvg(e,t){const i=t.map(o=>`${o.x},${o.y}`).join(" "),r=(t.length>=3?[...t,t[0]]:t).map(o=>`${o.x},${o.y}`).join(" ");e.svg.getElementsByTagName("polygon")[0].setAttribute("points",t.length>=3?i:""),e.svg.getElementsByTagName("polyline")[0].setAttribute("points",r);const s=t.reduce((o,a)=>(o.x+=a.x,o.y+=a.y,o),{x:0,y:0});this.updateLabel(e,s.x/t.length,s.y/t.length)}updateAngleSvg(e,t){const[i,n,r]=t,s=e.svg.getElementsByTagName("polyline"),o=e.svg.getElementsByTagName("circle");s[0].setAttribute("points",`${i.x},${i.y} ${n.x},${n.y}`),s[1].setAttribute("points",`${n.x},${n.y} ${r.x},${r.y}`),[i,n,r].forEach((a,l)=>{o[l].setAttribute("cx",`${a.x}`),o[l].setAttribute("cy",`${a.y}`)}),this.updateLabel(e,n.x,n.y-30)}updateLabel(e,t,i){e.value=this.computeValue(e.type,e.points),e.text=this.formatValue(e.type,e.value);const n=e.svg.getElementsByTagName("rect")[0],r=e.svg.getElementsByTagName("text")[0],s=Math.max(100,e.text.length*9+22);n.setAttribute("x",`${t-s/2}`),n.setAttribute("y",`${i-12.5}`),n.setAttribute("width",`${s}`),r.setAttribute("x",`${t}`),r.setAttribute("y",`${i+4}`),r.textContent=e.text}worldToScreen(e){return this.engine.cameraModule2d.worldToScreen(e.x,e.y)}computeValue(e,t){return e==="distance"?t[0].distanceTo(t[1])*this.setting.scale:e==="angle"?this.computeAngle(t[0],t[1],t[2]):this.computeArea(t)*this.setting.scale*this.setting.scale}computeArea(e){if(e.length<3)return 0;let t=0;for(let i=0;i<e.length;i++){const n=e[i],r=e[(i+1)%e.length];t+=n.x*r.y-r.x*n.y}return Math.abs(t)/2}computeAngle(e,t,i){const n=e.clone().sub(t).normalize(),r=i.clone().sub(t).normalize(),s=_.MathUtils.clamp(n.dot(r),-1,1);return _.MathUtils.radToDeg(Math.acos(s))}formatValue(e,t){return e==="angle"?`${t.toFixed(this.setting.precision)}°`:e==="area"?`${t.toFixed(this.setting.precision)} ${this.setting.areaUnit??`${this.setting.unit}²`}`:`${t.toFixed(this.setting.precision)} ${this.setting.unit}`}refreshLabels(){Object.values(this.annotationData).flat().filter(e=>e.workspaceKey===this.currentWorkspaceKey).forEach(e=>{e.value=this.computeValue(e.type,e.points),e.text=this.formatValue(e.type,e.value),this.updateRecordSvg(e)})}refreshWorkspaceVisibility(){Object.values(this.annotationData).flat().forEach(e=>{e.container.style.display=e.workspaceKey===this.currentWorkspaceKey?"":"none"})}removeRecords(e,t){for(let i=e.length-1;i>=0;i-=1)t(e[i])&&(e[i].container.remove(),e.splice(i,1))}getRecords(e){return e==="distance"?this.annotationData.distanceAnnotation:e==="area"?this.annotationData.areaAnnotation:this.annotationData.angleAnnotation}normalizePrecision(e){return Number.isFinite(e)?Math.max(0,Math.min(8,Math.round(e))):pt.precision}createId(){return`measure-2d-${Date.now()}-${Math.random().toString(16).slice(2)}`}}const He={stroke:"#ff4d4f",fill:"rgba(255, 77, 79, 0.08)",strokeWidth:2,fontSize:16,cloudRadius:10},Ii={none:xe("/assets/icon/选择.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),line:xe("/assets/icon/线.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),arrow:xe("/assets/icon/箭头.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),rect:xe("/assets/icon/矩形.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),ellipse:xe("/assets/icon/圆形.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),polygon:xe("/assets/icon/面积.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),text:xe("/assets/icon/文字.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href),cloudline:xe("/assets/icon/云线.svg",typeof document>"u"&&typeof location>"u"?require("url").pathToFileURL(__filename).href:typeof document>"u"?location.href:se&&se.tagName.toUpperCase()==="SCRIPT"&&se.src||new URL("dwg-preview.umd.js",document.baseURI).href)},Li="data:image/svg+xml;utf8,"+encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#1f2937" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 6h18"/><path d="M8 6V4h8v2"/><path d="M6 6l1 16h10l1-16"/><path d="M10 11v6"/><path d="M14 11v6"/></svg>'),Pi="data:image/svg+xml;utf8,"+encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#1f2937" stroke-width="2" stroke-linecap="round"><path d="M6 6l12 12"/><path d="M18 6L6 18"/></svg>');class Di{engine;container;layer;svg;toolbar;records=[];isActive=!1;currentType=null;style={...He};draft=null;draftStart=null;polygonPoints=[];currentWorkspaceKey="model";mouseDownPoint=null;hasDraggedAfterMouseDown=!1;buttons={};constructor(e){this.engine=e,this.container=e.container,getComputedStyle(this.container).position==="static"&&(this.container.style.position="relative"),this.layer=document.createElement("div"),this.layer.className="markup-2d-layer",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("markup-2d-svg"),this.layer.appendChild(this.svg),this.toolbar=this.createToolbar(),this.layer.appendChild(this.toolbar),this.container.appendChild(this.layer)}active(e){if(this.engine.measure?.quitDraw?.(),!this.isActive){this.isActive=!0,this.engine.interactionModule2d?.disActive?.();const t=this.engine.renderer.domElement;t.addEventListener("mousedown",this.handleMouseDown,!0),t.addEventListener("mousemove",this.handleMouseMove,!0),t.addEventListener("mouseup",this.handleMouseUp,!0),t.addEventListener("click",this.handleClick,!0),t.addEventListener("dblclick",this.handleDoubleClick,!0),t.addEventListener("wheel",this.blockDrawingEvent,!0),t.addEventListener("touchstart",this.blockDrawingEvent,!0),t.addEventListener("touchmove",this.blockDrawingEvent,!0),window.addEventListener("keydown",this.handleKeyDown,!0)}this.showToolbar(),e&&this.setDrawType(e)}show(){this.active()}hide(){this.hideToolbar(),this.disActive()}disActive(){if(!this.isActive)return;this.isActive=!1,this.currentType=null,this.clearDraft(),this.polygonPoints=[],this.syncToolbar();const e=this.engine.renderer.domElement;e.removeEventListener("mousedown",this.handleMouseDown,!0),e.removeEventListener("mousemove",this.handleMouseMove,!0),e.removeEventListener("mouseup",this.handleMouseUp,!0),e.removeEventListener("click",this.handleClick,!0),e.removeEventListener("dblclick",this.handleDoubleClick,!0),e.removeEventListener("wheel",this.blockDrawingEvent,!0),e.removeEventListener("touchstart",this.blockDrawingEvent,!0),e.removeEventListener("touchmove",this.blockDrawingEvent,!0),window.removeEventListener("keydown",this.handleKeyDown,!0),this.engine.interactionModule2d?.active?.()}setDrawType(e){this.currentType=e==="none"?null:e,this.clearDraft(),this.polygonPoints=[],this.syncToolbar()}update(){const e=this.container.clientWidth||1,t=this.container.clientHeight||1;this.svg.setAttribute("width",`${e}`),this.svg.setAttribute("height",`${t}`),this.svg.style.width=`${e}px`,this.svg.style.height=`${t}px`,this.records.forEach(i=>{i.element.style.display=i.data.workspaceKey===this.currentWorkspaceKey?"":"none",this.updateElement(i)}),this.draft&&this.updateElement(this.draft)}setWorkspace(e){!e||e===this.currentWorkspaceKey||(this.currentWorkspaceKey=e,this.clearDraft(),this.polygonPoints=[],this.cancelSelected(),this.update())}getData(){return this.records.map(e=>this.cloneData(e.data))}restoreData(e=[]){this.clearAll(!0),e.forEach(t=>this.addMarkup(t)),this.update()}get(){return{cameraViewState:this.engine.cameraModule2d?.getViewState?.()??null,markupData:this.getData()}}restore(e){e&&(e.cameraViewState&&this.engine.cameraModule2d?.applyViewState?.(e.cameraViewState),this.restoreData(e.markupData??[]))}addMarkup(e){const t={id:e.id??this.createId(),type:e.type,workspaceKey:e.workspaceKey??this.currentWorkspaceKey,points:e.points.map(n=>({x:n.x,y:n.y,z:n.z??0})),text:e.text,style:{...this.style,...e.style??{}}},i=this.createRecord(t);return this.records.push(i),this.svg.appendChild(i.element),this.updateElement(i),this.engine.events?.trigger?.("markup-changed",this.cloneData(t)),this.cloneData(t)}clearAll(e=!1){for(let t=this.records.length-1;t>=0;t-=1){const i=this.records[t];!e&&i.data.workspaceKey!==this.currentWorkspaceKey||(i.element.remove(),this.records.splice(t,1))}this.clearDraft()}deleteSelected(){for(let e=this.records.length-1;e>=0;e-=1)this.records[e].selected&&(this.records[e].element.remove(),this.records.splice(e,1));this.engine.events?.trigger?.("markup-changed",this.getData())}dispose(){this.disActive(),this.records.forEach(e=>e.element.remove()),this.records=[],this.layer.remove()}blockDrawingEvent=e=>{this.currentType&&(e instanceof MouseEvent&&this.engine.cadCursorUI?.updateFromMouseEvent?.(e),e.preventDefault(),e.stopImmediatePropagation())};handleMouseDown=e=>{this.currentType&&(this.blockDrawingEvent(e),this.mouseDownPoint=new _.Vector2(e.clientX,e.clientY),this.hasDraggedAfterMouseDown=!1)};handleMouseMove=e=>{if(this.currentType){if(this.blockDrawingEvent(e),this.mouseDownPoint&&e.buttons!==0){const t=new _.Vector2(e.clientX,e.clientY);this.hasDraggedAfterMouseDown=t.distanceTo(this.mouseDownPoint)>3}if(this.isMultiPointType(this.currentType)&&this.polygonPoints.length>0){this.drawMultiPointDraft(this.eventToWorld(e));return}!this.draft||!this.draftStart||(this.draft.data.points=[this.pointToData(this.draftStart),this.pointToData(this.eventToWorld(e))],this.updateElement(this.draft))}};handleMouseUp=e=>{this.currentType&&(this.blockDrawingEvent(e),this.mouseDownPoint=null)};handleClick=e=>{if(this.currentType&&(this.blockDrawingEvent(e),!this.hasDraggedAfterMouseDown)){if(this.currentType==="text"){const t=window.prompt("请输入标记文字","文字")??"";t.trim()&&this.addMarkup({type:"text",points:[this.pointToData(this.eventToWorld(e))],text:t.trim()});return}if(this.isTwoPointType(this.currentType)){const t=this.eventToWorld(e);this.draftStart?this.finishTwoPointDraft(t):this.startTwoPointDraft(t);return}this.isMultiPointType(this.currentType)&&(this.polygonPoints.push(this.eventToWorld(e)),this.drawMultiPointDraft())}};handleDoubleClick=e=>{if(!this.currentType||!this.isMultiPointType(this.currentType))return;this.blockDrawingEvent(e);const t=this.currentType==="cloudline"?2:3,i=this.removeTrailingDuplicatePoints(this.polygonPoints);i.length>=t&&this.addMarkup({type:this.currentType,points:i.map(n=>this.pointToData(n))}),this.polygonPoints=[],this.clearDraft()};handleKeyDown=e=>{if(this.isActive&&(e.key==="Escape"&&(e.preventDefault(),this.clearDraft(),this.polygonPoints=[],this.setDrawType("none")),(e.key==="Delete"||e.key==="Backspace")&&(e.preventDefault(),this.deleteSelected()),e.key==="Enter"&&this.currentType&&this.isMultiPointType(this.currentType))){e.preventDefault();const t=this.currentType==="cloudline"?2:3,i=this.removeTrailingDuplicatePoints(this.polygonPoints);i.length>=t&&this.addMarkup({type:this.currentType,points:i.map(n=>this.pointToData(n))}),this.polygonPoints=[],this.clearDraft()}};createToolbar(){const e=document.createElement("div");e.className="markup-2d-toolbar",[{type:"none",title:"选择"},{type:"line",title:"直线"},{type:"arrow",title:"箭头"},{type:"rect",title:"矩形"},{type:"ellipse",title:"圆形/椭圆"},{type:"polygon",title:"多边形,双击或 Enter 结束"},{type:"cloudline",title:"云线,双击或 Enter 结束"},{type:"text",title:"文字"}].forEach(a=>{const l=this.createIconButton(a.title,Ii[a.type]);l.onclick=()=>{this.active(),this.setDrawType(a.type)},a.type!=="none"&&(this.buttons[a.type]=l),e.appendChild(l)}),e.appendChild(this.createDivider());const i=document.createElement("input");i.type="color",i.value=this.style.stroke,i.title="颜色",i.oninput=()=>{this.style.stroke=i.value,this.style.fill=this.hexToTransparent(i.value)},e.appendChild(i);const n=document.createElement("input");n.type="number",n.min="1",n.max="20",n.value=`${this.style.strokeWidth}`,n.title="线宽",n.onchange=()=>{this.style.strokeWidth=this.normalizeNumber(n.valueAsNumber,1,20,He.strokeWidth)},e.appendChild(n);const r=document.createElement("input");r.type="number",r.min="10",r.max="72",r.value=`${this.style.fontSize}`,r.title="字号",r.onchange=()=>{this.style.fontSize=this.normalizeNumber(r.valueAsNumber,10,72,He.fontSize)},e.appendChild(r),e.appendChild(this.createDivider());const s=this.createIconButton("清空",Li);s.onclick=()=>this.clearAll(),e.appendChild(s);const o=this.createIconButton("关闭",Pi);return o.onclick=()=>{this.hideToolbar(),this.disActive()},e.appendChild(o),e}createDivider(){const e=document.createElement("div");return e.className="markup-2d-divider",e}createIconButton(e,t){const i=document.createElement("button");i.type="button",i.title=e,i.setAttribute("aria-label",e),i.classList.add("markup-2d-icon-button");const n=document.createElement("img");return n.src=t,n.alt=e,n.draggable=!1,i.appendChild(n),i}showToolbar(){this.toolbar.style.display="flex"}hideToolbar(){this.toolbar.style.display="none"}syncToolbar(){Object.entries(this.buttons).forEach(([e,t])=>{t?.classList.toggle("active",e===this.currentType)})}finishDraft(){if(!this.draft)return;const e=this.draft;this.draft=null,e.element.style.pointerEvents="auto",this.records.push(e),this.updateElement(e),this.engine.events?.trigger?.("markup-changed",this.cloneData(e.data))}clearDraft(){this.draft?.element.remove(),this.draft=null,this.draftStart=null}startTwoPointDraft(e){this.draftStart=e.clone(),this.draft=this.createRecord({id:this.createId(),type:this.currentType,workspaceKey:this.currentWorkspaceKey,points:[this.pointToData(e),this.pointToData(e)],style:{...this.style}}),this.draft.element.setAttribute("opacity","0.65"),this.draft.element.style.pointerEvents="none",this.svg.appendChild(this.draft.element),this.updateElement(this.draft)}finishTwoPointDraft(e){!this.draft||!this.draftStart||this.draftStart.distanceTo(e)<1e-6||(this.draft.data.points=[this.pointToData(this.draftStart),this.pointToData(e)],this.draft.element.removeAttribute("opacity"),this.finishDraft(),this.draftStart=null)}drawMultiPointDraft(e){if(this.clearDraft(),this.polygonPoints.length===0)return;const t=e?[...this.polygonPoints,e]:this.polygonPoints;this.draft=this.createRecord({id:this.createId(),type:this.currentType==="cloudline"?"cloudline":"polygon",workspaceKey:this.currentWorkspaceKey,points:t.map(i=>this.pointToData(i)),style:{...this.style}}),this.draft.element.setAttribute("opacity","0.65"),this.draft.element.style.pointerEvents="none",this.svg.appendChild(this.draft.element),this.updateElement(this.draft)}createRecord(e){const t=this.createElement(e.type);t.classList.add("markup-2d-shape");const i={data:this.cloneData(e),element:t};return this.applyStyle(i),this.bindSelection(i),i}createElement(e){return e==="rect"?this.svgElement("rect"):e==="ellipse"?this.svgElement("ellipse"):e==="text"?this.svgElement("text"):e==="polygon"||e==="cloudline"?this.svgElement("g"):this.svgElement("g")}bindSelection(e){e.element.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),this.cancelSelected(),e.selected=!0,e.element.classList.add("selected"),this.engine.events?.trigger?.("markup-click",this.cloneData(e.data))})}cancelSelected(){this.records.forEach(e=>{e.selected=!1,e.element.classList.remove("selected")})}updateElement(e){this.applyStyle(e);const t=e.data.points.map(i=>this.worldToScreen(i));e.data.type==="line"&&this.updateLine(e,t,!1),e.data.type==="arrow"&&this.updateLine(e,t,!0),e.data.type==="rect"&&this.updateRect(e,t),e.data.type==="ellipse"&&this.updateEllipse(e,t),e.data.type==="text"&&this.updateText(e,t[0]),e.data.type==="polygon"&&this.updatePolygon(e,t),e.data.type==="cloudline"&&this.updateCloudLine(e,t)}updateLine(e,t,i){const n=e.element;if(n.innerHTML="",t.length<2)return;const[r,s]=t,o=this.svgElement("line");if(o.setAttribute("x1",`${r.x}`),o.setAttribute("y1",`${r.y}`),o.setAttribute("x2",`${s.x}`),o.setAttribute("y2",`${s.y}`),this.applySvgPaint(o,e.data.style,!1),n.appendChild(o),e===this.draft&&this.drawVertexMarkers(n,t,e.data.style),!i)return;const a=this.createArrowHead(r,s,e.data.style.strokeWidth);this.applySvgPaint(a,e.data.style,!0),a.setAttribute("fill",e.data.style.stroke),n.appendChild(a)}updateRect(e,t){if(t.length<2)return;const[i,n]=t,r=e.element;r.setAttribute("x",`${Math.min(i.x,n.x)}`),r.setAttribute("y",`${Math.min(i.y,n.y)}`),r.setAttribute("width",`${Math.abs(n.x-i.x)}`),r.setAttribute("height",`${Math.abs(n.y-i.y)}`)}updateEllipse(e,t){if(t.length<2)return;const[i,n]=t,r=e.element;r.setAttribute("cx",`${(i.x+n.x)/2}`),r.setAttribute("cy",`${(i.y+n.y)/2}`),r.setAttribute("rx",`${Math.abs(n.x-i.x)/2}`),r.setAttribute("ry",`${Math.abs(n.y-i.y)/2}`)}updateText(e,t){const i=e.element;i.setAttribute("x",`${t.x}`),i.setAttribute("y",`${t.y}`),i.textContent=e.data.text??""}updatePolygon(e,t){const i=e.element;if(i.innerHTML="",t.length===0)return;const n=t.map(s=>`${s.x},${s.y}`).join(" "),r=t.length>=3?this.svgElement("polygon"):this.svgElement("polyline");r.setAttribute("points",n),this.applySvgPaint(r,e.data.style,t.length>=3),i.appendChild(r),e===this.draft&&this.drawVertexMarkers(i,t,e.data.style)}updateCloudLine(e,t){const i=e.element;if(i.innerHTML="",t.length===0)return;const n=this.svgElement("path");n.setAttribute("d",this.buildCloudPath(t,e.data.style.cloudRadius)),this.applySvgPaint(n,e.data.style,!1),i.appendChild(n),e===this.draft&&this.drawVertexMarkers(i,t,e.data.style)}drawVertexMarkers(e,t,i){t.forEach(n=>{const r=this.svgElement("circle");r.setAttribute("cx",`${n.x}`),r.setAttribute("cy",`${n.y}`),r.setAttribute("r",`${Math.max(3,i.strokeWidth+2)}`),r.setAttribute("fill",i.stroke),r.setAttribute("stroke","#ffffff"),r.setAttribute("stroke-width","1"),e.appendChild(r)})}applyStyle(e){e.data.type==="line"||e.data.type==="arrow"||e.data.type==="polygon"||e.data.type==="cloudline"||(this.applySvgPaint(e.element,e.data.style,e.data.type!=="text"&&e.data.type!=="cloudline"),e.data.type==="text"&&(e.element.setAttribute("font-size",`${e.data.style.fontSize}`),e.element.setAttribute("dominant-baseline","middle"),e.element.setAttribute("fill",e.data.style.stroke),e.element.setAttribute("stroke","none")))}applySvgPaint(e,t,i){e.setAttribute("stroke",t.stroke),e.setAttribute("stroke-width",`${t.strokeWidth}`),e.setAttribute("fill",i?t.fill:"none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round")}createArrowHead(e,t,i){const n=Math.atan2(t.y-e.y,t.x-e.x),r=Math.max(10,i*5),s={x:t.x-r*Math.cos(n-Math.PI/6),y:t.y-r*Math.sin(n-Math.PI/6)},o={x:t.x-r*Math.cos(n+Math.PI/6),y:t.y-r*Math.sin(n+Math.PI/6)},a=this.svgElement("polygon");return a.setAttribute("points",`${t.x},${t.y} ${s.x},${s.y} ${o.x},${o.y}`),a}buildCloudPath(e,t){if(e.length===0)return"";if(e.length===1)return`M ${e[0].x} ${e[0].y}`;const i=Math.max(4,t),n=[`M ${e[0].x} ${e[0].y}`];for(let r=0;r<e.length-1;r+=1){const s=e[r],o=e[r+1],a=o.x-s.x,l=o.y-s.y,h=Math.hypot(a,l);if(h<1e-6)continue;const f=Math.max(1,Math.ceil(h/(i*1.6)));for(let p=0;p<f;p+=1){const d=p/f,y=(p+1)/f,c=(d+y)/2,g={x:s.x+a*c-l/h*i*.7,y:s.y+l*c+a/h*i*.7},v={x:s.x+a*y,y:s.y+l*y};n.push(`Q ${g.x} ${g.y} ${v.x} ${v.y}`)}}return n.join(" ")}isMultiPointType(e){return e==="polygon"||e==="cloudline"}isTwoPointType(e){return e==="line"||e==="arrow"||e==="rect"||e==="ellipse"}removeTrailingDuplicatePoints(e){const t=e.map(i=>i.clone());for(;t.length>=2&&t[t.length-1].distanceTo(t[t.length-2])<1e-6;)t.pop();return t}eventToWorld(e){const t=this.engine.renderer.domElement.getBoundingClientRect(),i=this.engine.cameraModule2d.screenToWorld(e.clientX-t.left,e.clientY-t.top);return i.z=0,i}worldToScreen(e){return this.engine.cameraModule2d.worldToScreen(e.x,e.y)}pointToData(e){return{x:e.x,y:e.y,z:e.z}}svgElement(e){return document.createElementNS("http://www.w3.org/2000/svg",e)}cloneData(e){return{...e,points:e.points.map(t=>({...t})),style:{...e.style}}}hexToTransparent(e){const t=e.replace("#",""),i=parseInt(t.slice(0,2),16),n=parseInt(t.slice(2,4),16),r=parseInt(t.slice(4,6),16);return`rgba(${i}, ${n}, ${r}, 0.08)`}normalizeNumber(e,t,i,n){return Number.isFinite(e)?Math.max(t,Math.min(i,Math.round(e))):n}createId(){return`markup-2d-${Date.now()}-${Math.random().toString(16).slice(2)}`}}class zi{container;labelContainer;projectCoordinate;pickCoordinate;emitEvent;labels=new Map;clickCallbacks=new Set;pickResolver=null;isPicking=!1;constructor(e){this.container=e.container,this.projectCoordinate=e.projectCoordinate,this.pickCoordinate=e.pickCoordinate,this.emitEvent=e.emitEvent,this.labelContainer=document.createElement("div"),this.labelContainer.className=e.className??"bim-engine-label-container",this.labelContainer.style.cssText=["position:absolute","left:0","top:0","width:100%","height:100%","pointer-events:none","overflow:hidden","z-index:1200"].join(";"),this.container.appendChild(this.labelContainer)}pickPoint(){return this.cancelPick(),this.isPicking=!0,this.container.style.cursor="crosshair",this.addPickBlockers(),this.container.addEventListener("click",this.handlePickClick,!0),new Promise(e=>{this.pickResolver=e})}startPickPoint(e){const t=this.pickPoint();return e&&t.then(e),t}createLabel(e){const t=e.id??this.createId();if(this.labels.has(t))throw new Error(`LabelManager: label "${t}" already exists`);const i=this.createElement(t),n={id:t,coordinate:{...e.coordinate},icon:e.icon,name:e.name,data:e.data,size:e.iconSize??e.size??28,visible:e.visible??!0,element:i};return this.labels.set(t,n),this.labelContainer.appendChild(i),this.renderLabel(n),this.updateLabelPosition(n),this.emitEvent?.("label-created",this.toPayload(n)),t}updateLabel(e,t){const i=this.labels.get(e);return i?(t.coordinate&&(i.coordinate={...t.coordinate}),t.icon!==void 0&&(i.icon=t.icon),t.name!==void 0&&(i.name=t.name),t.data!==void 0&&(i.data=t.data),t.iconSize!==void 0&&(i.size=t.iconSize),t.size!==void 0&&(i.size=t.size),t.visible!==void 0&&(i.visible=t.visible),this.renderLabel(i),this.updateLabelPosition(i),this.emitEvent?.("label-updated",this.toPayload(i)),!0):!1}deleteLabel(e){const t=this.labels.get(e);return t?(t.element.remove(),this.labels.delete(e),this.emitEvent?.("label-deleted",{id:e}),!0):!1}removeLabel(e){return this.deleteLabel(e)}clearLabels(){Array.from(this.labels.keys()).forEach(e=>this.deleteLabel(e))}getLabel(e){return this.labels.get(e)}getLabels(){return Array.from(this.labels.values())}onLabelClick(e){return this.clickCallbacks.add(e),()=>this.offLabelClick(e)}offLabelClick(e){this.clickCallbacks.delete(e)}update(){this.labels.forEach(e=>this.updateLabelPosition(e))}cancelPick(){this.isPicking&&(this.isPicking=!1,this.container.style.cursor="",this.removePickBlockers(),this.container.removeEventListener("click",this.handlePickClick,!0),this.pickResolver?.(null),this.pickResolver=null)}dispose(){this.cancelPick(),this.clearLabels(),this.clickCallbacks.clear(),this.labelContainer.remove()}createElement(e){const t=document.createElement("div");return t.dataset.labelId=e,t.style.cssText=["position:absolute","display:flex","flex-direction:column","align-items:center","gap:5px","transform:translate(-50%, -100%)","pointer-events:auto","cursor:pointer","user-select:none","white-space:nowrap","font:12px/1.2 -apple-system,BlinkMacSystemFont,Segoe UI,Arial,sans-serif"].join(";"),t.addEventListener("click",i=>{i.preventDefault(),i.stopPropagation();const n=this.labels.get(e);if(!n)return;const r={id:e,label:n,coordinate:n.coordinate,originalEvent:i};this.clickCallbacks.forEach(s=>s(r)),this.emitEvent?.("label-click",r)}),t}renderLabel(e){e.element.innerHTML="";const t=document.createElement("img"),i=this.normalizeIconSize(e.size);t.src=e.icon,t.alt=e.name,t.style.cssText=[`width:${i.width}px`,`height:${i.height}px`,"object-fit:contain","display:block","filter:drop-shadow(0 3px 5px rgba(0,0,0,.32))"].join(";");const n=document.createElement("span");n.textContent=e.name,n.style.cssText=["max-width:160px","overflow:hidden","text-overflow:ellipsis","padding:5px 9px","border-radius:6px","background:rgba(15,23,42,.88)","color:#fff","border:1px solid rgba(255,255,255,.16)","box-shadow:0 3px 10px rgba(0,0,0,.24)"].join(";"),e.element.title=e.name,e.element.appendChild(n),e.element.appendChild(t)}updateLabelPosition(e){const t=this.projectCoordinate(e.coordinate);if(!(e.visible&&t!=null&&t.visible!==!1)||!t){e.element.style.display="none";return}e.element.style.display="flex",e.element.style.left=`${t.x}px`,e.element.style.top=`${t.y}px`}handlePickClick=e=>{e.preventDefault(),e.stopImmediatePropagation();const t=this.pickCoordinate(e);this.isPicking=!1,this.container.style.cursor="",this.removePickBlockers(),this.container.removeEventListener("click",this.handlePickClick,!0),this.pickResolver?.(t),this.pickResolver=null,t&&this.emitEvent?.("label-pick",t)};toPayload(e){return{id:e.id,coordinate:e.coordinate,icon:e.icon,name:e.name,data:e.data,size:e.size,visible:e.visible}}normalizeIconSize(e){return typeof e=="number"?{width:e,height:e}:{width:this.normalizeSizeValue(e.width,28),height:this.normalizeSizeValue(e.height,28)}}normalizeSizeValue(e,t){return Number.isFinite(e)&&e>0?e:t}createId(){return`label-${Date.now()}-${Math.random().toString(16).slice(2)}`}addPickBlockers(){this.container.addEventListener("mousedown",this.blockPickInteraction,!0),this.container.addEventListener("mouseup",this.blockPickInteraction,!0),this.container.addEventListener("touchstart",this.blockPickInteraction,!0),this.container.addEventListener("touchmove",this.blockPickInteraction,!0),this.container.addEventListener("touchend",this.blockPickInteraction,!0)}removePickBlockers(){this.container.removeEventListener("mousedown",this.blockPickInteraction,!0),this.container.removeEventListener("mouseup",this.blockPickInteraction,!0),this.container.removeEventListener("touchstart",this.blockPickInteraction,!0),this.container.removeEventListener("touchmove",this.blockPickInteraction,!0),this.container.removeEventListener("touchend",this.blockPickInteraction,!0)}blockPickInteraction=e=>{e.stopImmediatePropagation()}}class Bi{engine;manager;constructor(e){this.engine=e,this.manager=new zi({container:e.container,className:"bim-engine-label-container bim-engine-label-container-2d",projectCoordinate:t=>this.projectCoordinate(t),pickCoordinate:t=>this.pickCoordinate(t),emitEvent:(t,i)=>this.engine.events?.trigger?.(t,i)})}pickPoint(){return this.manager.pickPoint()}startPickPoint(e){return this.manager.startPickPoint(e)}createLabel(e){return this.manager.createLabel(e)}updateLabel(e,t){return this.manager.updateLabel(e,t)}deleteLabel(e){return this.manager.deleteLabel(e)}removeLabel(e){return this.manager.removeLabel(e)}clearLabels(){this.manager.clearLabels()}getLabel(e){return this.manager.getLabel(e)}getLabels(){return this.manager.getLabels()}onLabelClick(e){return this.manager.onLabelClick(e)}offLabelClick(e){this.manager.offLabelClick(e)}update(){this.manager.update()}dispose(){this.manager.dispose()}projectCoordinate(e){const t=this.engine.cameraModule2d.worldToScreen(e.x??0,e.y??0),i=this.engine.renderer.domElement.clientWidth,n=this.engine.renderer.domElement.clientHeight;return{x:t.x,y:t.y,visible:t.x>=0&&t.x<=i&&t.y>=0&&t.y<=n}}pickCoordinate(e){const t=this.engine.renderer.domElement.getBoundingClientRect(),i=this.engine.cameraModule2d.screenToWorld(e.clientX-t.left,e.clientY-t.top);return{x:i.x,y:i.y,z:0}}}class Ri{engine;mainViewPort=null;constructor(e){this.engine=e}saveMainViewPort(){const e=this.engine.cameraModule2d;return e?(this.mainViewPort={activeCamera:"orthographic",orthographicCamera:e.getViewState()},this.mainViewPort):null}setMainViewPort(e){this.mainViewPort=this.normalizeMainViewPort(e),this.goToMainPort()}goToMainPort(){const e=this.mainViewPort;e&&this.engine.cameraModule2d?.applyViewState(e.orthographicCamera)}resetMainViewPort(){this.mainViewPort=null,this.engine.resetView?.(),this.engine.fitToView?.()}normalizeMainViewPort(e){if(!e)return null;const t=e;return t.orthographicCamera?t:{activeCamera:"orthographic",orthographicCamera:e}}}class Ni{constructor(e,t){this.container=e,this.engine=t,this.el=document.createElement("div"),this.el.className="engine-2d-workspace-tabs",this.container.appendChild(this.el),this.unsubscribe=this.engine.events?.on(me.ModelLoaded,()=>this.refresh())??(()=>{}),this.refresh()}el;unsubscribe;loading=!1;refresh(){const e=this.engine.getLayouts?.()??[],t=this.engine.loaderModule2d?.getActiveWorkspace?.()??{type:"model"};this.el.innerHTML="",this.el.appendChild(this.createTab("模型",t.type==="model",()=>this.switchToModelSpace())),e.forEach((i,n)=>{const r=i.name||`布局${n+1}`;this.el.appendChild(this.createTab(r,t.type==="layout"&&t.layoutId===i.id,()=>this.switchToLayout(i.id)))}),this.el.style.display=e.length>0?"flex":"none"}createTab(e,t,i){const n=document.createElement("button");return n.type="button",n.className="engine-2d-workspace-tabs__item",n.classList.toggle("engine-2d-workspace-tabs__item--active",t),n.textContent=e,n.title=e,n.disabled=this.loading||t,n.addEventListener("click",i),n}async switchToModelSpace(){this.loading||await this.runSwitch(()=>this.engine.showModelSpace?.())}async switchToLayout(e){this.loading||await this.runSwitch(()=>this.engine.loadLayout?.(e))}async runSwitch(e){this.loading=!0,this.refresh();try{await e()}finally{this.loading=!1,this.refresh()}}dispose(){this.unsubscribe(),this.el.remove()}}const Ee={version:"3.9.205"}.version;function $e(){const b=globalThis.crypto?.subtle;if(!b)throw new Error("[BimEngine] Web Crypto API is required for secure sdkAuth credentials mode");return b}function Se(b){return new TextEncoder().encode(b)}function Te(b){return b.buffer.slice(b.byteOffset,b.byteOffset+b.byteLength)}function mt(b){let e="";return b.forEach(t=>{e+=String.fromCharCode(t)}),btoa(e)}function Oi(b){const e=b.getUTCFullYear(),t=String(b.getUTCMonth()+1).padStart(2,"0"),i=String(b.getUTCDate()).padStart(2,"0");return`${e}${t}${i}`}async function Ui(b){const e=await $e().digest("SHA-256",Te(Se(b)));return Array.from(new Uint8Array(e)).map(t=>t.toString(16).padStart(2,"0")).join("")}async function Vi(b,e){const t=$e(),i=await t.importKey("raw",Te(b),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return t.sign("HMAC",i,Te(Se(e)))}function ji(b){return Se([b.appId,b.engineType,b.requestDate,String(b.timestamp),b.nonce].join("|"))}async function Wi(b){const e=$e(),t=new Date,i=t.getTime(),n=Oi(t),r=globalThis.crypto.randomUUID(),s=globalThis.crypto.getRandomValues(new Uint8Array(12)),o=await Ui(b.appSecret),a=await Vi(Se(o),n),l=await e.importKey("raw",a,"AES-GCM",!1,["encrypt"]),h=JSON.stringify({appKey:b.appKey,appSecret:b.appSecret}),f=await e.encrypt({name:"AES-GCM",iv:s,additionalData:Te(ji({appId:b.appId,engineType:b.engineType,requestDate:n,timestamp:i,nonce:r})),tagLength:128},l,Te(Se(h)));return{appId:b.appId,engineType:b.engineType,requestDate:n,timestamp:i,nonce:r,iv:mt(s),cipherText:mt(new Uint8Array(f)),sdkVersion:b.sdkVersion,origin:b.origin,product:b.product}}const Ze=new Map;function Ne(b){return b.replace(/\/+$/,"")}function Oe(b){if(b)return b;if(typeof window<"u"&&typeof window.location?.origin=="string")return window.location.origin}function Fi(b,e){return JSON.stringify({endpoint:Ne(b.endpoint),token:b.token??"",appId:b.appId??"",appKey:b.appKey??"",appSecret:b.appSecret??"",origin:Oe(b.origin)??"",product:b.product??"",engineType:e,sdkVersion:Ee})}async function Ye(b,e,t){const i=typeof AbortController<"u"?new AbortController:void 0,n=i?setTimeout(()=>i.abort(),t):void 0;try{const r=await fetch(b,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:i?.signal}),s=await r.json().catch(()=>({}));if(!r.ok){const o=s?.error?.message??s?.message??`SDK authentication failed with status ${r.status}`;throw new Error(o)}return s}finally{n!=null&&clearTimeout(n)}}async function Gi(b,e){const t=await Ye(`${Ne(b.endpoint)}/oauth/sdk-verify`,{sdkToken:b.token,engineType:e,sdkVersion:Ee,origin:Oe(b.origin),product:b.product},b.timeoutMs??8e3);return t.sdkToken=b.token,t}async function Hi(b,e){const t=await Wi({appId:b.appId,appKey:b.appKey,appSecret:b.appSecret,engineType:e,sdkVersion:Ee,origin:Oe(b.origin),product:b.product}),i=await Ye(`${Ne(b.endpoint)}/oauth/sdk-token/secure`,t,b.timeoutMs??8e3),n=await Ye(`${Ne(b.endpoint)}/oauth/sdk-verify`,{sdkToken:i.sdkToken,engineType:e,sdkVersion:Ee,origin:Oe(b.origin),product:b.product},b.timeoutMs??8e3);return n.sdkToken=i.sdkToken,n}async function $i(b,e){const t=b?.sdkAuth;if(!t)throw new Error("[BimEngine] sdkAuth is required. Provide sdkAuth.token or sdkAuth.appId/appKey/appSecret");if(!t.endpoint)throw new Error("[BimEngine] sdkAuth.endpoint is required");if(!t.token&&!(t.appId&&t.appKey&&t.appSecret))throw new Error("[BimEngine] Provide sdkAuth.token or sdkAuth.appId/appKey/appSecret");const i=Fi(t,e),n=Ze.get(i);if(n){const s=await n;return b&&(b.__sdkAuthSession=s),s}const r=(t.token?Gi(t,e):Hi(t,e)).then(s=>{if(s.authorized!==!0)throw new Error("[BimEngine] SDK authorization rejected");return b&&(b.__sdkAuthSession=s),s}).catch(s=>{throw Ze.delete(i),s});return Ze.set(i,r),r}function Zi(b){return b.replace(/\/+$/,"")}async function Yi(b,e,t){const i=typeof AbortController<"u"?new AbortController:void 0,n=i?setTimeout(()=>i.abort(),t):void 0;try{const r=await fetch(b,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:i?.signal}),s=await r.json().catch(()=>({}));if(!r.ok){const o=s?.error?.message??s?.message??`ViewToken resolve failed with status ${r.status}`;throw new Error(o)}return s}finally{n!=null&&clearTimeout(n)}}async function Ki(b,e,t){const i=await $i(b,t),n=b?.sdkAuth;if(!n?.endpoint)throw new Error("[BimEngine] sdkAuth.endpoint is required for viewToken loading");if(!i?.sdkToken)throw new Error("[BimEngine] sdkToken is missing after SDK authorization");return Yi(`${Zi(n.endpoint)}/models/view-token/resolve`,{sdkToken:i.sdkToken,viewToken:e,engineType:t},n.timeoutMs??8e3)}class gt{options;container=null;animationId=null;isRendering=!1;fpsFrameCount=0;fpsLastCheck=0;currentFps=0;enablePerformanceMonitoring=!1;stats;modelToolModule2d;engineStatus2d;octreeBox2d;events;handelBehaved2d;interactionModule2d;sceneModule2d;cameraModule2d;renderModule2d;controlModule2d;loaderModule2d;layerManager;searchManager;themeManager;measure;markup;label;viewCube;cadCursorUI;contextMenuUI;loadingUI;workspaceTabsUI;versionEl=null;linkView2d3d;linkElement2d3d;scene=null;camera=null;renderer=null;dwgData=null;version=Ee;constructor(e){if(this.options=e,this.options.backgroundColor=this.options.backgroundColor??1710618,this.options.enablePerformanceMonitoring=this.options.enablePerformanceMonitoring??!1,this.options.showMouseCoordinates=this.options.showMouseCoordinates??!1,this.options.loadingStyle=this.options.loadingStyle??2,this.options.contextMenu=this.options.contextMenu??{items:[{action:"hideElement",label:"隐藏模型"},{action:"showAll",label:"显示全部"},{action:"hideLayer",label:"隐藏图层"},{action:"showAllLayers",label:"显示所有图层"},{action:"toggleBg",label:"切换背景"},{action:"layerManage",label:"图层管理"},{action:"linkElement2d3d",label:"模型联动",dividerBefore:!0}]},this.enablePerformanceMonitoring=e.enablePerformanceMonitoring??!1,this.container=document.getElementById(e.containerId),!this.container)throw new Error(`Container ${e.containerId} not found`);this.initialize(),this.handelBehaved2d=mi(this),this.interactionModule2d=new yi(this),this.interactionModule2d.init(),this.interactionModule2d.active()}initialize(){this.events=new Et(!1),this.sceneModule2d=new It(this,this.options),this.scene=this.sceneModule2d.scene,this.cameraModule2d=new Pt(this,this.container),this.camera=this.cameraModule2d.orthographicCamera,this.renderModule2d=new Dt(this,this.container,this.options),this.renderer=this.renderModule2d.renderer,this.controlModule2d=new Bt(this),this.loaderModule2d=new hi(this),this.themeManager=new Ci(this.container),this.layerManager=new tt(this),this.searchManager=new _i(this),this.measure=new Ai(this),this.markup=new Di(this),this.label=new Bi(this),this.viewCube=new Ri(this),this.octreeBox2d=new di(this),this.modelToolModule2d=new pi(this),this.engineStatus2d=new Lt(this),this.linkView2d3d=new ui(this),this.linkElement2d3d=new fi(this),this.sceneModule2d.initGrid(),this.cadCursorUI=new vi(this.container,this.renderer.domElement,this.options.cursorStyle??"short-crosshair"),this.cadCursorUI.setBackgroundColor(this.options.backgroundColor??1710618),this.loadingUI=new wi(this.container,this.options.loadingStyle),this.events.on(me.ModelLoadStart,()=>this.loadingUI.show("正在加载...",0)),this.events.on(me.ModelLoadProgress,e=>this.loadingUI.update(e.text,e.progress)),this.events.on(me.ModelLoaded,()=>this.loadingUI.hide()),this.events.on(me.ModelLoadError,()=>this.loadingUI.hide()),this.versionEl=document.createElement("div"),this.versionEl.className="engine-2d-version-text",this.updateVersionDisplay(),this.container.appendChild(this.versionEl),this.workspaceTabsUI=new Ni(this.container,this),this.contextMenuUI=new bi(this.container,this.renderer.domElement,e=>{if(e==="search"&&this.searchManager.show(),e==="layerManage"&&this.layerManager.toggle(),e==="hideElement"&&this.modelToolModule2d.hideModel(this.engineStatus2d.highlightModels),e==="showAll"&&this.modelToolModule2d.showAllModels(),e==="hideLayer"&&this.hideHighlightedLayers(),e==="showAllLayers"&&(this.layerManager.setAllLayersVisible(!0),this.layerManager.refresh()),e==="toggleBg"){const t=this.themeManager.getTheme()==="dark"?"light":"dark";this.setTheme(t)}if(e==="linkElement2d3d"){const t=this.linkElement2d3d.toggle();this.contextMenuUI.setMenuItemState("linkElement2d3d",t),!t&&!this.isModelSpaceActive()&&(this.modelToolModule2d.unHighlightModelHover(),this.modelToolModule2d.unhighlightAllModels()),console.log(`[EngineKernel2d] 二三维图元联动: ${t?"已开启":"已关闭"}`)}if(e==="linkView2d3d"){const t=this.linkView2d3d.toggle();this.contextMenuUI.setMenuItemState("linkView2d3d",t),console.log(`[EngineKernel2d] 图模关联: ${t?"已开启":"已关闭"}`)}},this.options.contextMenu?.items),this.contextMenuUI.setMenuItemStates({linkElement2d3d:this.linkElement2d3d.isEnabled(),linkView2d3d:this.linkView2d3d.isEnabled()}),this.initStatsMonitor(),this.startRendering(),console.log(`[EngineKernel2d] 2D Engine initialized (v${this.version})`)}startRendering(){this.isRendering||(this.isRendering=!0,this.fpsLastCheck=performance.now(),this.animate(),console.log("[EngineKernel2d] Rendering started"))}stopRendering(){this.isRendering=!1,this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),console.log("[EngineKernel2d] Rendering stopped")}animate=()=>{this.isRendering&&(this.animationId=requestAnimationFrame(this.animate),this.stats?.begin(),this.controlModule2d.update(),this.camera?.updateMatrixWorld(!0),this.measure?.update(),this.markup?.update(),this.label?.update(),this.scene&&this.camera&&this.renderer&&this.renderer.render(this.scene,this.camera),this.enablePerformanceMonitoring&&this.updatePerformanceStats(),this.stats?.end())};initStatsMonitor(){!(this.options.showStats??this.enablePerformanceMonitoring)||!this.container||(this.stats=new Ct,this.stats.showPanel(0),this.stats.dom.className="engine-2d-stats-monitor",this.stats.dom.style.position="absolute",this.stats.dom.style.top="0px",this.stats.dom.style.left="0px",this.stats.dom.style.zIndex="1000",this.container.appendChild(this.stats.dom))}updatePerformanceStats(){this.fpsFrameCount++;const e=performance.now();e-this.fpsLastCheck>=1e3&&(this.currentFps=this.fpsFrameCount,this.fpsFrameCount=0,this.fpsLastCheck=e,this.events.trigger(me.RenderEnd,{fps:this.currentFps}))}async loadModel(e,t){return await this.loaderModule2d.loadModel(e,t),{}}async loadModelByViewToken(e,t){const i=await Ki(this.options,e,"2d");if(i.assetCategory==="composite_model"&&i.urls.length>1)throw new Error("[BimEngine] 2D engine does not support composite_model viewToken loading");return this.loadModel(i.url,t)}getLayouts(){return this.loaderModule2d?.getLayouts()??[]}getActiveWorkspace(){return this.loaderModule2d?.getActiveWorkspace?.()??{type:"model",name:"模型"}}isModelSpaceActive(){return this.getActiveWorkspace().type==="model"}isElementLink2d3dEnabled(){return this.linkElement2d3d?.isEnabled?.()===!0}async loadLayout(e,t){await this.loaderModule2d.loadLayout(e,t)}async showModelSpace(e){await this.loaderModule2d.showModelSpace(e)}getLayers(){return this.loaderModule2d.getLayers()}getEntitiesByLayer(e){return this.loaderModule2d.getEntitiesByLayer(e)}setLayerVisible(e,t){this.layerManager?.setLayerVisible(e,t)}hideHighlightedLayers(){this.getLayersByModelIds(this.engineStatus2d?.highlightModels??[]).forEach(t=>this.layerManager?.setLayerVisible(t,!1)),this.layerManager?.refresh()}getLayersByModelIds(e){const t=new Set;return e.forEach(i=>{(this.loaderModule2d?.model?.nodeMap?.get(String(i))??this.loaderModule2d?.model?.nodeMap?.get(i))?.forEach(r=>{r?.layer&&t.add(r.layer)})}),Array.from(t)}setTheme(e){this.themeManager.setTheme(e);const t=e==="dark"?1710618:15790320;this.setBackgroundColor(t)}resetView(){this.cameraModule2d&&this.cameraModule2d.resetView()}fitToView(){const e=this.loaderModule2d?.getActiveWorkspaceExtents?.();if(this.getActiveWorkspace().type==="layout"&&e){this.cameraModule2d.fitToExtents(e);return}const t=this.dwgData?.metadata,i=t?.viewExtents??t?.extents;i&&this.cameraModule2d.fitToExtents(i)}setZoom(e){this.cameraModule2d&&this.cameraModule2d.setZoom(e)}getZoom(){return this.cameraModule2d?this.cameraModule2d.getZoom():1}updateVersionDisplay(){this.versionEl&&(this.versionEl.innerHTML=`v${this.version}`)}getPerformanceStats(){const e=this.sceneModule2d.getSceneStats();return{fps:this.currentFps,renderTime:0,entityCount:e.objectCount,visibleEntityCount:e.objectCount}}setBackgroundColor(e){this.options.backgroundColor=e,this.sceneModule2d&&this.sceneModule2d.setBackgroundColor(e),this.cadCursorUI?.setBackgroundColor(e),this.modelToolModule2d?.updateColorsForBackground(e),this.layerManager?.refresh()}clearScene(){this.sceneModule2d&&this.sceneModule2d.clearScene()}resize(){if(this.renderModule2d){const e=this.container?.clientWidth??0,t=this.container?.clientHeight??0;this.renderModule2d.setSize(e,t)}}captureImage(e){if(!this.renderer||!this.sceneModule2d)return console.error("[EngineKernel2d] Renderer or scene module not initialized"),null;const t=this.renderer.domElement,i=e?.format||"png",n=e?.quality||.92,r=`image/${i==="jpeg"?"jpeg":i}`,s=e?.transparent??!1,o=e?.hideGrid??!0,a=e?.hideAxes??!0,l=this.scene?.background??null;let h=!1,f=!1;this.sceneModule2d.adaptiveGrid&&(h=this.sceneModule2d.adaptiveGrid.gridGroup?.visible??!1,o&&this.sceneModule2d.adaptiveGrid.setVisible(!1)),this.sceneModule2d.axesHelper&&(f=this.sceneModule2d.axesHelper.visible??!1,a&&this.sceneModule2d.setAxesVisible(!1)),s&&this.scene&&(this.scene.background=null),this.scene&&this.camera&&this.renderer.render(this.scene,this.camera);const p=t.toDataURL(r,n);this.scene&&(this.scene.background=l),this.sceneModule2d.adaptiveGrid&&o&&this.sceneModule2d.adaptiveGrid.setVisible(h),this.sceneModule2d.axesHelper&&a&&this.sceneModule2d.setAxesVisible(f),this.scene&&this.camera&&this.renderer.render(this.scene,this.camera);const d={dataURL:p};if(e?.download){const y=e.filename||`capture-${Date.now()}.${i}`,c=document.createElement("a");c.href=p,c.download=y,c.style.display="none",document.body.appendChild(c),c.click(),c.remove(),console.log(`[EngineKernel2d] Image captured and downloaded: ${y}`)}else console.log("[EngineKernel2d] Image captured");return d}async captureImageAsync(e){if(!this.renderer||!this.sceneModule2d)return console.error("[EngineKernel2d] Renderer or scene module not initialized"),null;const t=this.renderer.domElement,i=e?.format||"png",n=e?.quality||.92,r=`image/${i==="jpeg"?"jpeg":i}`,s=e?.transparent??!1,o=e?.hideGrid??!0,a=e?.hideAxes??!0,l=this.scene?.background??null;let h=!1,f=!1;this.sceneModule2d.adaptiveGrid&&(h=this.sceneModule2d.adaptiveGrid.gridGroup?.visible??!1,o&&this.sceneModule2d.adaptiveGrid.setVisible(!1)),this.sceneModule2d.axesHelper&&(f=this.sceneModule2d.axesHelper.visible??!1,a&&this.sceneModule2d.setAxesVisible(!1)),s&&this.scene&&(this.scene.background=null),this.scene&&this.camera&&this.renderer.render(this.scene,this.camera);const p=t.toDataURL(r,n),d=await new Promise(c=>{t.toBlob(g=>{g&&c(g)},r,n)}),y=URL.createObjectURL(d);if(this.scene&&(this.scene.background=l),this.sceneModule2d.adaptiveGrid&&o&&this.sceneModule2d.adaptiveGrid.setVisible(h),this.sceneModule2d.axesHelper&&a&&this.sceneModule2d.setAxesVisible(f),this.scene&&this.camera&&this.renderer.render(this.scene,this.camera),e?.download){const c=e.filename||`capture-${Date.now()}.${i}`,g=document.createElement("a");g.href=y,g.download=c,g.style.display="none",document.body.appendChild(g),g.click(),g.remove(),console.log(`[EngineKernel2d] Image captured and downloaded: ${c}`)}else console.log("[EngineKernel2d] Image captured with Blob URL:",y);return{dataURL:p,blobURL:y,blob:d}}dispose(){console.log("[EngineKernel2d] Disposing engine..."),this.stopRendering(),this.cadCursorUI?.dispose(),this.contextMenuUI?.dispose(),this.loadingUI?.dispose(),this.workspaceTabsUI?.dispose(),this.versionEl?.parentElement?.removeChild(this.versionEl),this.searchManager?.dispose(),this.measure?.dispose(),this.markup?.dispose(),this.label?.dispose(),this.themeManager?.dispose(),this.loaderModule2d?.dispose(),this.controlModule2d?.dispose(),this.renderModule2d?.dispose(),this.cameraModule2d?.dispose(),this.sceneModule2d?.dispose(),this.events?.dispose(),this.stats?.dom?.parentElement&&this.stats.dom.parentElement.removeChild(this.stats.dom),this.scene=null,this.camera=null,this.renderer=null,this.dwgData=null,this.stats=void 0,this.versionEl=null,console.log("[EngineKernel2d] Engine disposed")}}function yt(b){return new gt(b)}ve.EngineKernel2d=gt,ve.createEngine2d=yt,ve.default=yt,Object.defineProperties(ve,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
@@ -266,7 +266,7 @@ class x {
266
266
  });
267
267
  }
268
268
  }
269
- const L = "3.9.204", z = {
269
+ const L = "3.9.205", z = {
270
270
  version: L
271
271
  }, l = z.version;
272
272
  function w() {
@@ -1 +1 @@
1
- (function(a,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("three"),require("@mkkellogg/gaussian-splats-3d")):typeof define=="function"&&define.amd?define(["exports","three","@mkkellogg/gaussian-splats-3d"],l):(a=typeof globalThis<"u"?globalThis:a||self,l(a.Gaussian={},a.THREE,a.GaussianSplats3D))})(this,(function(a,l,C){"use strict";function y(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const n in t)if(n!=="default"){const i=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,i.get?i:{enumerable:!0,get:()=>t[n]})}}return e.default=t,Object.freeze(e)}const c=y(l),S=y(C);var d=(t=>(t.LoadStart="gaussian-load-start",t.LoadProgress="gaussian-load-progress",t.Loaded="gaussian-loaded",t.LoadError="gaussian-load-error",t.SceneRemoved="gaussian-scene-removed",t.FpsUpdated="gaussian-fps-updated",t.ViewChanged="gaussian-view-changed",t))(d||{});class I{listeners=new Map;on(e,n){const i=String(e);this.listeners.has(i)||this.listeners.set(i,[]),this.listeners.get(i).push(n)}off(e,n){const i=String(e),r=this.listeners.get(i);if(!r)return;const s=r.indexOf(n);s!==-1&&r.splice(s,1),r.length===0&&this.listeners.delete(i)}trigger(e,n){const i=this.listeners.get(String(e));!i||i.length===0||[...i].forEach(r=>{try{r(n)}catch(s){console.error(`[EventModuleGaussian] event handler failed: ${e}`,s)}})}clear(){this.listeners.clear()}dispose(){this.clear()}}class R{scene;constructor(e){this.scene=new c.Scene,e&&(this.scene.background=new c.Color(e))}getScene(){return this.scene}setBackgroundColor(e){this.scene.background=e==null?null:new c.Color(e)}dispose(){this.scene.clear(),this.scene.background=null,this.scene.environment=null}}class E{camera;container;cameraUp;initialLookAt;constructor(e,n,i,r){this.container=e,this.cameraUp=n,this.initialLookAt=r,this.camera=this.createCamera(i)}createCamera(e){const n=Math.max(this.container.clientWidth,1),i=Math.max(this.container.clientHeight,1),r=new c.PerspectiveCamera(65,n/i,.1,5e3);return r.position.fromArray(e),r.up.fromArray(this.cameraUp).normalize(),r.lookAt(new c.Vector3().fromArray(this.initialLookAt)),r.updateProjectionMatrix(),r}getCamera(){return this.camera}updateAspectRatio(e,n){this.camera.aspect=Math.max(e,1)/Math.max(n,1),this.camera.updateProjectionMatrix()}reset(e,n){e&&this.camera.position.fromArray(e),this.camera.lookAt(new c.Vector3().fromArray(n??this.initialLookAt)),this.camera.updateMatrixWorld(!0)}dispose(){this.camera=null}}class T{renderer;viewer;container;animationId=null;isRenderingPaused=!0;fpsFrameCount=0;fpsLastTime=performance.now();fpsInfo={fps:0,frameTimeMs:0,minFps:0};onBeforeRenderCallback;onAfterRenderCallback;onFpsUpdatedCallback;constructor(e,n,i,r){this.container=e,this.renderer=this.createRenderer(r.antialias),this.viewer=new S.Viewer({selfDrivenMode:!1,renderer:this.renderer,camera:i,threeScene:n,rootElement:e,useBuiltInControls:!0,cameraUp:r.cameraUp,initialCameraPosition:r.initialCameraPosition,initialCameraLookAt:r.initialCameraLookAt,sharedMemoryForWorkers:r.sharedMemoryForWorkers,gpuAcceleratedSort:r.gpuAcceleratedSort,sphericalHarmonicsDegree:r.sphericalHarmonicsDegree,...r.viewerOptions??{}})}createRenderer(e){const n=new c.WebGLRenderer({antialias:e,alpha:!0,preserveDrawingBuffer:!1});return n.setSize(Math.max(this.container.clientWidth,1),Math.max(this.container.clientHeight,1)),n.setPixelRatio(Math.min(window.devicePixelRatio,2)),this.container.appendChild(n.domElement),n}setOnBeforeRender(e){this.onBeforeRenderCallback=e}setOnAfterRender(e){this.onAfterRenderCallback=e}setOnFpsUpdated(e){this.onFpsUpdatedCallback=e}startRenderLoop(){this.animationId===null&&(this.isRenderingPaused=!1,this.animate())}animate(){if(this.isRenderingPaused){this.animationId=null;return}this.animationId=requestAnimationFrame(()=>this.animate()),this.render()}render(){this.onBeforeRenderCallback?.(),this.viewer.update(this.renderer),this.viewer.render(),this.onAfterRenderCallback?.(),this.updateFps()}updateFps(){this.fpsFrameCount++;const e=performance.now(),n=e-this.fpsLastTime;if(n<1e3)return;const i=Math.round(this.fpsFrameCount*1e3/n);this.fpsInfo={fps:i,frameTimeMs:i>0?1e3/i:0,minFps:this.fpsInfo.minFps===0?i:Math.min(this.fpsInfo.minFps,i)},this.fpsFrameCount=0,this.fpsLastTime=e,this.onFpsUpdatedCallback?.({...this.fpsInfo})}resetFpsStats(){this.fpsInfo={fps:0,frameTimeMs:0,minFps:0},this.fpsFrameCount=0,this.fpsLastTime=performance.now()}pauseRendering(){this.isRenderingPaused=!0,this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null)}resumeRendering(){this.isRenderingPaused&&this.startRenderLoop()}isRenderingPausedState(){return this.isRenderingPaused}resize(e,n){this.renderer.setSize(Math.max(e,1),Math.max(n,1)),this.renderer.setPixelRatio(Math.min(window.devicePixelRatio,2))}getViewer(){return this.viewer}getRenderer(){return this.renderer}getDomElement(){return this.renderer.domElement}getFpsInfo(){return{...this.fpsInfo}}async dispose(){this.pauseRendering(),await this.viewer.dispose(),this.container.contains(this.renderer.domElement)&&this.container.removeChild(this.renderer.domElement),this.renderer.dispose(),this.renderer.forceContextLoss()}}const b={identity:[0,0,0,1],"x-90":[-.7071068,0,0,.7071068],x90:[.7071068,0,0,.7071068],x180:[1,0,0,0],"y-90":[0,-.7071068,0,.7071068],y90:[0,.7071068,0,.7071068],"z-90":[0,0,-.7071068,.7071068],z90:[0,0,.7071068,.7071068],z180:[0,0,1,0]};class P{orientationPreset;constructor(e="x180"){this.orientationPreset=e}setOrientationPreset(e){this.orientationPreset=e}getOrientationPreset(){return this.orientationPreset}getOrientationRotation(){return[...b[this.orientationPreset]]}active(){}disActive(){}update(){}dispose(){}}function x(t,e){return`${t}#${e}`}class O{viewer;getDefaultRotation;scenes=new Map;constructor(e,n){this.viewer=e,this.getDefaultRotation=n}async loadModel(e,n={}){const i=this.viewer.getSceneCount(),r={showLoadingUI:!0,progressiveLoad:!1,position:[0,0,0],rotation:this.getDefaultRotation(),scale:[1,1,1],...n};await this.viewer.addSplatScene(e,r);const s={id:r.id??x(e,i),name:r.name??e.split(/[\\/]/).pop()??e,url:e,index:i,options:r};return this.scenes.set(s.id,s),s}async loadModels(e){const n=[];for(const i of e)n.push(await this.loadModel(i.url,i.options));return n}async unloadModel(e,n=!0){const i=this.scenes.get(e);i&&(await this.viewer.removeSplatScene(i.index,n),this.scenes.delete(e),this.reindexScenesAfterRemove(i.index))}getModel(e){return this.scenes.get(e)}getAllModels(){return Array.from(this.scenes.values())}getRawSplatScene(e){const n=typeof e=="number"?e:this.scenes.get(e)?.index;return n==null?void 0:this.viewer.getSplatScene(n)}async clear(e=!1){const n=this.getAllModels().map(i=>i.index);n.length>0&&await this.viewer.removeSplatScenes(n,e),this.scenes.clear()}reindexScenesAfterRemove(e){this.scenes.forEach(n=>{n.index>e&&(n.index-=1)})}}const u={version:"3.9.204"}.version;function w(){const t=globalThis.crypto?.subtle;if(!t)throw new Error("[BimEngine] Web Crypto API is required for secure sdkAuth credentials mode");return t}function h(t){return new TextEncoder().encode(t)}function p(t){return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}function v(t){let e="";return t.forEach(n=>{e+=String.fromCharCode(n)}),btoa(e)}function z(t){const e=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0"),i=String(t.getUTCDate()).padStart(2,"0");return`${e}${n}${i}`}async function L(t){const e=await w().digest("SHA-256",p(h(t)));return Array.from(new Uint8Array(e)).map(n=>n.toString(16).padStart(2,"0")).join("")}async function F(t,e){const n=w(),i=await n.importKey("raw",p(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return n.sign("HMAC",i,p(h(e)))}function U(t){return h([t.appId,t.engineType,t.requestDate,String(t.timestamp),t.nonce].join("|"))}async function D(t){const e=w(),n=new Date,i=n.getTime(),r=z(n),s=globalThis.crypto.randomUUID(),o=globalThis.crypto.getRandomValues(new Uint8Array(12)),f=await L(t.appSecret),N=await F(h(f),r),W=await e.importKey("raw",N,"AES-GCM",!1,["encrypt"]),q=JSON.stringify({appKey:t.appKey,appSecret:t.appSecret}),J=await e.encrypt({name:"AES-GCM",iv:o,additionalData:p(U({appId:t.appId,engineType:t.engineType,requestDate:r,timestamp:i,nonce:s})),tagLength:128},W,p(h(q)));return{appId:t.appId,engineType:t.engineType,requestDate:r,timestamp:i,nonce:s,iv:v(o),cipherText:v(new Uint8Array(J)),sdkVersion:t.sdkVersion,origin:t.origin,product:t.product}}const k=new Map;function m(t){return t.replace(/\/+$/,"")}function g(t){if(t)return t;if(typeof window<"u"&&typeof window.location?.origin=="string")return window.location.origin}function K(t,e){return JSON.stringify({endpoint:m(t.endpoint),token:t.token??"",appId:t.appId??"",appKey:t.appKey??"",appSecret:t.appSecret??"",origin:g(t.origin)??"",product:t.product??"",engineType:e,sdkVersion:u})}async function M(t,e,n){const i=typeof AbortController<"u"?new AbortController:void 0,r=i?setTimeout(()=>i.abort(),n):void 0;try{const s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:i?.signal}),o=await s.json().catch(()=>({}));if(!s.ok){const f=o?.error?.message??o?.message??`SDK authentication failed with status ${s.status}`;throw new Error(f)}return o}finally{r!=null&&clearTimeout(r)}}async function B(t,e){const n=await M(`${m(t.endpoint)}/oauth/sdk-verify`,{sdkToken:t.token,engineType:e,sdkVersion:u,origin:g(t.origin),product:t.product},t.timeoutMs??8e3);return n.sdkToken=t.token,n}async function V(t,e){const n=await D({appId:t.appId,appKey:t.appKey,appSecret:t.appSecret,engineType:e,sdkVersion:u,origin:g(t.origin),product:t.product}),i=await M(`${m(t.endpoint)}/oauth/sdk-token/secure`,n,t.timeoutMs??8e3),r=await M(`${m(t.endpoint)}/oauth/sdk-verify`,{sdkToken:i.sdkToken,engineType:e,sdkVersion:u,origin:g(t.origin),product:t.product},t.timeoutMs??8e3);return r.sdkToken=i.sdkToken,r}async function j(t,e){const n=t?.sdkAuth;if(!n)throw new Error("[BimEngine] sdkAuth is required. Provide sdkAuth.token or sdkAuth.appId/appKey/appSecret");if(!n.endpoint)throw new Error("[BimEngine] sdkAuth.endpoint is required");if(!n.token&&!(n.appId&&n.appKey&&n.appSecret))throw new Error("[BimEngine] Provide sdkAuth.token or sdkAuth.appId/appKey/appSecret");const i=K(n,e),r=k.get(i);if(r){const o=await r;return t&&(t.__sdkAuthSession=o),o}const s=(n.token?B(n,e):V(n,e)).then(o=>{if(o.authorized!==!0)throw new Error("[BimEngine] SDK authorization rejected");return t&&(t.__sdkAuthSession=o),o}).catch(o=>{throw k.delete(i),o});return k.set(i,s),s}function $(t){return t.replace(/\/+$/,"")}async function G(t,e,n){const i=typeof AbortController<"u"?new AbortController:void 0,r=i?setTimeout(()=>i.abort(),n):void 0;try{const s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:i?.signal}),o=await s.json().catch(()=>({}));if(!s.ok){const f=o?.error?.message??o?.message??`ViewToken resolve failed with status ${s.status}`;throw new Error(f)}return o}finally{r!=null&&clearTimeout(r)}}async function H(t,e,n){const i=await j(t,n),r=t?.sdkAuth;if(!r?.endpoint)throw new Error("[BimEngine] sdkAuth.endpoint is required for viewToken loading");if(!i?.sdkToken)throw new Error("[BimEngine] sdkToken is missing after SDK authorization");return G(`${$(r.endpoint)}/models/view-token/resolve`,{sdkToken:i.sdkToken,viewToken:e,engineType:n},r.timeoutMs??8e3)}class A{eventModule;sceneModule;cameraModule;renderModule;controlModule;loaderModule;isInitialized=!1;options;version=u;constructor(e){this.options=e,this.initialize(e)}initialize(e){const n={containerId:e.containerId,cameraUp:e.cameraUp??[0,1,0],initialCameraPosition:e.initialCameraPosition??[0,0,6],initialCameraLookAt:e.initialCameraLookAt??[0,0,0],backgroundColor:e.backgroundColor,antialias:e.antialias??!1,showLoadingUI:e.showLoadingUI??!0,sharedMemoryForWorkers:e.sharedMemoryForWorkers??!1,gpuAcceleratedSort:e.gpuAcceleratedSort??!1,sphericalHarmonicsDegree:e.sphericalHarmonicsDegree??0,orientationPreset:e.orientationPreset??"x180",viewerOptions:e.viewerOptions},i=document.getElementById(n.containerId);if(!i)throw new Error(`Container with id "${n.containerId}" not found`);this.eventModule=new I,this.sceneModule=new R(n.backgroundColor),this.cameraModule=new E(i,n.cameraUp,n.initialCameraPosition,n.initialCameraLookAt),this.controlModule=new P(n.orientationPreset),this.renderModule=new T(i,this.sceneModule.getScene(),this.cameraModule.getCamera(),n),this.loaderModule=new O(this.renderModule.getViewer(),()=>this.controlModule.getOrientationRotation()),this.renderModule.setOnBeforeRender(()=>{this.controlModule.update()}),this.renderModule.setOnFpsUpdated(r=>{this.eventModule.trigger(d.FpsUpdated,r)}),this.renderModule.startRenderLoop(),this.isInitialized=!0}async loadModel(e,n={}){this.checkInitialized(),this.eventModule.trigger(d.LoadStart,{url:e,name:n.name});try{const i=await this.loaderModule.loadModel(e,{showLoadingUI:!0,...n,onProgress:(r,s,o)=>{this.eventModule.trigger(d.LoadProgress,{url:e,name:n.name,progress:r}),n.onProgress?.(r,s,o)}});return this.eventModule.trigger(d.Loaded,{url:e,name:i.name,progress:100}),i}catch(i){throw this.eventModule.trigger(d.LoadError,{url:e,name:n.name,error:i instanceof Error?i:new Error(String(i))}),i}}async loadModelByViewToken(e,n={}){const i=await H(this.options,e,"gaussian");if(i.assetCategory==="composite_model"&&i.urls.length>1)throw new Error("EngineKernelGaussian: composite_model viewToken is not supported");return this.loadModel(i.url,n)}async unloadModel(e){this.checkInitialized(),await this.loaderModule.unloadModel(e,!1),this.eventModule.trigger(d.SceneRemoved,{id:e})}setOrientationPreset(e){this.checkInitialized(),this.controlModule.setOrientationPreset(e)}getOrientationPreset(){return this.checkInitialized(),this.controlModule.getOrientationPreset()}resize(e,n){this.checkInitialized();const i=this.renderModule.getDomElement(),r=e??i.parentElement?.clientWidth??i.clientWidth,s=n??i.parentElement?.clientHeight??i.clientHeight;this.renderModule.resize(r,s),this.cameraModule.updateAspectRatio(r,s)}pauseRendering(){this.checkInitialized(),this.renderModule.pauseRendering()}resumeRendering(){this.checkInitialized(),this.renderModule.resumeRendering()}resetFpsStats(){this.checkInitialized(),this.renderModule.resetFpsStats()}getFpsInfo(){return this.checkInitialized(),this.renderModule.getFpsInfo()}on(e,n){this.checkInitialized(),this.eventModule.on(e,n)}off(e,n){this.checkInitialized(),this.eventModule.off(e,n)}getVersion(){return this.version}async dispose(){this.isInitialized&&(await this.loaderModule.clear(!1),await this.renderModule.dispose(),this.controlModule.dispose(),this.cameraModule.dispose(),this.sceneModule.dispose(),this.eventModule.dispose(),this.isInitialized=!1)}checkInitialized(){if(!this.isInitialized)throw new Error("EngineKernelGaussian: Not initialized")}}function _(t){return new A(t)}a.GaussianSplats3D=S,a.EngineKernelGaussian=A,a.EventTypeGaussian=d,a.createEngineGaussian=_,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(a,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("three"),require("@mkkellogg/gaussian-splats-3d")):typeof define=="function"&&define.amd?define(["exports","three","@mkkellogg/gaussian-splats-3d"],l):(a=typeof globalThis<"u"?globalThis:a||self,l(a.Gaussian={},a.THREE,a.GaussianSplats3D))})(this,(function(a,l,C){"use strict";function y(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const n in t)if(n!=="default"){const i=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,i.get?i:{enumerable:!0,get:()=>t[n]})}}return e.default=t,Object.freeze(e)}const c=y(l),S=y(C);var d=(t=>(t.LoadStart="gaussian-load-start",t.LoadProgress="gaussian-load-progress",t.Loaded="gaussian-loaded",t.LoadError="gaussian-load-error",t.SceneRemoved="gaussian-scene-removed",t.FpsUpdated="gaussian-fps-updated",t.ViewChanged="gaussian-view-changed",t))(d||{});class I{listeners=new Map;on(e,n){const i=String(e);this.listeners.has(i)||this.listeners.set(i,[]),this.listeners.get(i).push(n)}off(e,n){const i=String(e),r=this.listeners.get(i);if(!r)return;const s=r.indexOf(n);s!==-1&&r.splice(s,1),r.length===0&&this.listeners.delete(i)}trigger(e,n){const i=this.listeners.get(String(e));!i||i.length===0||[...i].forEach(r=>{try{r(n)}catch(s){console.error(`[EventModuleGaussian] event handler failed: ${e}`,s)}})}clear(){this.listeners.clear()}dispose(){this.clear()}}class R{scene;constructor(e){this.scene=new c.Scene,e&&(this.scene.background=new c.Color(e))}getScene(){return this.scene}setBackgroundColor(e){this.scene.background=e==null?null:new c.Color(e)}dispose(){this.scene.clear(),this.scene.background=null,this.scene.environment=null}}class E{camera;container;cameraUp;initialLookAt;constructor(e,n,i,r){this.container=e,this.cameraUp=n,this.initialLookAt=r,this.camera=this.createCamera(i)}createCamera(e){const n=Math.max(this.container.clientWidth,1),i=Math.max(this.container.clientHeight,1),r=new c.PerspectiveCamera(65,n/i,.1,5e3);return r.position.fromArray(e),r.up.fromArray(this.cameraUp).normalize(),r.lookAt(new c.Vector3().fromArray(this.initialLookAt)),r.updateProjectionMatrix(),r}getCamera(){return this.camera}updateAspectRatio(e,n){this.camera.aspect=Math.max(e,1)/Math.max(n,1),this.camera.updateProjectionMatrix()}reset(e,n){e&&this.camera.position.fromArray(e),this.camera.lookAt(new c.Vector3().fromArray(n??this.initialLookAt)),this.camera.updateMatrixWorld(!0)}dispose(){this.camera=null}}class T{renderer;viewer;container;animationId=null;isRenderingPaused=!0;fpsFrameCount=0;fpsLastTime=performance.now();fpsInfo={fps:0,frameTimeMs:0,minFps:0};onBeforeRenderCallback;onAfterRenderCallback;onFpsUpdatedCallback;constructor(e,n,i,r){this.container=e,this.renderer=this.createRenderer(r.antialias),this.viewer=new S.Viewer({selfDrivenMode:!1,renderer:this.renderer,camera:i,threeScene:n,rootElement:e,useBuiltInControls:!0,cameraUp:r.cameraUp,initialCameraPosition:r.initialCameraPosition,initialCameraLookAt:r.initialCameraLookAt,sharedMemoryForWorkers:r.sharedMemoryForWorkers,gpuAcceleratedSort:r.gpuAcceleratedSort,sphericalHarmonicsDegree:r.sphericalHarmonicsDegree,...r.viewerOptions??{}})}createRenderer(e){const n=new c.WebGLRenderer({antialias:e,alpha:!0,preserveDrawingBuffer:!1});return n.setSize(Math.max(this.container.clientWidth,1),Math.max(this.container.clientHeight,1)),n.setPixelRatio(Math.min(window.devicePixelRatio,2)),this.container.appendChild(n.domElement),n}setOnBeforeRender(e){this.onBeforeRenderCallback=e}setOnAfterRender(e){this.onAfterRenderCallback=e}setOnFpsUpdated(e){this.onFpsUpdatedCallback=e}startRenderLoop(){this.animationId===null&&(this.isRenderingPaused=!1,this.animate())}animate(){if(this.isRenderingPaused){this.animationId=null;return}this.animationId=requestAnimationFrame(()=>this.animate()),this.render()}render(){this.onBeforeRenderCallback?.(),this.viewer.update(this.renderer),this.viewer.render(),this.onAfterRenderCallback?.(),this.updateFps()}updateFps(){this.fpsFrameCount++;const e=performance.now(),n=e-this.fpsLastTime;if(n<1e3)return;const i=Math.round(this.fpsFrameCount*1e3/n);this.fpsInfo={fps:i,frameTimeMs:i>0?1e3/i:0,minFps:this.fpsInfo.minFps===0?i:Math.min(this.fpsInfo.minFps,i)},this.fpsFrameCount=0,this.fpsLastTime=e,this.onFpsUpdatedCallback?.({...this.fpsInfo})}resetFpsStats(){this.fpsInfo={fps:0,frameTimeMs:0,minFps:0},this.fpsFrameCount=0,this.fpsLastTime=performance.now()}pauseRendering(){this.isRenderingPaused=!0,this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null)}resumeRendering(){this.isRenderingPaused&&this.startRenderLoop()}isRenderingPausedState(){return this.isRenderingPaused}resize(e,n){this.renderer.setSize(Math.max(e,1),Math.max(n,1)),this.renderer.setPixelRatio(Math.min(window.devicePixelRatio,2))}getViewer(){return this.viewer}getRenderer(){return this.renderer}getDomElement(){return this.renderer.domElement}getFpsInfo(){return{...this.fpsInfo}}async dispose(){this.pauseRendering(),await this.viewer.dispose(),this.container.contains(this.renderer.domElement)&&this.container.removeChild(this.renderer.domElement),this.renderer.dispose(),this.renderer.forceContextLoss()}}const b={identity:[0,0,0,1],"x-90":[-.7071068,0,0,.7071068],x90:[.7071068,0,0,.7071068],x180:[1,0,0,0],"y-90":[0,-.7071068,0,.7071068],y90:[0,.7071068,0,.7071068],"z-90":[0,0,-.7071068,.7071068],z90:[0,0,.7071068,.7071068],z180:[0,0,1,0]};class P{orientationPreset;constructor(e="x180"){this.orientationPreset=e}setOrientationPreset(e){this.orientationPreset=e}getOrientationPreset(){return this.orientationPreset}getOrientationRotation(){return[...b[this.orientationPreset]]}active(){}disActive(){}update(){}dispose(){}}function x(t,e){return`${t}#${e}`}class O{viewer;getDefaultRotation;scenes=new Map;constructor(e,n){this.viewer=e,this.getDefaultRotation=n}async loadModel(e,n={}){const i=this.viewer.getSceneCount(),r={showLoadingUI:!0,progressiveLoad:!1,position:[0,0,0],rotation:this.getDefaultRotation(),scale:[1,1,1],...n};await this.viewer.addSplatScene(e,r);const s={id:r.id??x(e,i),name:r.name??e.split(/[\\/]/).pop()??e,url:e,index:i,options:r};return this.scenes.set(s.id,s),s}async loadModels(e){const n=[];for(const i of e)n.push(await this.loadModel(i.url,i.options));return n}async unloadModel(e,n=!0){const i=this.scenes.get(e);i&&(await this.viewer.removeSplatScene(i.index,n),this.scenes.delete(e),this.reindexScenesAfterRemove(i.index))}getModel(e){return this.scenes.get(e)}getAllModels(){return Array.from(this.scenes.values())}getRawSplatScene(e){const n=typeof e=="number"?e:this.scenes.get(e)?.index;return n==null?void 0:this.viewer.getSplatScene(n)}async clear(e=!1){const n=this.getAllModels().map(i=>i.index);n.length>0&&await this.viewer.removeSplatScenes(n,e),this.scenes.clear()}reindexScenesAfterRemove(e){this.scenes.forEach(n=>{n.index>e&&(n.index-=1)})}}const u={version:"3.9.205"}.version;function w(){const t=globalThis.crypto?.subtle;if(!t)throw new Error("[BimEngine] Web Crypto API is required for secure sdkAuth credentials mode");return t}function h(t){return new TextEncoder().encode(t)}function p(t){return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}function v(t){let e="";return t.forEach(n=>{e+=String.fromCharCode(n)}),btoa(e)}function z(t){const e=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0"),i=String(t.getUTCDate()).padStart(2,"0");return`${e}${n}${i}`}async function L(t){const e=await w().digest("SHA-256",p(h(t)));return Array.from(new Uint8Array(e)).map(n=>n.toString(16).padStart(2,"0")).join("")}async function F(t,e){const n=w(),i=await n.importKey("raw",p(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return n.sign("HMAC",i,p(h(e)))}function U(t){return h([t.appId,t.engineType,t.requestDate,String(t.timestamp),t.nonce].join("|"))}async function D(t){const e=w(),n=new Date,i=n.getTime(),r=z(n),s=globalThis.crypto.randomUUID(),o=globalThis.crypto.getRandomValues(new Uint8Array(12)),f=await L(t.appSecret),N=await F(h(f),r),W=await e.importKey("raw",N,"AES-GCM",!1,["encrypt"]),q=JSON.stringify({appKey:t.appKey,appSecret:t.appSecret}),J=await e.encrypt({name:"AES-GCM",iv:o,additionalData:p(U({appId:t.appId,engineType:t.engineType,requestDate:r,timestamp:i,nonce:s})),tagLength:128},W,p(h(q)));return{appId:t.appId,engineType:t.engineType,requestDate:r,timestamp:i,nonce:s,iv:v(o),cipherText:v(new Uint8Array(J)),sdkVersion:t.sdkVersion,origin:t.origin,product:t.product}}const k=new Map;function m(t){return t.replace(/\/+$/,"")}function g(t){if(t)return t;if(typeof window<"u"&&typeof window.location?.origin=="string")return window.location.origin}function K(t,e){return JSON.stringify({endpoint:m(t.endpoint),token:t.token??"",appId:t.appId??"",appKey:t.appKey??"",appSecret:t.appSecret??"",origin:g(t.origin)??"",product:t.product??"",engineType:e,sdkVersion:u})}async function M(t,e,n){const i=typeof AbortController<"u"?new AbortController:void 0,r=i?setTimeout(()=>i.abort(),n):void 0;try{const s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:i?.signal}),o=await s.json().catch(()=>({}));if(!s.ok){const f=o?.error?.message??o?.message??`SDK authentication failed with status ${s.status}`;throw new Error(f)}return o}finally{r!=null&&clearTimeout(r)}}async function B(t,e){const n=await M(`${m(t.endpoint)}/oauth/sdk-verify`,{sdkToken:t.token,engineType:e,sdkVersion:u,origin:g(t.origin),product:t.product},t.timeoutMs??8e3);return n.sdkToken=t.token,n}async function V(t,e){const n=await D({appId:t.appId,appKey:t.appKey,appSecret:t.appSecret,engineType:e,sdkVersion:u,origin:g(t.origin),product:t.product}),i=await M(`${m(t.endpoint)}/oauth/sdk-token/secure`,n,t.timeoutMs??8e3),r=await M(`${m(t.endpoint)}/oauth/sdk-verify`,{sdkToken:i.sdkToken,engineType:e,sdkVersion:u,origin:g(t.origin),product:t.product},t.timeoutMs??8e3);return r.sdkToken=i.sdkToken,r}async function j(t,e){const n=t?.sdkAuth;if(!n)throw new Error("[BimEngine] sdkAuth is required. Provide sdkAuth.token or sdkAuth.appId/appKey/appSecret");if(!n.endpoint)throw new Error("[BimEngine] sdkAuth.endpoint is required");if(!n.token&&!(n.appId&&n.appKey&&n.appSecret))throw new Error("[BimEngine] Provide sdkAuth.token or sdkAuth.appId/appKey/appSecret");const i=K(n,e),r=k.get(i);if(r){const o=await r;return t&&(t.__sdkAuthSession=o),o}const s=(n.token?B(n,e):V(n,e)).then(o=>{if(o.authorized!==!0)throw new Error("[BimEngine] SDK authorization rejected");return t&&(t.__sdkAuthSession=o),o}).catch(o=>{throw k.delete(i),o});return k.set(i,s),s}function $(t){return t.replace(/\/+$/,"")}async function G(t,e,n){const i=typeof AbortController<"u"?new AbortController:void 0,r=i?setTimeout(()=>i.abort(),n):void 0;try{const s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:i?.signal}),o=await s.json().catch(()=>({}));if(!s.ok){const f=o?.error?.message??o?.message??`ViewToken resolve failed with status ${s.status}`;throw new Error(f)}return o}finally{r!=null&&clearTimeout(r)}}async function H(t,e,n){const i=await j(t,n),r=t?.sdkAuth;if(!r?.endpoint)throw new Error("[BimEngine] sdkAuth.endpoint is required for viewToken loading");if(!i?.sdkToken)throw new Error("[BimEngine] sdkToken is missing after SDK authorization");return G(`${$(r.endpoint)}/models/view-token/resolve`,{sdkToken:i.sdkToken,viewToken:e,engineType:n},r.timeoutMs??8e3)}class A{eventModule;sceneModule;cameraModule;renderModule;controlModule;loaderModule;isInitialized=!1;options;version=u;constructor(e){this.options=e,this.initialize(e)}initialize(e){const n={containerId:e.containerId,cameraUp:e.cameraUp??[0,1,0],initialCameraPosition:e.initialCameraPosition??[0,0,6],initialCameraLookAt:e.initialCameraLookAt??[0,0,0],backgroundColor:e.backgroundColor,antialias:e.antialias??!1,showLoadingUI:e.showLoadingUI??!0,sharedMemoryForWorkers:e.sharedMemoryForWorkers??!1,gpuAcceleratedSort:e.gpuAcceleratedSort??!1,sphericalHarmonicsDegree:e.sphericalHarmonicsDegree??0,orientationPreset:e.orientationPreset??"x180",viewerOptions:e.viewerOptions},i=document.getElementById(n.containerId);if(!i)throw new Error(`Container with id "${n.containerId}" not found`);this.eventModule=new I,this.sceneModule=new R(n.backgroundColor),this.cameraModule=new E(i,n.cameraUp,n.initialCameraPosition,n.initialCameraLookAt),this.controlModule=new P(n.orientationPreset),this.renderModule=new T(i,this.sceneModule.getScene(),this.cameraModule.getCamera(),n),this.loaderModule=new O(this.renderModule.getViewer(),()=>this.controlModule.getOrientationRotation()),this.renderModule.setOnBeforeRender(()=>{this.controlModule.update()}),this.renderModule.setOnFpsUpdated(r=>{this.eventModule.trigger(d.FpsUpdated,r)}),this.renderModule.startRenderLoop(),this.isInitialized=!0}async loadModel(e,n={}){this.checkInitialized(),this.eventModule.trigger(d.LoadStart,{url:e,name:n.name});try{const i=await this.loaderModule.loadModel(e,{showLoadingUI:!0,...n,onProgress:(r,s,o)=>{this.eventModule.trigger(d.LoadProgress,{url:e,name:n.name,progress:r}),n.onProgress?.(r,s,o)}});return this.eventModule.trigger(d.Loaded,{url:e,name:i.name,progress:100}),i}catch(i){throw this.eventModule.trigger(d.LoadError,{url:e,name:n.name,error:i instanceof Error?i:new Error(String(i))}),i}}async loadModelByViewToken(e,n={}){const i=await H(this.options,e,"gaussian");if(i.assetCategory==="composite_model"&&i.urls.length>1)throw new Error("EngineKernelGaussian: composite_model viewToken is not supported");return this.loadModel(i.url,n)}async unloadModel(e){this.checkInitialized(),await this.loaderModule.unloadModel(e,!1),this.eventModule.trigger(d.SceneRemoved,{id:e})}setOrientationPreset(e){this.checkInitialized(),this.controlModule.setOrientationPreset(e)}getOrientationPreset(){return this.checkInitialized(),this.controlModule.getOrientationPreset()}resize(e,n){this.checkInitialized();const i=this.renderModule.getDomElement(),r=e??i.parentElement?.clientWidth??i.clientWidth,s=n??i.parentElement?.clientHeight??i.clientHeight;this.renderModule.resize(r,s),this.cameraModule.updateAspectRatio(r,s)}pauseRendering(){this.checkInitialized(),this.renderModule.pauseRendering()}resumeRendering(){this.checkInitialized(),this.renderModule.resumeRendering()}resetFpsStats(){this.checkInitialized(),this.renderModule.resetFpsStats()}getFpsInfo(){return this.checkInitialized(),this.renderModule.getFpsInfo()}on(e,n){this.checkInitialized(),this.eventModule.on(e,n)}off(e,n){this.checkInitialized(),this.eventModule.off(e,n)}getVersion(){return this.version}async dispose(){this.isInitialized&&(await this.loaderModule.clear(!1),await this.renderModule.dispose(),this.controlModule.dispose(),this.cameraModule.dispose(),this.sceneModule.dispose(),this.eventModule.dispose(),this.isInitialized=!1)}checkInitialized(){if(!this.isInitialized)throw new Error("EngineKernelGaussian: Not initialized")}}function _(t){return new A(t)}a.GaussianSplats3D=S,a.EngineKernelGaussian=A,a.EventTypeGaussian=d,a.createEngineGaussian=_,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iflow-engine-base",
3
- "version": "3.9.204",
3
+ "version": "3.9.205",
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",