kitchen-simulator 1.0.0-DIY-1119

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 (1159) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +64 -0
  3. package/es/@history.js +2 -0
  4. package/es/AppContext.js +3 -0
  5. package/es/LiteKitchenConfigurator.js +520 -0
  6. package/es/LiteRenderer.js +316 -0
  7. package/es/actions/area-actions.js +14 -0
  8. package/es/actions/export.js +36 -0
  9. package/es/actions/groups-actions.js +89 -0
  10. package/es/actions/holes-actions.js +119 -0
  11. package/es/actions/items-actions.js +352 -0
  12. package/es/actions/lines-actions.js +83 -0
  13. package/es/actions/project-actions.js +298 -0
  14. package/es/actions/scene-actions.js +33 -0
  15. package/es/actions/vertices-actions.js +27 -0
  16. package/es/actions/viewer2d-actions.js +58 -0
  17. package/es/actions/viewer3d-actions.js +23 -0
  18. package/es/analytics/ga4.js +188 -0
  19. package/es/analytics/posthog.js +60 -0
  20. package/es/assets/Window.hdr +2100 -0
  21. package/es/assets/brown_photostudio_02_1k.hdr +0 -0
  22. package/es/assets/fonts/Rene Bieder Milliard Black Italic.woff +0 -0
  23. package/es/assets/fonts/Rene Bieder Milliard Black.woff +0 -0
  24. package/es/assets/fonts/Rene Bieder Milliard Bold Italic.woff +0 -0
  25. package/es/assets/fonts/Rene Bieder Milliard Bold.woff +0 -0
  26. package/es/assets/fonts/Rene Bieder Milliard Book Italic.woff +0 -0
  27. package/es/assets/fonts/Rene Bieder Milliard Book.woff +0 -0
  28. package/es/assets/fonts/Rene Bieder Milliard ExtraBold Italic.woff +0 -0
  29. package/es/assets/fonts/Rene Bieder Milliard ExtraBold.woff +0 -0
  30. package/es/assets/fonts/Rene Bieder Milliard ExtraLight Italic.woff +0 -0
  31. package/es/assets/fonts/Rene Bieder Milliard ExtraLight.woff +0 -0
  32. package/es/assets/fonts/Rene Bieder Milliard Hairline Italic.woff +0 -0
  33. package/es/assets/fonts/Rene Bieder Milliard Hairline.woff +0 -0
  34. package/es/assets/fonts/Rene Bieder Milliard Heavy Italic.woff +0 -0
  35. package/es/assets/fonts/Rene Bieder Milliard Heavy.woff +0 -0
  36. package/es/assets/fonts/Rene Bieder Milliard Light Italic.woff +0 -0
  37. package/es/assets/fonts/Rene Bieder Milliard Light.woff +0 -0
  38. package/es/assets/fonts/Rene Bieder Milliard Medium Italic.woff +0 -0
  39. package/es/assets/fonts/Rene Bieder Milliard Medium.woff +0 -0
  40. package/es/assets/fonts/Rene Bieder Milliard SemiBold Italic.woff +0 -0
  41. package/es/assets/fonts/Rene Bieder Milliard SemiBold.woff +0 -0
  42. package/es/assets/fonts/Rene Bieder Milliard Thin Italic.woff +0 -0
  43. package/es/assets/fonts/Rene Bieder Milliard Thin.woff +0 -0
  44. package/es/assets/fonts/style.css +177 -0
  45. package/es/assets/gltf/door_closet.gltf +1 -0
  46. package/es/assets/gltf/door_exterior.gltf +1 -0
  47. package/es/assets/gltf/door_interior.gltf +1 -0
  48. package/es/assets/gltf/door_sliding.gltf +1 -0
  49. package/es/assets/gltf/doorway_framed.bin +0 -0
  50. package/es/assets/gltf/doorway_framed.fbx +0 -0
  51. package/es/assets/gltf/doorway_framed.gltf +1 -0
  52. package/es/assets/gltf/window_clear.bin +0 -0
  53. package/es/assets/gltf/window_clear.fbx +0 -0
  54. package/es/assets/gltf/window_clear.gltf +1 -0
  55. package/es/assets/gltf/window_cross.bin +0 -0
  56. package/es/assets/gltf/window_cross.fbx +0 -0
  57. package/es/assets/gltf/window_cross.gltf +1 -0
  58. package/es/assets/gltf/window_double_hung.bin +0 -0
  59. package/es/assets/gltf/window_double_hung.fbx +0 -0
  60. package/es/assets/gltf/window_double_hung.gltf +1 -0
  61. package/es/assets/gltf/window_vertical.bin +0 -0
  62. package/es/assets/gltf/window_vertical.fbx +0 -0
  63. package/es/assets/gltf/window_vertical.gltf +1 -0
  64. package/es/assets/img/TKC_thumbnail.png +0 -0
  65. package/es/assets/img/Toggle.png +0 -0
  66. package/es/assets/img/default/maple.jpg +0 -0
  67. package/es/assets/img/default/steel.jpg +0 -0
  68. package/es/assets/img/loading/loading.gif +0 -0
  69. package/es/assets/img/loading/loading_1.svg +11 -0
  70. package/es/assets/img/loading_large.gif +0 -0
  71. package/es/assets/img/png/door/closet.png +0 -0
  72. package/es/assets/img/png/door/doorwaysframed.png +0 -0
  73. package/es/assets/img/png/door/doorwaysframeles.png +0 -0
  74. package/es/assets/img/png/door/doorwaysframeless.png +0 -0
  75. package/es/assets/img/png/door/exterior.png +0 -0
  76. package/es/assets/img/png/door/interior.png +0 -0
  77. package/es/assets/img/png/door/sliding.png +0 -0
  78. package/es/assets/img/png/helper/outcome.png +0 -0
  79. package/es/assets/img/project_img.png +0 -0
  80. package/es/assets/img/rta/rta_logo_box_blue.jpg +0 -0
  81. package/es/assets/img/rta/rta_logo_box_blue_ico.jpg +0 -0
  82. package/es/assets/img/rta/rta_logo_box_blue_ico.svg +55 -0
  83. package/es/assets/img/rta/rta_logo_box_darkGray.jpg +0 -0
  84. package/es/assets/img/rta/rta_logo_box_lightblue.png +0 -0
  85. package/es/assets/img/rta/rta_logo_box_lightmaroon.png +0 -0
  86. package/es/assets/img/rta/rta_logo_box_maroon.png +0 -0
  87. package/es/assets/img/rta/rta_logo_box_white.png +0 -0
  88. package/es/assets/img/rta_menu.png +0 -0
  89. package/es/assets/img/step2.jpg +0 -0
  90. package/es/assets/img/step3.jpg +0 -0
  91. package/es/assets/img/step4.jpg +0 -0
  92. package/es/assets/img/step5.jpg +0 -0
  93. package/es/assets/img/step6.jpg +0 -0
  94. package/es/assets/img/step7.jpg +0 -0
  95. package/es/assets/img/step8.jpg +0 -0
  96. package/es/assets/img/svg/2d_delete_object.svg +33 -0
  97. package/es/assets/img/svg/2d_delete_object1.svg +33 -0
  98. package/es/assets/img/svg/2d_lock_object.svg +33 -0
  99. package/es/assets/img/svg/3d_item_move.svg +10 -0
  100. package/es/assets/img/svg/3d_item_rotation.svg +4 -0
  101. package/es/assets/img/svg/3d_item_warning_edit.svg +77 -0
  102. package/es/assets/img/svg/3d_item_warning_info.svg +81 -0
  103. package/es/assets/img/svg/accessories.svg +4 -0
  104. package/es/assets/img/svg/angle_icon.svg +39 -0
  105. package/es/assets/img/svg/blank_div.svg +14 -0
  106. package/es/assets/img/svg/bottombar/2d3d_button.svg +3 -0
  107. package/es/assets/img/svg/bottombar/2d3d_button_active.svg +3 -0
  108. package/es/assets/img/svg/bottombar/2d3d_toggle.svg +4 -0
  109. package/es/assets/img/svg/bottombar/2d3d_toggle_active.svg +4 -0
  110. package/es/assets/img/svg/bottombar/arrow-down.svg +3 -0
  111. package/es/assets/img/svg/bottombar/arrow-left.svg +3 -0
  112. package/es/assets/img/svg/bottombar/arrow-minus.svg +3 -0
  113. package/es/assets/img/svg/bottombar/arrow-plus.svg +11 -0
  114. package/es/assets/img/svg/bottombar/arrow-right.svg +3 -0
  115. package/es/assets/img/svg/bottombar/arrow-up.svg +3 -0
  116. package/es/assets/img/svg/bottombar/collapse.svg +3 -0
  117. package/es/assets/img/svg/bottombar/elevation-back.svg +6 -0
  118. package/es/assets/img/svg/bottombar/elevation-front.svg +6 -0
  119. package/es/assets/img/svg/bottombar/elevation-left.svg +6 -0
  120. package/es/assets/img/svg/bottombar/elevation-right.svg +7 -0
  121. package/es/assets/img/svg/bottombar/elevation.svg +13 -0
  122. package/es/assets/img/svg/bottombar/expand.svg +3 -0
  123. package/es/assets/img/svg/bottombar/help.svg +72 -0
  124. package/es/assets/img/svg/bottombar/incm_toggle.svg +39 -0
  125. package/es/assets/img/svg/bottombar/pan_1.svg +57 -0
  126. package/es/assets/img/svg/bottombar/pan_2.svg +27 -0
  127. package/es/assets/img/svg/bottombar/pan_3.svg +27 -0
  128. package/es/assets/img/svg/bottombar/pan_4.svg +27 -0
  129. package/es/assets/img/svg/bottombar/pan_5.svg +27 -0
  130. package/es/assets/img/svg/bottombar/settings.svg +23 -0
  131. package/es/assets/img/svg/bottombar/spin-down.svg +76 -0
  132. package/es/assets/img/svg/bottombar/spin-left.svg +75 -0
  133. package/es/assets/img/svg/bottombar/spin-right.svg +75 -0
  134. package/es/assets/img/svg/bottombar/spin-up.svg +76 -0
  135. package/es/assets/img/svg/bottombar/spin_1.svg +48 -0
  136. package/es/assets/img/svg/bottombar/spin_2.svg +31 -0
  137. package/es/assets/img/svg/bottombar/spin_3.svg +31 -0
  138. package/es/assets/img/svg/bottombar/spin_4.svg +31 -0
  139. package/es/assets/img/svg/bottombar/spin_5.svg +31 -0
  140. package/es/assets/img/svg/bottombar/zoomin.svg +29 -0
  141. package/es/assets/img/svg/bottombar/zoomout.svg +26 -0
  142. package/es/assets/img/svg/check.svg +10 -0
  143. package/es/assets/img/svg/close.svg +11 -0
  144. package/es/assets/img/svg/color/Black.svg +3 -0
  145. package/es/assets/img/svg/color/Blue.svg +3 -0
  146. package/es/assets/img/svg/color/Cream.svg +3 -0
  147. package/es/assets/img/svg/color/Gray.svg +3 -0
  148. package/es/assets/img/svg/color/Green.svg +3 -0
  149. package/es/assets/img/svg/color/White.svg +3 -0
  150. package/es/assets/img/svg/color/White.svg.bak +3 -0
  151. package/es/assets/img/svg/color/stone2.jpg +0 -0
  152. package/es/assets/img/svg/color/wood2.jpg +0 -0
  153. package/es/assets/img/svg/copy.svg +11 -0
  154. package/es/assets/img/svg/delete.svg +7 -0
  155. package/es/assets/img/svg/detail.svg +77 -0
  156. package/es/assets/img/svg/disclaimer/background.svg +758 -0
  157. package/es/assets/img/svg/disclaimer/logo-dots.svg +11 -0
  158. package/es/assets/img/svg/door/Closet.svg +11 -0
  159. package/es/assets/img/svg/door/Exterior.svg +5 -0
  160. package/es/assets/img/svg/door/Framed_dorway.svg +5 -0
  161. package/es/assets/img/svg/door/Frameless_dorway.svg +5 -0
  162. package/es/assets/img/svg/door/Interior.svg +7 -0
  163. package/es/assets/img/svg/door/Sliding.svg +5 -0
  164. package/es/assets/img/svg/doors_closet.svg +47 -0
  165. package/es/assets/img/svg/doors_exterior.svg +25 -0
  166. package/es/assets/img/svg/doors_interior.svg +29 -0
  167. package/es/assets/img/svg/doors_patio.svg +26 -0
  168. package/es/assets/img/svg/duplicate.svg +11 -0
  169. package/es/assets/img/svg/duplicate_object_left.svg +32 -0
  170. package/es/assets/img/svg/duplicate_object_right.svg +32 -0
  171. package/es/assets/img/svg/filtersActive.svg +19 -0
  172. package/es/assets/img/svg/firstsetting/L.svg +3 -0
  173. package/es/assets/img/svg/firstsetting/L2.svg +3 -0
  174. package/es/assets/img/svg/firstsetting/Open.svg +3 -0
  175. package/es/assets/img/svg/firstsetting/Square.svg +3 -0
  176. package/es/assets/img/svg/firstsetting/bar-active.svg +9 -0
  177. package/es/assets/img/svg/firstsetting/bar-normal.svg +3 -0
  178. package/es/assets/img/svg/firstsetting/bullet-current.svg +3 -0
  179. package/es/assets/img/svg/firstsetting/bullet-done.svg +3 -0
  180. package/es/assets/img/svg/firstsetting/bullet-not-done.svg +3 -0
  181. package/es/assets/img/svg/firstsetting/check-active.svg +3 -0
  182. package/es/assets/img/svg/firstsetting/check-normal.svg +3 -0
  183. package/es/assets/img/svg/firstsetting/pencil.svg +11 -0
  184. package/es/assets/img/svg/green_checkmark.svg +27 -0
  185. package/es/assets/img/svg/headerbar/assist.svg +3 -0
  186. package/es/assets/img/svg/headerbar/cart.svg +3 -0
  187. package/es/assets/img/svg/headerbar/check.svg +10 -0
  188. package/es/assets/img/svg/headerbar/consult_designer.svg +45 -0
  189. package/es/assets/img/svg/headerbar/edit_name.svg +26 -0
  190. package/es/assets/img/svg/headerbar/file-dollar.svg +13 -0
  191. package/es/assets/img/svg/headerbar/hamburger_menu.svg +32 -0
  192. package/es/assets/img/svg/headerbar/plus.svg +11 -0
  193. package/es/assets/img/svg/headerbar/review_quote.svg +44 -0
  194. package/es/assets/img/svg/headerbar/ruler-measure.svg +11 -0
  195. package/es/assets/img/svg/headerbar/save.svg +3 -0
  196. package/es/assets/img/svg/headerbar/setting.svg +75 -0
  197. package/es/assets/img/svg/help/check.svg +10 -0
  198. package/es/assets/img/svg/help/search.svg +76 -0
  199. package/es/assets/img/svg/intro/1-start-with-floorplan-whole.svg +27 -0
  200. package/es/assets/img/svg/intro/1-start-with-floorplan.svg +26 -0
  201. package/es/assets/img/svg/intro/2-start-from-scratch-whole.svg +28 -0
  202. package/es/assets/img/svg/intro/2-start-from-scratch.svg +27 -0
  203. package/es/assets/img/svg/intro/3-retrieve-project-whole.svg +19 -0
  204. package/es/assets/img/svg/intro/3-retrieve-project.svg +18 -0
  205. package/es/assets/img/svg/invert.svg +12 -0
  206. package/es/assets/img/svg/lefttoolbar/appliance-active.svg +13 -0
  207. package/es/assets/img/svg/lefttoolbar/appliance.svg +13 -0
  208. package/es/assets/img/svg/lefttoolbar/cabinet-active.svg +10 -0
  209. package/es/assets/img/svg/lefttoolbar/cabinet-category.svg +3 -0
  210. package/es/assets/img/svg/lefttoolbar/cabinet-one.svg +3 -0
  211. package/es/assets/img/svg/lefttoolbar/cabinet.svg +10 -0
  212. package/es/assets/img/svg/lefttoolbar/disigner_assistance.svg +89 -0
  213. package/es/assets/img/svg/lefttoolbar/door-style-active.svg +20 -0
  214. package/es/assets/img/svg/lefttoolbar/door-style.svg +20 -0
  215. package/es/assets/img/svg/lefttoolbar/door.svg +12 -0
  216. package/es/assets/img/svg/lefttoolbar/error_icon.svg +81 -0
  217. package/es/assets/img/svg/lefttoolbar/finishing-active.svg +13 -0
  218. package/es/assets/img/svg/lefttoolbar/finishing.svg +13 -0
  219. package/es/assets/img/svg/lefttoolbar/reviewforquote-active.svg +86 -0
  220. package/es/assets/img/svg/lefttoolbar/reviewforquote.svg +12 -0
  221. package/es/assets/img/svg/lefttoolbar/room-shape-L.svg +3 -0
  222. package/es/assets/img/svg/lefttoolbar/room-shape-active.svg +18 -0
  223. package/es/assets/img/svg/lefttoolbar/room-shape-custom.svg +12 -0
  224. package/es/assets/img/svg/lefttoolbar/room-shape-irregular.svg +3 -0
  225. package/es/assets/img/svg/lefttoolbar/room-shape-open.svg +3 -0
  226. package/es/assets/img/svg/lefttoolbar/room-shape-square.svg +3 -0
  227. package/es/assets/img/svg/lefttoolbar/room-shape.svg +18 -0
  228. package/es/assets/img/svg/lefttoolbar/search.svg +76 -0
  229. package/es/assets/img/svg/lefttoolbar/view_more.svg +86 -0
  230. package/es/assets/img/svg/lefttoolbar/warning_icon.svg +81 -0
  231. package/es/assets/img/svg/lefttoolbar/window.svg +12 -0
  232. package/es/assets/img/svg/logo.svg +11 -0
  233. package/es/assets/img/svg/logo_with_text.svg +25 -0
  234. package/es/assets/img/svg/menubar/login.svg +84 -0
  235. package/es/assets/img/svg/menubar/my_projects.svg +85 -0
  236. package/es/assets/img/svg/menubar/new_project.svg +110 -0
  237. package/es/assets/img/svg/menubar/save_project.svg +84 -0
  238. package/es/assets/img/svg/options.svg +3 -0
  239. package/es/assets/img/svg/positioning.svg +3 -0
  240. package/es/assets/img/svg/rotate.png +0 -0
  241. package/es/assets/img/svg/rotate.svg +17 -0
  242. package/es/assets/img/svg/rotate_object_clockwise.svg +26 -0
  243. package/es/assets/img/svg/rotate_object_counterclockwise.svg +26 -0
  244. package/es/assets/img/svg/toggleFilters.svg +19 -0
  245. package/es/assets/img/svg/toolbar/add_appliances_active.svg +64 -0
  246. package/es/assets/img/svg/toolbar/add_appliances_inactive.svg +52 -0
  247. package/es/assets/img/svg/toolbar/add_button.svg +36 -0
  248. package/es/assets/img/svg/toolbar/add_cabinets_active.svg +59 -0
  249. package/es/assets/img/svg/toolbar/add_cabinets_inactive.svg +49 -0
  250. package/es/assets/img/svg/toolbar/add_items_doors.svg +25 -0
  251. package/es/assets/img/svg/toolbar/add_items_doorways.svg +24 -0
  252. package/es/assets/img/svg/toolbar/add_items_refrigerator.svg +32 -0
  253. package/es/assets/img/svg/toolbar/add_items_windows.svg +28 -0
  254. package/es/assets/img/svg/toolbar/apply_button.svg +38 -0
  255. package/es/assets/img/svg/toolbar/arrow-plus.svg +11 -0
  256. package/es/assets/img/svg/toolbar/backsplash.svg +8 -0
  257. package/es/assets/img/svg/toolbar/cancel_button.svg +37 -0
  258. package/es/assets/img/svg/toolbar/consult_a_designer_button.svg +47 -0
  259. package/es/assets/img/svg/toolbar/countertop.svg +7 -0
  260. package/es/assets/img/svg/toolbar/dcm.png +0 -0
  261. package/es/assets/img/svg/toolbar/dcm_off.svg +12 -0
  262. package/es/assets/img/svg/toolbar/dcm_on.svg +474 -0
  263. package/es/assets/img/svg/toolbar/delete_button.svg +37 -0
  264. package/es/assets/img/svg/toolbar/download.svg +77 -0
  265. package/es/assets/img/svg/toolbar/draw_custom_floor.svg +31 -0
  266. package/es/assets/img/svg/toolbar/edit_button.svg +75 -0
  267. package/es/assets/img/svg/toolbar/email_quote_button.svg +44 -0
  268. package/es/assets/img/svg/toolbar/fbm.png +0 -0
  269. package/es/assets/img/svg/toolbar/finishing_touches_active.svg +54 -0
  270. package/es/assets/img/svg/toolbar/finishing_touches_inactive.svg +42 -0
  271. package/es/assets/img/svg/toolbar/floorstyle.svg +9 -0
  272. package/es/assets/img/svg/toolbar/fmb.png +0 -0
  273. package/es/assets/img/svg/toolbar/fmb_off.svg +12 -0
  274. package/es/assets/img/svg/toolbar/fmb_on.svg +489 -0
  275. package/es/assets/img/svg/toolbar/furnishings_icon.svg +6 -0
  276. package/es/assets/img/svg/toolbar/get_started_button.svg +41 -0
  277. package/es/assets/img/svg/toolbar/handles.svg +5 -0
  278. package/es/assets/img/svg/toolbar/lighting.svg +7 -0
  279. package/es/assets/img/svg/toolbar/lrm.png +0 -0
  280. package/es/assets/img/svg/toolbar/lrm_off.svg +12 -0
  281. package/es/assets/img/svg/toolbar/lrm_on.svg +470 -0
  282. package/es/assets/img/svg/toolbar/make_floorplan_active.svg +66 -0
  283. package/es/assets/img/svg/toolbar/make_floorplan_inactive.svg +52 -0
  284. package/es/assets/img/svg/toolbar/predefined_room_l_shaped.svg +20 -0
  285. package/es/assets/img/svg/toolbar/predefined_room_layout.svg +20 -0
  286. package/es/assets/img/svg/toolbar/predefined_room_long_narrow.svg +20 -0
  287. package/es/assets/img/svg/toolbar/predefined_room_open_l_shape.svg +20 -0
  288. package/es/assets/img/svg/toolbar/predefined_room_open_pentagon.svg +20 -0
  289. package/es/assets/img/svg/toolbar/predefined_room_open_rectangle.svg +20 -0
  290. package/es/assets/img/svg/toolbar/predefined_room_open_rectangle_2.svg +20 -0
  291. package/es/assets/img/svg/toolbar/predefined_room_pentagon.svg +20 -0
  292. package/es/assets/img/svg/toolbar/predefined_room_rectangle.svg +20 -0
  293. package/es/assets/img/svg/toolbar/predefined_room_rectangle_with_alcove.svg +20 -0
  294. package/es/assets/img/svg/toolbar/redo_button.svg +75 -0
  295. package/es/assets/img/svg/toolbar/redo_button1.svg +75 -0
  296. package/es/assets/img/svg/toolbar/review_quote_active.svg +14 -0
  297. package/es/assets/img/svg/toolbar/review_quote_inactive.svg +44 -0
  298. package/es/assets/img/svg/toolbar/save_project_button.svg +44 -0
  299. package/es/assets/img/svg/toolbar/select_doorstyle_active.svg +67 -0
  300. package/es/assets/img/svg/toolbar/select_doorstyle_inactive.svg +57 -0
  301. package/es/assets/img/svg/toolbar/shopping-cart.svg +13 -0
  302. package/es/assets/img/svg/toolbar/style_change_button.svg +47 -0
  303. package/es/assets/img/svg/toolbar/take_picture.svg +75 -0
  304. package/es/assets/img/svg/toolbar/undo_button.svg +76 -0
  305. package/es/assets/img/svg/toolbar/undo_button1.svg +76 -0
  306. package/es/assets/img/svg/toolbar/use_button.svg +37 -0
  307. package/es/assets/img/svg/toolbar/wall_color_icon.svg +6 -0
  308. package/es/assets/img/svg/topbar/edit_active.svg +10 -0
  309. package/es/assets/img/svg/topbar/edit_inactive.svg +10 -0
  310. package/es/assets/img/svg/topbar/redo_active.svg +42 -0
  311. package/es/assets/img/svg/topbar/redo_inactive.svg +23 -0
  312. package/es/assets/img/svg/topbar/select_all_active.svg +50 -0
  313. package/es/assets/img/svg/topbar/select_all_inactive.svg +32 -0
  314. package/es/assets/img/svg/topbar/take_picture_active.svg +51 -0
  315. package/es/assets/img/svg/topbar/take_picture_inactive.svg +26 -0
  316. package/es/assets/img/svg/topbar/undo_active.svg +42 -0
  317. package/es/assets/img/svg/topbar/undo_inactive.svg +23 -0
  318. package/es/assets/img/svg/warning_info_2d.svg +81 -0
  319. package/es/assets/img/svg/window/Clear.svg +3 -0
  320. package/es/assets/img/svg/window/Cross.svg +5 -0
  321. package/es/assets/img/svg/window/Double_hung.svg +4 -0
  322. package/es/assets/img/svg/window/Vertical.svg +4 -0
  323. package/es/assets/img/svg/windows_clear.svg +23 -0
  324. package/es/assets/img/svg/windows_cross.svg +28 -0
  325. package/es/assets/img/svg/windows_double_hung.svg +24 -0
  326. package/es/assets/img/svg/windows_vertical.svg +24 -0
  327. package/es/assets/img/svg/wizardstep/Custom.svg +3 -0
  328. package/es/assets/img/svg/wizardstep/Dashed_line.svg +3 -0
  329. package/es/assets/img/svg/wizardstep/L.svg +3 -0
  330. package/es/assets/img/svg/wizardstep/L2.svg +3 -0
  331. package/es/assets/img/svg/wizardstep/Open.svg +3 -0
  332. package/es/assets/img/svg/wizardstep/Square.svg +3 -0
  333. package/es/assets/img/svg/wizardstep/bar-active.svg +9 -0
  334. package/es/assets/img/svg/wizardstep/bar-normal.svg +3 -0
  335. package/es/assets/img/svg/wizardstep/bullet-current.svg +3 -0
  336. package/es/assets/img/svg/wizardstep/bullet-done.svg +3 -0
  337. package/es/assets/img/svg/wizardstep/bullet-not-done.svg +3 -0
  338. package/es/assets/img/svg/wizardstep/check-active.svg +3 -0
  339. package/es/assets/img/svg/wizardstep/check-normal.svg +3 -0
  340. package/es/assets/img/svg/wizardstep/detail_view.svg +87 -0
  341. package/es/assets/img/svg/wizardstep/pencil.svg +11 -0
  342. package/es/assets/img/svg/wizardstep/tile_view.svg +95 -0
  343. package/es/assets/img/texture/glass.jpg +0 -0
  344. package/es/assets/img/texture/steel.jpg +0 -0
  345. package/es/assets/img/texture/white1px.jpg +0 -0
  346. package/es/assets/img/texture/wood.jpg +0 -0
  347. package/es/assets/model/DCM.bin +0 -0
  348. package/es/assets/model/DCM.fbx +0 -0
  349. package/es/assets/model/DCM.gltf +1 -0
  350. package/es/assets/model/FBM.bin +0 -0
  351. package/es/assets/model/FBM.fbx +0 -0
  352. package/es/assets/model/FBM.gltf +1 -0
  353. package/es/assets/model/LRM.bin +0 -0
  354. package/es/assets/model/LRM.fbx +0 -0
  355. package/es/assets/model/LRM.gltf +1 -0
  356. package/es/assets/rtastore_logo.png +0 -0
  357. package/es/catalog/areas/area/planner-element.js +45 -0
  358. package/es/catalog/areas/area/textures/ceramic-tile.jpg +0 -0
  359. package/es/catalog/areas/area/textures/grass.jpg +0 -0
  360. package/es/catalog/areas/area/textures/parquet.jpg +0 -0
  361. package/es/catalog/areas/area/textures/strand-porcelain.jpg +0 -0
  362. package/es/catalog/areas/area/textures/tile1.jpg +0 -0
  363. package/es/catalog/back.png +0 -0
  364. package/es/catalog/cabinet/cabinet-assembly-order.js +36 -0
  365. package/es/catalog/cabinet/cabinet-texture-resolver.js +8 -0
  366. package/es/catalog/catalog.js +263 -0
  367. package/es/catalog/doors.png +0 -0
  368. package/es/catalog/doorways.png +0 -0
  369. package/es/catalog/envMap/nx.hdr +0 -0
  370. package/es/catalog/envMap/ny.hdr +0 -0
  371. package/es/catalog/envMap/nz.hdr +0 -0
  372. package/es/catalog/envMap/px.hdr +0 -0
  373. package/es/catalog/envMap/py.hdr +0 -0
  374. package/es/catalog/envMap/pz.hdr +0 -0
  375. package/es/catalog/export.js +0 -0
  376. package/es/catalog/factories/area-factory-3d.js +178 -0
  377. package/es/catalog/factories/area-factory.js +78 -0
  378. package/es/catalog/factories/export.js +7 -0
  379. package/es/catalog/factories/wall-factory-3d.js +202 -0
  380. package/es/catalog/factories/wall-factory.js +267 -0
  381. package/es/catalog/holes/door-closet/planner-element.js +222 -0
  382. package/es/catalog/holes/door-double/door_double.png +0 -0
  383. package/es/catalog/holes/door-double/planner-element.js +315 -0
  384. package/es/catalog/holes/door-exterior/planner-element.js +215 -0
  385. package/es/catalog/holes/door-interior/planner-element.js +227 -0
  386. package/es/catalog/holes/door-panic/panicDoor.png +0 -0
  387. package/es/catalog/holes/door-panic/planner-element.js +503 -0
  388. package/es/catalog/holes/door-panic-double/panicDoorDouble.png +0 -0
  389. package/es/catalog/holes/door-panic-double/planner-element.js +463 -0
  390. package/es/catalog/holes/door-sliding/planner-element.js +225 -0
  391. package/es/catalog/holes/doorway-framed/planner-element.js +145 -0
  392. package/es/catalog/holes/doorway-frameless/planner-element.js +104 -0
  393. package/es/catalog/holes/export.js +13 -0
  394. package/es/catalog/holes/gate/gate.jpg +0 -0
  395. package/es/catalog/holes/window-clear/planner-element.js +166 -0
  396. package/es/catalog/holes/window-clear/texture.png +0 -0
  397. package/es/catalog/holes/window-cross/planner-element.js +165 -0
  398. package/es/catalog/holes/window-cross/texture.png +0 -0
  399. package/es/catalog/holes/window-double-hung/planner-element.js +303 -0
  400. package/es/catalog/holes/window-double-hung/texture.png +0 -0
  401. package/es/catalog/holes/window-vertical/planner-element.js +276 -0
  402. package/es/catalog/holes/window-vertical/texture.png +0 -0
  403. package/es/catalog/lines/wall/planner-element.js +79 -0
  404. package/es/catalog/lines/wall/textures/bricks-normal.jpg +0 -0
  405. package/es/catalog/lines/wall/textures/bricks.jpg +0 -0
  406. package/es/catalog/lines/wall/textures/bricks2.jpg +0 -0
  407. package/es/catalog/lines/wall/textures/morden-normal.jpg +0 -0
  408. package/es/catalog/lines/wall/textures/morden.jpg +0 -0
  409. package/es/catalog/lines/wall/textures/painted-normal.jpg +0 -0
  410. package/es/catalog/lines/wall/textures/painted.jpg +0 -0
  411. package/es/catalog/lines/wall/textures/plaster-normal.jpg +0 -0
  412. package/es/catalog/lines/wall/textures/plaster.jpg +0 -0
  413. package/es/catalog/lines/wall/wall.png +0 -0
  414. package/es/catalog/molding/molding-dcm/planner-element.js +26 -0
  415. package/es/catalog/molding/molding-dcm/texture.png +0 -0
  416. package/es/catalog/molding/molding-fbm/planner-element.js +26 -0
  417. package/es/catalog/molding/molding-fbm/texture.png +0 -0
  418. package/es/catalog/molding/molding-lrm/planner-element.js +26 -0
  419. package/es/catalog/molding/molding-lrm/texture.png +0 -0
  420. package/es/catalog/utils/exporter.js +172 -0
  421. package/es/catalog/utils/geom-utils.js +189 -0
  422. package/es/catalog/utils/item-loader.js +1606 -0
  423. package/es/catalog/utils/load-obj.js +120 -0
  424. package/es/catalog/utils/mtl-loader.js +357 -0
  425. package/es/catalog/utils/obj-loader.js +476 -0
  426. package/es/catalog/windows.png +0 -0
  427. package/es/class/area.js +140 -0
  428. package/es/class/export.js +22 -0
  429. package/es/class/group.js +431 -0
  430. package/es/class/guide.js +58 -0
  431. package/es/class/hole.js +924 -0
  432. package/es/class/item.js +2131 -0
  433. package/es/class/layer.js +663 -0
  434. package/es/class/line.js +1227 -0
  435. package/es/class/project.js +940 -0
  436. package/es/class/vertex.js +204 -0
  437. package/es/components/content.js +149 -0
  438. package/es/components/export.js +7 -0
  439. package/es/components/style/export.js +5 -0
  440. package/es/components/style/form-number-input.js +183 -0
  441. package/es/components/style/form-submit-button.js +25 -0
  442. package/es/components/viewer2d/area.js +81 -0
  443. package/es/components/viewer2d/export.js +31 -0
  444. package/es/components/viewer2d/grids/grid-horizontal-streak.js +36 -0
  445. package/es/components/viewer2d/grids/grid-streak.js +36 -0
  446. package/es/components/viewer2d/grids/grid-vertical-streak.js +36 -0
  447. package/es/components/viewer2d/grids/grids.js +30 -0
  448. package/es/components/viewer2d/group.js +53 -0
  449. package/es/components/viewer2d/item.js +249 -0
  450. package/es/components/viewer2d/layer.js +164 -0
  451. package/es/components/viewer2d/line.js +964 -0
  452. package/es/components/viewer2d/ruler.js +84 -0
  453. package/es/components/viewer2d/rulerDist.js +102 -0
  454. package/es/components/viewer2d/rulerX.js +145 -0
  455. package/es/components/viewer2d/rulerY.js +147 -0
  456. package/es/components/viewer2d/scene.js +128 -0
  457. package/es/components/viewer2d/snap.js +74 -0
  458. package/es/components/viewer2d/state.js +73 -0
  459. package/es/components/viewer2d/utils.js +187 -0
  460. package/es/components/viewer2d/vertex.js +66 -0
  461. package/es/components/viewer2d/viewer2d.js +1468 -0
  462. package/es/components/viewer3d/camera-controls-module/camera-controls.module.js +2585 -0
  463. package/es/components/viewer3d/dcm.js +401 -0
  464. package/es/components/viewer3d/fbm.js +414 -0
  465. package/es/components/viewer3d/front3D.js +61 -0
  466. package/es/components/viewer3d/grid-creator.js +25 -0
  467. package/es/components/viewer3d/grids/grid-horizontal-streak.js +36 -0
  468. package/es/components/viewer3d/grids/grid-streak.js +27 -0
  469. package/es/components/viewer3d/grids/grid-vertical-streak.js +36 -0
  470. package/es/components/viewer3d/libs/first-person-controls.js +67 -0
  471. package/es/components/viewer3d/libs/helvetiker_regular.typeface.js +1281 -0
  472. package/es/components/viewer3d/libs/mtl-loader.js +357 -0
  473. package/es/components/viewer3d/libs/obj-loader.js +462 -0
  474. package/es/components/viewer3d/libs/orbit-controls.js +697 -0
  475. package/es/components/viewer3d/libs/pointer-lock-controls.js +44 -0
  476. package/es/components/viewer3d/lrm.js +305 -0
  477. package/es/components/viewer3d/model.js +708 -0
  478. package/es/components/viewer3d/pointer-lock-navigation.js +25 -0
  479. package/es/components/viewer3d/ruler-utils/itemRect.js +61 -0
  480. package/es/components/viewer3d/ruler-utils/layer3D.js +495 -0
  481. package/es/components/viewer3d/ruler-utils/ruler3D.js +224 -0
  482. package/es/components/viewer3d/ruler-utils/scene3D.js +59 -0
  483. package/es/components/viewer3d/ruler-utils/state3D.js +18 -0
  484. package/es/components/viewer3d/scene-creator.js +3853 -0
  485. package/es/components/viewer3d/three-memory-cleaner.js +37 -0
  486. package/es/components/viewer3d/viewer3d-first-person.js +309 -0
  487. package/es/components/viewer3d/viewer3d.js +2770 -0
  488. package/es/constants/applianceCategories.js +19 -0
  489. package/es/constants/catalog/skinPanel.js +9 -0
  490. package/es/constants.js +788 -0
  491. package/es/devLiteRenderer.js +913 -0
  492. package/es/engine/2d/viewer-utils.js +20 -0
  493. package/es/events/external/handleExternalEvent.js +144 -0
  494. package/es/events/external/handleExternalEvent.util.js +1099 -0
  495. package/es/events/external/handlers.addItem.js +47 -0
  496. package/es/events/external/handlers.changeDoorStyle.js +138 -0
  497. package/es/events/external/handlers.elementOps.js +16 -0
  498. package/es/events/external/handlers.finishing.js +26 -0
  499. package/es/events/external/handlers.hole.js +4 -0
  500. package/es/events/external/handlers.loadProject.js +127 -0
  501. package/es/events/external/handlers.molding.js +24 -0
  502. package/es/events/external/handlers.projectLifecycle.js +11 -0
  503. package/es/events/external/handlers.projectSettings.js +32 -0
  504. package/es/events/external/handlers.replaceCabinet.js +41 -0
  505. package/es/events/external/handlers.roomShape.js +8 -0
  506. package/es/events/external/handlers.syncScene.js +54 -0
  507. package/es/events/external/handlers.updateSelectedElements.js +11 -0
  508. package/es/events/external/handlers.viewMode.js +11 -0
  509. package/es/events/external/handlers.viewerNavigation.js +108 -0
  510. package/es/events/external/handlers.wall.js +7 -0
  511. package/es/index.js +627 -0
  512. package/es/mappings/external-events/mapExternalEventPayload.js +28 -0
  513. package/es/mappings/external-events/mappers/addItemMapper.js +97 -0
  514. package/es/mappings/external-events/mappers/ccdfMapper.js +97 -0
  515. package/es/mappings/external-events/mappers/ccdfToCDSMapper.js +50 -0
  516. package/es/mappings/external-events/mappers/changeDoorStyleMapper.js +37 -0
  517. package/es/mappings/external-events/mappers/loadProjectMapper.js +62 -0
  518. package/es/mappings/holesToCatalog.js +139 -0
  519. package/es/models.js +533 -0
  520. package/es/plugins/SVGLoader.js +1414 -0
  521. package/es/plugins/console-debugger.js +34 -0
  522. package/es/plugins/export.js +7 -0
  523. package/es/plugins/keyboard.js +110 -0
  524. package/es/reducers/areas-reducer.js +12 -0
  525. package/es/reducers/export.js +23 -0
  526. package/es/reducers/groups-reducer.js +38 -0
  527. package/es/reducers/holes-reducer.js +62 -0
  528. package/es/reducers/items-reducer.js +142 -0
  529. package/es/reducers/lines-reducer.js +45 -0
  530. package/es/reducers/project-reducer.js +136 -0
  531. package/es/reducers/reducer.js +18 -0
  532. package/es/reducers/scene-reducer.js +28 -0
  533. package/es/reducers/vertices-reducer.js +19 -0
  534. package/es/reducers/viewer2d-reducer.js +77 -0
  535. package/es/reducers/viewer3d-reducer.js +58 -0
  536. package/es/shared/concurrency/async-pool.js +71 -0
  537. package/es/shared/domain/asset/load-asset-json.js +53 -0
  538. package/es/shared/domain/asset/sanitize-asset-url.js +25 -0
  539. package/es/shared/domain/cabinet-corner.js +6 -0
  540. package/es/shared/domain/cabinet-mirror.js +7 -0
  541. package/es/shared/domain/cabinet-warning.js +13 -0
  542. package/es/shared/math/line-metrics.js +34 -0
  543. package/es/shared/network/load-json.js +45 -0
  544. package/es/shared/objects/immutable.js +3 -0
  545. package/es/shared-style.js +66 -0
  546. package/es/translator/en.js +104 -0
  547. package/es/translator/it.js +79 -0
  548. package/es/translator/ru.js +79 -0
  549. package/es/translator/translator.js +80 -0
  550. package/es/utils/browser.js +33 -0
  551. package/es/utils/convert-units-lite.js +38 -0
  552. package/es/utils/email-validator.js +4 -0
  553. package/es/utils/export.js +25 -0
  554. package/es/utils/geometry/overlap/index.js +1 -0
  555. package/es/utils/geometry/overlap/overlapHelpers.js +24 -0
  556. package/es/utils/geometry/overlap/pointHelpers.js +25 -0
  557. package/es/utils/geometry/overlap/relationshipOfTwoOverlappedLines2.js +374 -0
  558. package/es/utils/geometry.js +2800 -0
  559. package/es/utils/get-edges-of-subgraphs.js +26 -0
  560. package/es/utils/graph-cycles.js +238 -0
  561. package/es/utils/graph-inner-cycles.js +46 -0
  562. package/es/utils/graph.js +145 -0
  563. package/es/utils/helper.js +448 -0
  564. package/es/utils/history.js +41 -0
  565. package/es/utils/id-broker.js +15 -0
  566. package/es/utils/logger.js +8 -0
  567. package/es/utils/math.js +50 -0
  568. package/es/utils/molding.js +1118 -0
  569. package/es/utils/name-generator.js +14 -0
  570. package/es/utils/objects-utils.js +50 -0
  571. package/es/utils/phone-validator.js +4 -0
  572. package/es/utils/process-black-list.js +15 -0
  573. package/es/utils/react-if.js +18 -0
  574. package/es/utils/ruler.js +58 -0
  575. package/es/utils/skinPanelEngine.js +631 -0
  576. package/es/utils/snap-scene.js +94 -0
  577. package/es/utils/snap.js +231 -0
  578. package/es/utils/summarizeCart.js +24 -0
  579. package/es/utils/threeCSG.es6.js +494 -0
  580. package/es/version.js +1 -0
  581. package/lib/@history.js +11 -0
  582. package/lib/AppContext.js +11 -0
  583. package/lib/LiteKitchenConfigurator.js +529 -0
  584. package/lib/LiteRenderer.js +325 -0
  585. package/lib/actions/area-actions.js +21 -0
  586. package/lib/actions/export.js +36 -0
  587. package/lib/actions/groups-actions.js +107 -0
  588. package/lib/actions/holes-actions.js +140 -0
  589. package/lib/actions/items-actions.js +405 -0
  590. package/lib/actions/lines-actions.js +98 -0
  591. package/lib/actions/project-actions.js +351 -0
  592. package/lib/actions/scene-actions.js +43 -0
  593. package/lib/actions/vertices-actions.js +35 -0
  594. package/lib/actions/viewer2d-actions.js +73 -0
  595. package/lib/actions/viewer3d-actions.js +32 -0
  596. package/lib/analytics/ga4.js +194 -0
  597. package/lib/analytics/posthog.js +68 -0
  598. package/lib/assets/Window.hdr +2100 -0
  599. package/lib/assets/brown_photostudio_02_1k.hdr +0 -0
  600. package/lib/assets/fonts/Rene Bieder Milliard Black Italic.woff +0 -0
  601. package/lib/assets/fonts/Rene Bieder Milliard Black.woff +0 -0
  602. package/lib/assets/fonts/Rene Bieder Milliard Bold Italic.woff +0 -0
  603. package/lib/assets/fonts/Rene Bieder Milliard Bold.woff +0 -0
  604. package/lib/assets/fonts/Rene Bieder Milliard Book Italic.woff +0 -0
  605. package/lib/assets/fonts/Rene Bieder Milliard Book.woff +0 -0
  606. package/lib/assets/fonts/Rene Bieder Milliard ExtraBold Italic.woff +0 -0
  607. package/lib/assets/fonts/Rene Bieder Milliard ExtraBold.woff +0 -0
  608. package/lib/assets/fonts/Rene Bieder Milliard ExtraLight Italic.woff +0 -0
  609. package/lib/assets/fonts/Rene Bieder Milliard ExtraLight.woff +0 -0
  610. package/lib/assets/fonts/Rene Bieder Milliard Hairline Italic.woff +0 -0
  611. package/lib/assets/fonts/Rene Bieder Milliard Hairline.woff +0 -0
  612. package/lib/assets/fonts/Rene Bieder Milliard Heavy Italic.woff +0 -0
  613. package/lib/assets/fonts/Rene Bieder Milliard Heavy.woff +0 -0
  614. package/lib/assets/fonts/Rene Bieder Milliard Light Italic.woff +0 -0
  615. package/lib/assets/fonts/Rene Bieder Milliard Light.woff +0 -0
  616. package/lib/assets/fonts/Rene Bieder Milliard Medium Italic.woff +0 -0
  617. package/lib/assets/fonts/Rene Bieder Milliard Medium.woff +0 -0
  618. package/lib/assets/fonts/Rene Bieder Milliard SemiBold Italic.woff +0 -0
  619. package/lib/assets/fonts/Rene Bieder Milliard SemiBold.woff +0 -0
  620. package/lib/assets/fonts/Rene Bieder Milliard Thin Italic.woff +0 -0
  621. package/lib/assets/fonts/Rene Bieder Milliard Thin.woff +0 -0
  622. package/lib/assets/fonts/style.css +177 -0
  623. package/lib/assets/gltf/door_closet.gltf +1 -0
  624. package/lib/assets/gltf/door_exterior.gltf +1 -0
  625. package/lib/assets/gltf/door_interior.gltf +1 -0
  626. package/lib/assets/gltf/door_sliding.gltf +1 -0
  627. package/lib/assets/gltf/doorway_framed.bin +0 -0
  628. package/lib/assets/gltf/doorway_framed.fbx +0 -0
  629. package/lib/assets/gltf/doorway_framed.gltf +1 -0
  630. package/lib/assets/gltf/window_clear.bin +0 -0
  631. package/lib/assets/gltf/window_clear.fbx +0 -0
  632. package/lib/assets/gltf/window_clear.gltf +1 -0
  633. package/lib/assets/gltf/window_cross.bin +0 -0
  634. package/lib/assets/gltf/window_cross.fbx +0 -0
  635. package/lib/assets/gltf/window_cross.gltf +1 -0
  636. package/lib/assets/gltf/window_double_hung.bin +0 -0
  637. package/lib/assets/gltf/window_double_hung.fbx +0 -0
  638. package/lib/assets/gltf/window_double_hung.gltf +1 -0
  639. package/lib/assets/gltf/window_vertical.bin +0 -0
  640. package/lib/assets/gltf/window_vertical.fbx +0 -0
  641. package/lib/assets/gltf/window_vertical.gltf +1 -0
  642. package/lib/assets/img/TKC_thumbnail.png +0 -0
  643. package/lib/assets/img/Toggle.png +0 -0
  644. package/lib/assets/img/default/maple.jpg +0 -0
  645. package/lib/assets/img/default/steel.jpg +0 -0
  646. package/lib/assets/img/loading/loading.gif +0 -0
  647. package/lib/assets/img/loading/loading_1.svg +11 -0
  648. package/lib/assets/img/loading_large.gif +0 -0
  649. package/lib/assets/img/png/door/closet.png +0 -0
  650. package/lib/assets/img/png/door/doorwaysframed.png +0 -0
  651. package/lib/assets/img/png/door/doorwaysframeles.png +0 -0
  652. package/lib/assets/img/png/door/doorwaysframeless.png +0 -0
  653. package/lib/assets/img/png/door/exterior.png +0 -0
  654. package/lib/assets/img/png/door/interior.png +0 -0
  655. package/lib/assets/img/png/door/sliding.png +0 -0
  656. package/lib/assets/img/png/helper/outcome.png +0 -0
  657. package/lib/assets/img/project_img.png +0 -0
  658. package/lib/assets/img/rta/rta_logo_box_blue.jpg +0 -0
  659. package/lib/assets/img/rta/rta_logo_box_blue_ico.jpg +0 -0
  660. package/lib/assets/img/rta/rta_logo_box_blue_ico.svg +55 -0
  661. package/lib/assets/img/rta/rta_logo_box_darkGray.jpg +0 -0
  662. package/lib/assets/img/rta/rta_logo_box_lightblue.png +0 -0
  663. package/lib/assets/img/rta/rta_logo_box_lightmaroon.png +0 -0
  664. package/lib/assets/img/rta/rta_logo_box_maroon.png +0 -0
  665. package/lib/assets/img/rta/rta_logo_box_white.png +0 -0
  666. package/lib/assets/img/rta_menu.png +0 -0
  667. package/lib/assets/img/step2.jpg +0 -0
  668. package/lib/assets/img/step3.jpg +0 -0
  669. package/lib/assets/img/step4.jpg +0 -0
  670. package/lib/assets/img/step5.jpg +0 -0
  671. package/lib/assets/img/step6.jpg +0 -0
  672. package/lib/assets/img/step7.jpg +0 -0
  673. package/lib/assets/img/step8.jpg +0 -0
  674. package/lib/assets/img/svg/2d_delete_object.svg +33 -0
  675. package/lib/assets/img/svg/2d_delete_object1.svg +33 -0
  676. package/lib/assets/img/svg/2d_lock_object.svg +33 -0
  677. package/lib/assets/img/svg/3d_item_move.svg +10 -0
  678. package/lib/assets/img/svg/3d_item_rotation.svg +4 -0
  679. package/lib/assets/img/svg/3d_item_warning_edit.svg +77 -0
  680. package/lib/assets/img/svg/3d_item_warning_info.svg +81 -0
  681. package/lib/assets/img/svg/accessories.svg +4 -0
  682. package/lib/assets/img/svg/angle_icon.svg +39 -0
  683. package/lib/assets/img/svg/blank_div.svg +14 -0
  684. package/lib/assets/img/svg/bottombar/2d3d_button.svg +3 -0
  685. package/lib/assets/img/svg/bottombar/2d3d_button_active.svg +3 -0
  686. package/lib/assets/img/svg/bottombar/2d3d_toggle.svg +4 -0
  687. package/lib/assets/img/svg/bottombar/2d3d_toggle_active.svg +4 -0
  688. package/lib/assets/img/svg/bottombar/arrow-down.svg +3 -0
  689. package/lib/assets/img/svg/bottombar/arrow-left.svg +3 -0
  690. package/lib/assets/img/svg/bottombar/arrow-minus.svg +3 -0
  691. package/lib/assets/img/svg/bottombar/arrow-plus.svg +11 -0
  692. package/lib/assets/img/svg/bottombar/arrow-right.svg +3 -0
  693. package/lib/assets/img/svg/bottombar/arrow-up.svg +3 -0
  694. package/lib/assets/img/svg/bottombar/collapse.svg +3 -0
  695. package/lib/assets/img/svg/bottombar/elevation-back.svg +6 -0
  696. package/lib/assets/img/svg/bottombar/elevation-front.svg +6 -0
  697. package/lib/assets/img/svg/bottombar/elevation-left.svg +6 -0
  698. package/lib/assets/img/svg/bottombar/elevation-right.svg +7 -0
  699. package/lib/assets/img/svg/bottombar/elevation.svg +13 -0
  700. package/lib/assets/img/svg/bottombar/expand.svg +3 -0
  701. package/lib/assets/img/svg/bottombar/help.svg +72 -0
  702. package/lib/assets/img/svg/bottombar/incm_toggle.svg +39 -0
  703. package/lib/assets/img/svg/bottombar/pan_1.svg +57 -0
  704. package/lib/assets/img/svg/bottombar/pan_2.svg +27 -0
  705. package/lib/assets/img/svg/bottombar/pan_3.svg +27 -0
  706. package/lib/assets/img/svg/bottombar/pan_4.svg +27 -0
  707. package/lib/assets/img/svg/bottombar/pan_5.svg +27 -0
  708. package/lib/assets/img/svg/bottombar/settings.svg +23 -0
  709. package/lib/assets/img/svg/bottombar/spin-down.svg +76 -0
  710. package/lib/assets/img/svg/bottombar/spin-left.svg +75 -0
  711. package/lib/assets/img/svg/bottombar/spin-right.svg +75 -0
  712. package/lib/assets/img/svg/bottombar/spin-up.svg +76 -0
  713. package/lib/assets/img/svg/bottombar/spin_1.svg +48 -0
  714. package/lib/assets/img/svg/bottombar/spin_2.svg +31 -0
  715. package/lib/assets/img/svg/bottombar/spin_3.svg +31 -0
  716. package/lib/assets/img/svg/bottombar/spin_4.svg +31 -0
  717. package/lib/assets/img/svg/bottombar/spin_5.svg +31 -0
  718. package/lib/assets/img/svg/bottombar/zoomin.svg +29 -0
  719. package/lib/assets/img/svg/bottombar/zoomout.svg +26 -0
  720. package/lib/assets/img/svg/check.svg +10 -0
  721. package/lib/assets/img/svg/close.svg +11 -0
  722. package/lib/assets/img/svg/color/Black.svg +3 -0
  723. package/lib/assets/img/svg/color/Blue.svg +3 -0
  724. package/lib/assets/img/svg/color/Cream.svg +3 -0
  725. package/lib/assets/img/svg/color/Gray.svg +3 -0
  726. package/lib/assets/img/svg/color/Green.svg +3 -0
  727. package/lib/assets/img/svg/color/White.svg +3 -0
  728. package/lib/assets/img/svg/color/White.svg.bak +3 -0
  729. package/lib/assets/img/svg/color/stone2.jpg +0 -0
  730. package/lib/assets/img/svg/color/wood2.jpg +0 -0
  731. package/lib/assets/img/svg/copy.svg +11 -0
  732. package/lib/assets/img/svg/delete.svg +7 -0
  733. package/lib/assets/img/svg/detail.svg +77 -0
  734. package/lib/assets/img/svg/disclaimer/background.svg +758 -0
  735. package/lib/assets/img/svg/disclaimer/logo-dots.svg +11 -0
  736. package/lib/assets/img/svg/door/Closet.svg +11 -0
  737. package/lib/assets/img/svg/door/Exterior.svg +5 -0
  738. package/lib/assets/img/svg/door/Framed_dorway.svg +5 -0
  739. package/lib/assets/img/svg/door/Frameless_dorway.svg +5 -0
  740. package/lib/assets/img/svg/door/Interior.svg +7 -0
  741. package/lib/assets/img/svg/door/Sliding.svg +5 -0
  742. package/lib/assets/img/svg/doors_closet.svg +47 -0
  743. package/lib/assets/img/svg/doors_exterior.svg +25 -0
  744. package/lib/assets/img/svg/doors_interior.svg +29 -0
  745. package/lib/assets/img/svg/doors_patio.svg +26 -0
  746. package/lib/assets/img/svg/duplicate.svg +11 -0
  747. package/lib/assets/img/svg/duplicate_object_left.svg +32 -0
  748. package/lib/assets/img/svg/duplicate_object_right.svg +32 -0
  749. package/lib/assets/img/svg/filtersActive.svg +19 -0
  750. package/lib/assets/img/svg/firstsetting/L.svg +3 -0
  751. package/lib/assets/img/svg/firstsetting/L2.svg +3 -0
  752. package/lib/assets/img/svg/firstsetting/Open.svg +3 -0
  753. package/lib/assets/img/svg/firstsetting/Square.svg +3 -0
  754. package/lib/assets/img/svg/firstsetting/bar-active.svg +9 -0
  755. package/lib/assets/img/svg/firstsetting/bar-normal.svg +3 -0
  756. package/lib/assets/img/svg/firstsetting/bullet-current.svg +3 -0
  757. package/lib/assets/img/svg/firstsetting/bullet-done.svg +3 -0
  758. package/lib/assets/img/svg/firstsetting/bullet-not-done.svg +3 -0
  759. package/lib/assets/img/svg/firstsetting/check-active.svg +3 -0
  760. package/lib/assets/img/svg/firstsetting/check-normal.svg +3 -0
  761. package/lib/assets/img/svg/firstsetting/pencil.svg +11 -0
  762. package/lib/assets/img/svg/green_checkmark.svg +27 -0
  763. package/lib/assets/img/svg/headerbar/assist.svg +3 -0
  764. package/lib/assets/img/svg/headerbar/cart.svg +3 -0
  765. package/lib/assets/img/svg/headerbar/check.svg +10 -0
  766. package/lib/assets/img/svg/headerbar/consult_designer.svg +45 -0
  767. package/lib/assets/img/svg/headerbar/edit_name.svg +26 -0
  768. package/lib/assets/img/svg/headerbar/file-dollar.svg +13 -0
  769. package/lib/assets/img/svg/headerbar/hamburger_menu.svg +32 -0
  770. package/lib/assets/img/svg/headerbar/plus.svg +11 -0
  771. package/lib/assets/img/svg/headerbar/review_quote.svg +44 -0
  772. package/lib/assets/img/svg/headerbar/ruler-measure.svg +11 -0
  773. package/lib/assets/img/svg/headerbar/save.svg +3 -0
  774. package/lib/assets/img/svg/headerbar/setting.svg +75 -0
  775. package/lib/assets/img/svg/help/check.svg +10 -0
  776. package/lib/assets/img/svg/help/search.svg +76 -0
  777. package/lib/assets/img/svg/intro/1-start-with-floorplan-whole.svg +27 -0
  778. package/lib/assets/img/svg/intro/1-start-with-floorplan.svg +26 -0
  779. package/lib/assets/img/svg/intro/2-start-from-scratch-whole.svg +28 -0
  780. package/lib/assets/img/svg/intro/2-start-from-scratch.svg +27 -0
  781. package/lib/assets/img/svg/intro/3-retrieve-project-whole.svg +19 -0
  782. package/lib/assets/img/svg/intro/3-retrieve-project.svg +18 -0
  783. package/lib/assets/img/svg/invert.svg +12 -0
  784. package/lib/assets/img/svg/lefttoolbar/appliance-active.svg +13 -0
  785. package/lib/assets/img/svg/lefttoolbar/appliance.svg +13 -0
  786. package/lib/assets/img/svg/lefttoolbar/cabinet-active.svg +10 -0
  787. package/lib/assets/img/svg/lefttoolbar/cabinet-category.svg +3 -0
  788. package/lib/assets/img/svg/lefttoolbar/cabinet-one.svg +3 -0
  789. package/lib/assets/img/svg/lefttoolbar/cabinet.svg +10 -0
  790. package/lib/assets/img/svg/lefttoolbar/disigner_assistance.svg +89 -0
  791. package/lib/assets/img/svg/lefttoolbar/door-style-active.svg +20 -0
  792. package/lib/assets/img/svg/lefttoolbar/door-style.svg +20 -0
  793. package/lib/assets/img/svg/lefttoolbar/door.svg +12 -0
  794. package/lib/assets/img/svg/lefttoolbar/error_icon.svg +81 -0
  795. package/lib/assets/img/svg/lefttoolbar/finishing-active.svg +13 -0
  796. package/lib/assets/img/svg/lefttoolbar/finishing.svg +13 -0
  797. package/lib/assets/img/svg/lefttoolbar/reviewforquote-active.svg +86 -0
  798. package/lib/assets/img/svg/lefttoolbar/reviewforquote.svg +12 -0
  799. package/lib/assets/img/svg/lefttoolbar/room-shape-L.svg +3 -0
  800. package/lib/assets/img/svg/lefttoolbar/room-shape-active.svg +18 -0
  801. package/lib/assets/img/svg/lefttoolbar/room-shape-custom.svg +12 -0
  802. package/lib/assets/img/svg/lefttoolbar/room-shape-irregular.svg +3 -0
  803. package/lib/assets/img/svg/lefttoolbar/room-shape-open.svg +3 -0
  804. package/lib/assets/img/svg/lefttoolbar/room-shape-square.svg +3 -0
  805. package/lib/assets/img/svg/lefttoolbar/room-shape.svg +18 -0
  806. package/lib/assets/img/svg/lefttoolbar/search.svg +76 -0
  807. package/lib/assets/img/svg/lefttoolbar/view_more.svg +86 -0
  808. package/lib/assets/img/svg/lefttoolbar/warning_icon.svg +81 -0
  809. package/lib/assets/img/svg/lefttoolbar/window.svg +12 -0
  810. package/lib/assets/img/svg/logo.svg +11 -0
  811. package/lib/assets/img/svg/logo_with_text.svg +25 -0
  812. package/lib/assets/img/svg/menubar/login.svg +84 -0
  813. package/lib/assets/img/svg/menubar/my_projects.svg +85 -0
  814. package/lib/assets/img/svg/menubar/new_project.svg +110 -0
  815. package/lib/assets/img/svg/menubar/save_project.svg +84 -0
  816. package/lib/assets/img/svg/options.svg +3 -0
  817. package/lib/assets/img/svg/positioning.svg +3 -0
  818. package/lib/assets/img/svg/rotate.png +0 -0
  819. package/lib/assets/img/svg/rotate.svg +17 -0
  820. package/lib/assets/img/svg/rotate_object_clockwise.svg +26 -0
  821. package/lib/assets/img/svg/rotate_object_counterclockwise.svg +26 -0
  822. package/lib/assets/img/svg/toggleFilters.svg +19 -0
  823. package/lib/assets/img/svg/toolbar/add_appliances_active.svg +64 -0
  824. package/lib/assets/img/svg/toolbar/add_appliances_inactive.svg +52 -0
  825. package/lib/assets/img/svg/toolbar/add_button.svg +36 -0
  826. package/lib/assets/img/svg/toolbar/add_cabinets_active.svg +59 -0
  827. package/lib/assets/img/svg/toolbar/add_cabinets_inactive.svg +49 -0
  828. package/lib/assets/img/svg/toolbar/add_items_doors.svg +25 -0
  829. package/lib/assets/img/svg/toolbar/add_items_doorways.svg +24 -0
  830. package/lib/assets/img/svg/toolbar/add_items_refrigerator.svg +32 -0
  831. package/lib/assets/img/svg/toolbar/add_items_windows.svg +28 -0
  832. package/lib/assets/img/svg/toolbar/apply_button.svg +38 -0
  833. package/lib/assets/img/svg/toolbar/arrow-plus.svg +11 -0
  834. package/lib/assets/img/svg/toolbar/backsplash.svg +8 -0
  835. package/lib/assets/img/svg/toolbar/cancel_button.svg +37 -0
  836. package/lib/assets/img/svg/toolbar/consult_a_designer_button.svg +47 -0
  837. package/lib/assets/img/svg/toolbar/countertop.svg +7 -0
  838. package/lib/assets/img/svg/toolbar/dcm.png +0 -0
  839. package/lib/assets/img/svg/toolbar/dcm_off.svg +12 -0
  840. package/lib/assets/img/svg/toolbar/dcm_on.svg +474 -0
  841. package/lib/assets/img/svg/toolbar/delete_button.svg +37 -0
  842. package/lib/assets/img/svg/toolbar/download.svg +77 -0
  843. package/lib/assets/img/svg/toolbar/draw_custom_floor.svg +31 -0
  844. package/lib/assets/img/svg/toolbar/edit_button.svg +75 -0
  845. package/lib/assets/img/svg/toolbar/email_quote_button.svg +44 -0
  846. package/lib/assets/img/svg/toolbar/fbm.png +0 -0
  847. package/lib/assets/img/svg/toolbar/finishing_touches_active.svg +54 -0
  848. package/lib/assets/img/svg/toolbar/finishing_touches_inactive.svg +42 -0
  849. package/lib/assets/img/svg/toolbar/floorstyle.svg +9 -0
  850. package/lib/assets/img/svg/toolbar/fmb.png +0 -0
  851. package/lib/assets/img/svg/toolbar/fmb_off.svg +12 -0
  852. package/lib/assets/img/svg/toolbar/fmb_on.svg +489 -0
  853. package/lib/assets/img/svg/toolbar/furnishings_icon.svg +6 -0
  854. package/lib/assets/img/svg/toolbar/get_started_button.svg +41 -0
  855. package/lib/assets/img/svg/toolbar/handles.svg +5 -0
  856. package/lib/assets/img/svg/toolbar/lighting.svg +7 -0
  857. package/lib/assets/img/svg/toolbar/lrm.png +0 -0
  858. package/lib/assets/img/svg/toolbar/lrm_off.svg +12 -0
  859. package/lib/assets/img/svg/toolbar/lrm_on.svg +470 -0
  860. package/lib/assets/img/svg/toolbar/make_floorplan_active.svg +66 -0
  861. package/lib/assets/img/svg/toolbar/make_floorplan_inactive.svg +52 -0
  862. package/lib/assets/img/svg/toolbar/predefined_room_l_shaped.svg +20 -0
  863. package/lib/assets/img/svg/toolbar/predefined_room_layout.svg +20 -0
  864. package/lib/assets/img/svg/toolbar/predefined_room_long_narrow.svg +20 -0
  865. package/lib/assets/img/svg/toolbar/predefined_room_open_l_shape.svg +20 -0
  866. package/lib/assets/img/svg/toolbar/predefined_room_open_pentagon.svg +20 -0
  867. package/lib/assets/img/svg/toolbar/predefined_room_open_rectangle.svg +20 -0
  868. package/lib/assets/img/svg/toolbar/predefined_room_open_rectangle_2.svg +20 -0
  869. package/lib/assets/img/svg/toolbar/predefined_room_pentagon.svg +20 -0
  870. package/lib/assets/img/svg/toolbar/predefined_room_rectangle.svg +20 -0
  871. package/lib/assets/img/svg/toolbar/predefined_room_rectangle_with_alcove.svg +20 -0
  872. package/lib/assets/img/svg/toolbar/redo_button.svg +75 -0
  873. package/lib/assets/img/svg/toolbar/redo_button1.svg +75 -0
  874. package/lib/assets/img/svg/toolbar/review_quote_active.svg +14 -0
  875. package/lib/assets/img/svg/toolbar/review_quote_inactive.svg +44 -0
  876. package/lib/assets/img/svg/toolbar/save_project_button.svg +44 -0
  877. package/lib/assets/img/svg/toolbar/select_doorstyle_active.svg +67 -0
  878. package/lib/assets/img/svg/toolbar/select_doorstyle_inactive.svg +57 -0
  879. package/lib/assets/img/svg/toolbar/shopping-cart.svg +13 -0
  880. package/lib/assets/img/svg/toolbar/style_change_button.svg +47 -0
  881. package/lib/assets/img/svg/toolbar/take_picture.svg +75 -0
  882. package/lib/assets/img/svg/toolbar/undo_button.svg +76 -0
  883. package/lib/assets/img/svg/toolbar/undo_button1.svg +76 -0
  884. package/lib/assets/img/svg/toolbar/use_button.svg +37 -0
  885. package/lib/assets/img/svg/toolbar/wall_color_icon.svg +6 -0
  886. package/lib/assets/img/svg/topbar/edit_active.svg +10 -0
  887. package/lib/assets/img/svg/topbar/edit_inactive.svg +10 -0
  888. package/lib/assets/img/svg/topbar/redo_active.svg +42 -0
  889. package/lib/assets/img/svg/topbar/redo_inactive.svg +23 -0
  890. package/lib/assets/img/svg/topbar/select_all_active.svg +50 -0
  891. package/lib/assets/img/svg/topbar/select_all_inactive.svg +32 -0
  892. package/lib/assets/img/svg/topbar/take_picture_active.svg +51 -0
  893. package/lib/assets/img/svg/topbar/take_picture_inactive.svg +26 -0
  894. package/lib/assets/img/svg/topbar/undo_active.svg +42 -0
  895. package/lib/assets/img/svg/topbar/undo_inactive.svg +23 -0
  896. package/lib/assets/img/svg/warning_info_2d.svg +81 -0
  897. package/lib/assets/img/svg/window/Clear.svg +3 -0
  898. package/lib/assets/img/svg/window/Cross.svg +5 -0
  899. package/lib/assets/img/svg/window/Double_hung.svg +4 -0
  900. package/lib/assets/img/svg/window/Vertical.svg +4 -0
  901. package/lib/assets/img/svg/windows_clear.svg +23 -0
  902. package/lib/assets/img/svg/windows_cross.svg +28 -0
  903. package/lib/assets/img/svg/windows_double_hung.svg +24 -0
  904. package/lib/assets/img/svg/windows_vertical.svg +24 -0
  905. package/lib/assets/img/svg/wizardstep/Custom.svg +3 -0
  906. package/lib/assets/img/svg/wizardstep/Dashed_line.svg +3 -0
  907. package/lib/assets/img/svg/wizardstep/L.svg +3 -0
  908. package/lib/assets/img/svg/wizardstep/L2.svg +3 -0
  909. package/lib/assets/img/svg/wizardstep/Open.svg +3 -0
  910. package/lib/assets/img/svg/wizardstep/Square.svg +3 -0
  911. package/lib/assets/img/svg/wizardstep/bar-active.svg +9 -0
  912. package/lib/assets/img/svg/wizardstep/bar-normal.svg +3 -0
  913. package/lib/assets/img/svg/wizardstep/bullet-current.svg +3 -0
  914. package/lib/assets/img/svg/wizardstep/bullet-done.svg +3 -0
  915. package/lib/assets/img/svg/wizardstep/bullet-not-done.svg +3 -0
  916. package/lib/assets/img/svg/wizardstep/check-active.svg +3 -0
  917. package/lib/assets/img/svg/wizardstep/check-normal.svg +3 -0
  918. package/lib/assets/img/svg/wizardstep/detail_view.svg +87 -0
  919. package/lib/assets/img/svg/wizardstep/pencil.svg +11 -0
  920. package/lib/assets/img/svg/wizardstep/tile_view.svg +95 -0
  921. package/lib/assets/img/texture/glass.jpg +0 -0
  922. package/lib/assets/img/texture/steel.jpg +0 -0
  923. package/lib/assets/img/texture/white1px.jpg +0 -0
  924. package/lib/assets/img/texture/wood.jpg +0 -0
  925. package/lib/assets/model/DCM.bin +0 -0
  926. package/lib/assets/model/DCM.fbx +0 -0
  927. package/lib/assets/model/DCM.gltf +1 -0
  928. package/lib/assets/model/FBM.bin +0 -0
  929. package/lib/assets/model/FBM.fbx +0 -0
  930. package/lib/assets/model/FBM.gltf +1 -0
  931. package/lib/assets/model/LRM.bin +0 -0
  932. package/lib/assets/model/LRM.fbx +0 -0
  933. package/lib/assets/model/LRM.gltf +1 -0
  934. package/lib/assets/rtastore_logo.png +0 -0
  935. package/lib/catalog/areas/area/planner-element.js +53 -0
  936. package/lib/catalog/areas/area/textures/ceramic-tile.jpg +0 -0
  937. package/lib/catalog/areas/area/textures/grass.jpg +0 -0
  938. package/lib/catalog/areas/area/textures/parquet.jpg +0 -0
  939. package/lib/catalog/areas/area/textures/strand-porcelain.jpg +0 -0
  940. package/lib/catalog/areas/area/textures/tile1.jpg +0 -0
  941. package/lib/catalog/back.png +0 -0
  942. package/lib/catalog/cabinet/cabinet-assembly-order.js +42 -0
  943. package/lib/catalog/cabinet/cabinet-texture-resolver.js +14 -0
  944. package/lib/catalog/catalog.js +270 -0
  945. package/lib/catalog/doors.png +0 -0
  946. package/lib/catalog/doorways.png +0 -0
  947. package/lib/catalog/envMap/nx.hdr +0 -0
  948. package/lib/catalog/envMap/ny.hdr +0 -0
  949. package/lib/catalog/envMap/nz.hdr +0 -0
  950. package/lib/catalog/envMap/px.hdr +0 -0
  951. package/lib/catalog/envMap/py.hdr +0 -0
  952. package/lib/catalog/envMap/pz.hdr +0 -0
  953. package/lib/catalog/export.js +1 -0
  954. package/lib/catalog/factories/area-factory-3d.js +187 -0
  955. package/lib/catalog/factories/area-factory.js +88 -0
  956. package/lib/catalog/factories/export.js +25 -0
  957. package/lib/catalog/factories/wall-factory-3d.js +212 -0
  958. package/lib/catalog/factories/wall-factory.js +279 -0
  959. package/lib/catalog/holes/door-closet/planner-element.js +232 -0
  960. package/lib/catalog/holes/door-double/door_double.png +0 -0
  961. package/lib/catalog/holes/door-double/planner-element.js +325 -0
  962. package/lib/catalog/holes/door-exterior/planner-element.js +225 -0
  963. package/lib/catalog/holes/door-interior/planner-element.js +237 -0
  964. package/lib/catalog/holes/door-panic/panicDoor.png +0 -0
  965. package/lib/catalog/holes/door-panic/planner-element.js +513 -0
  966. package/lib/catalog/holes/door-panic-double/panicDoorDouble.png +0 -0
  967. package/lib/catalog/holes/door-panic-double/planner-element.js +473 -0
  968. package/lib/catalog/holes/door-sliding/planner-element.js +235 -0
  969. package/lib/catalog/holes/doorway-framed/planner-element.js +155 -0
  970. package/lib/catalog/holes/doorway-frameless/planner-element.js +114 -0
  971. package/lib/catalog/holes/export.js +97 -0
  972. package/lib/catalog/holes/gate/gate.jpg +0 -0
  973. package/lib/catalog/holes/window-clear/planner-element.js +176 -0
  974. package/lib/catalog/holes/window-clear/texture.png +0 -0
  975. package/lib/catalog/holes/window-cross/planner-element.js +175 -0
  976. package/lib/catalog/holes/window-cross/texture.png +0 -0
  977. package/lib/catalog/holes/window-double-hung/planner-element.js +313 -0
  978. package/lib/catalog/holes/window-double-hung/texture.png +0 -0
  979. package/lib/catalog/holes/window-vertical/planner-element.js +286 -0
  980. package/lib/catalog/holes/window-vertical/texture.png +0 -0
  981. package/lib/catalog/lines/wall/planner-element.js +87 -0
  982. package/lib/catalog/lines/wall/textures/bricks-normal.jpg +0 -0
  983. package/lib/catalog/lines/wall/textures/bricks.jpg +0 -0
  984. package/lib/catalog/lines/wall/textures/bricks2.jpg +0 -0
  985. package/lib/catalog/lines/wall/textures/morden-normal.jpg +0 -0
  986. package/lib/catalog/lines/wall/textures/morden.jpg +0 -0
  987. package/lib/catalog/lines/wall/textures/painted-normal.jpg +0 -0
  988. package/lib/catalog/lines/wall/textures/painted.jpg +0 -0
  989. package/lib/catalog/lines/wall/textures/plaster-normal.jpg +0 -0
  990. package/lib/catalog/lines/wall/textures/plaster.jpg +0 -0
  991. package/lib/catalog/lines/wall/wall.png +0 -0
  992. package/lib/catalog/molding/molding-dcm/planner-element.js +33 -0
  993. package/lib/catalog/molding/molding-dcm/texture.png +0 -0
  994. package/lib/catalog/molding/molding-fbm/planner-element.js +33 -0
  995. package/lib/catalog/molding/molding-fbm/texture.png +0 -0
  996. package/lib/catalog/molding/molding-lrm/planner-element.js +33 -0
  997. package/lib/catalog/molding/molding-lrm/texture.png +0 -0
  998. package/lib/catalog/utils/exporter.js +180 -0
  999. package/lib/catalog/utils/geom-utils.js +205 -0
  1000. package/lib/catalog/utils/item-loader.js +1620 -0
  1001. package/lib/catalog/utils/load-obj.js +129 -0
  1002. package/lib/catalog/utils/mtl-loader.js +366 -0
  1003. package/lib/catalog/utils/obj-loader.js +486 -0
  1004. package/lib/catalog/windows.png +0 -0
  1005. package/lib/class/area.js +147 -0
  1006. package/lib/class/export.js +88 -0
  1007. package/lib/class/group.js +438 -0
  1008. package/lib/class/guide.js +64 -0
  1009. package/lib/class/hole.js +930 -0
  1010. package/lib/class/item.js +2138 -0
  1011. package/lib/class/layer.js +670 -0
  1012. package/lib/class/line.js +1236 -0
  1013. package/lib/class/project.js +949 -0
  1014. package/lib/class/vertex.js +211 -0
  1015. package/lib/components/content.js +160 -0
  1016. package/lib/components/export.js +7 -0
  1017. package/lib/components/style/export.js +17 -0
  1018. package/lib/components/style/form-number-input.js +192 -0
  1019. package/lib/components/style/form-submit-button.js +35 -0
  1020. package/lib/components/viewer2d/area.js +89 -0
  1021. package/lib/components/viewer2d/export.js +121 -0
  1022. package/lib/components/viewer2d/grids/grid-horizontal-streak.js +44 -0
  1023. package/lib/components/viewer2d/grids/grid-streak.js +44 -0
  1024. package/lib/components/viewer2d/grids/grid-vertical-streak.js +44 -0
  1025. package/lib/components/viewer2d/grids/grids.js +40 -0
  1026. package/lib/components/viewer2d/group.js +63 -0
  1027. package/lib/components/viewer2d/item.js +259 -0
  1028. package/lib/components/viewer2d/layer.js +172 -0
  1029. package/lib/components/viewer2d/line.js +975 -0
  1030. package/lib/components/viewer2d/ruler.js +92 -0
  1031. package/lib/components/viewer2d/rulerDist.js +110 -0
  1032. package/lib/components/viewer2d/rulerX.js +154 -0
  1033. package/lib/components/viewer2d/rulerY.js +156 -0
  1034. package/lib/components/viewer2d/scene.js +137 -0
  1035. package/lib/components/viewer2d/snap.js +84 -0
  1036. package/lib/components/viewer2d/state.js +83 -0
  1037. package/lib/components/viewer2d/utils.js +200 -0
  1038. package/lib/components/viewer2d/vertex.js +76 -0
  1039. package/lib/components/viewer2d/viewer2d.js +1478 -0
  1040. package/lib/components/viewer3d/camera-controls-module/camera-controls.module.js +2591 -0
  1041. package/lib/components/viewer3d/dcm.js +408 -0
  1042. package/lib/components/viewer3d/fbm.js +421 -0
  1043. package/lib/components/viewer3d/front3D.js +71 -0
  1044. package/lib/components/viewer3d/grid-creator.js +35 -0
  1045. package/lib/components/viewer3d/grids/grid-horizontal-streak.js +45 -0
  1046. package/lib/components/viewer3d/grids/grid-streak.js +36 -0
  1047. package/lib/components/viewer3d/grids/grid-vertical-streak.js +45 -0
  1048. package/lib/components/viewer3d/libs/first-person-controls.js +74 -0
  1049. package/lib/components/viewer3d/libs/helvetiker_regular.typeface.js +1287 -0
  1050. package/lib/components/viewer3d/libs/mtl-loader.js +366 -0
  1051. package/lib/components/viewer3d/libs/obj-loader.js +471 -0
  1052. package/lib/components/viewer3d/libs/orbit-controls.js +706 -0
  1053. package/lib/components/viewer3d/libs/pointer-lock-controls.js +53 -0
  1054. package/lib/components/viewer3d/lrm.js +312 -0
  1055. package/lib/components/viewer3d/model.js +714 -0
  1056. package/lib/components/viewer3d/pointer-lock-navigation.js +32 -0
  1057. package/lib/components/viewer3d/ruler-utils/itemRect.js +69 -0
  1058. package/lib/components/viewer3d/ruler-utils/layer3D.js +503 -0
  1059. package/lib/components/viewer3d/ruler-utils/ruler3D.js +232 -0
  1060. package/lib/components/viewer3d/ruler-utils/scene3D.js +67 -0
  1061. package/lib/components/viewer3d/ruler-utils/state3D.js +26 -0
  1062. package/lib/components/viewer3d/scene-creator.js +3887 -0
  1063. package/lib/components/viewer3d/three-memory-cleaner.js +46 -0
  1064. package/lib/components/viewer3d/viewer3d-first-person.js +316 -0
  1065. package/lib/components/viewer3d/viewer3d.js +2777 -0
  1066. package/lib/constants/applianceCategories.js +25 -0
  1067. package/lib/constants/catalog/skinPanel.js +15 -0
  1068. package/lib/constants.js +798 -0
  1069. package/lib/devLiteRenderer.js +917 -0
  1070. package/lib/engine/2d/viewer-utils.js +25 -0
  1071. package/lib/events/external/handleExternalEvent.js +151 -0
  1072. package/lib/events/external/handleExternalEvent.util.js +1111 -0
  1073. package/lib/events/external/handlers.addItem.js +54 -0
  1074. package/lib/events/external/handlers.changeDoorStyle.js +145 -0
  1075. package/lib/events/external/handlers.elementOps.js +24 -0
  1076. package/lib/events/external/handlers.finishing.js +32 -0
  1077. package/lib/events/external/handlers.hole.js +10 -0
  1078. package/lib/events/external/handlers.loadProject.js +134 -0
  1079. package/lib/events/external/handlers.molding.js +31 -0
  1080. package/lib/events/external/handlers.projectLifecycle.js +19 -0
  1081. package/lib/events/external/handlers.projectSettings.js +38 -0
  1082. package/lib/events/external/handlers.replaceCabinet.js +48 -0
  1083. package/lib/events/external/handlers.roomShape.js +14 -0
  1084. package/lib/events/external/handlers.syncScene.js +61 -0
  1085. package/lib/events/external/handlers.updateSelectedElements.js +17 -0
  1086. package/lib/events/external/handlers.viewMode.js +19 -0
  1087. package/lib/events/external/handlers.viewerNavigation.js +117 -0
  1088. package/lib/events/external/handlers.wall.js +13 -0
  1089. package/lib/index.js +637 -0
  1090. package/lib/mappings/external-events/mapExternalEventPayload.js +33 -0
  1091. package/lib/mappings/external-events/mappers/addItemMapper.js +103 -0
  1092. package/lib/mappings/external-events/mappers/ccdfMapper.js +104 -0
  1093. package/lib/mappings/external-events/mappers/ccdfToCDSMapper.js +56 -0
  1094. package/lib/mappings/external-events/mappers/changeDoorStyleMapper.js +44 -0
  1095. package/lib/mappings/external-events/mappers/loadProjectMapper.js +70 -0
  1096. package/lib/mappings/holesToCatalog.js +148 -0
  1097. package/lib/models.js +540 -0
  1098. package/lib/plugins/SVGLoader.js +1419 -0
  1099. package/lib/plugins/console-debugger.js +42 -0
  1100. package/lib/plugins/export.js +25 -0
  1101. package/lib/plugins/keyboard.js +117 -0
  1102. package/lib/reducers/areas-reducer.js +19 -0
  1103. package/lib/reducers/export.js +89 -0
  1104. package/lib/reducers/groups-reducer.js +45 -0
  1105. package/lib/reducers/holes-reducer.js +69 -0
  1106. package/lib/reducers/items-reducer.js +146 -0
  1107. package/lib/reducers/lines-reducer.js +52 -0
  1108. package/lib/reducers/project-reducer.js +143 -0
  1109. package/lib/reducers/reducer.js +25 -0
  1110. package/lib/reducers/scene-reducer.js +35 -0
  1111. package/lib/reducers/vertices-reducer.js +26 -0
  1112. package/lib/reducers/viewer2d-reducer.js +84 -0
  1113. package/lib/reducers/viewer3d-reducer.js +65 -0
  1114. package/lib/shared/concurrency/async-pool.js +78 -0
  1115. package/lib/shared/domain/asset/load-asset-json.js +60 -0
  1116. package/lib/shared/domain/asset/sanitize-asset-url.js +31 -0
  1117. package/lib/shared/domain/cabinet-corner.js +12 -0
  1118. package/lib/shared/domain/cabinet-mirror.js +13 -0
  1119. package/lib/shared/domain/cabinet-warning.js +18 -0
  1120. package/lib/shared/math/line-metrics.js +40 -0
  1121. package/lib/shared/network/load-json.js +51 -0
  1122. package/lib/shared/objects/immutable.js +9 -0
  1123. package/lib/shared-style.js +72 -0
  1124. package/lib/translator/en.js +111 -0
  1125. package/lib/translator/it.js +86 -0
  1126. package/lib/translator/ru.js +86 -0
  1127. package/lib/translator/translator.js +87 -0
  1128. package/lib/utils/browser.js +40 -0
  1129. package/lib/utils/convert-units-lite.js +44 -0
  1130. package/lib/utils/email-validator.js +10 -0
  1131. package/lib/utils/export.js +56 -0
  1132. package/lib/utils/geometry/overlap/index.js +12 -0
  1133. package/lib/utils/geometry/overlap/overlapHelpers.js +30 -0
  1134. package/lib/utils/geometry/overlap/pointHelpers.js +31 -0
  1135. package/lib/utils/geometry/overlap/relationshipOfTwoOverlappedLines2.js +381 -0
  1136. package/lib/utils/geometry.js +2903 -0
  1137. package/lib/utils/get-edges-of-subgraphs.js +33 -0
  1138. package/lib/utils/graph-cycles.js +239 -0
  1139. package/lib/utils/graph-inner-cycles.js +54 -0
  1140. package/lib/utils/graph.js +153 -0
  1141. package/lib/utils/helper.js +477 -0
  1142. package/lib/utils/history.js +48 -0
  1143. package/lib/utils/id-broker.js +22 -0
  1144. package/lib/utils/logger.js +14 -0
  1145. package/lib/utils/math.js +57 -0
  1146. package/lib/utils/molding.js +1146 -0
  1147. package/lib/utils/name-generator.js +21 -0
  1148. package/lib/utils/objects-utils.js +62 -0
  1149. package/lib/utils/phone-validator.js +10 -0
  1150. package/lib/utils/process-black-list.js +22 -0
  1151. package/lib/utils/react-if.js +25 -0
  1152. package/lib/utils/ruler.js +63 -0
  1153. package/lib/utils/skinPanelEngine.js +639 -0
  1154. package/lib/utils/snap-scene.js +101 -0
  1155. package/lib/utils/snap.js +245 -0
  1156. package/lib/utils/summarizeCart.js +30 -0
  1157. package/lib/utils/threeCSG.es6.js +504 -0
  1158. package/lib/version.js +7 -0
  1159. package/package.json +136 -0
@@ -0,0 +1,3853 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
+ import * as Three from 'three';
6
+ import { Color, Group } from 'three';
7
+ import createGrid from "./grid-creator";
8
+ import { disposeObject } from "./three-memory-cleaner";
9
+ import { ANIMATE_STEP_MAX, ANIMATE_STEP_MIN, ARRAY_3D_MODES, ARROW_TEXT_BACKCOLOR, ARROW_TEXT_FONTFACE, ARROW_TEXT_FORECOLOR, BASE_CABINET_LAYOUTPOS, BOTTOM_MOLDING_LOCATION, DECIMAL_PLACES_2, DIFFERENT_VALUES_PATH_LENGTH, DISTANCE_EPSILON, EPSILON, ITEM_TYPE, MIDDLE_MOLDING_LOCATION, MODE_DRAGGING_ITEM_3D, MODE_DRAWING_ITEM_3D, MODE_IDLE, MODE_IDLE_3D, MODE_ROTATING_ITEM_3D, OBJTYPE_MESH, SHADE_DARK_PURPLE_COLOR, TOP_MOLDING_LOCATION, UNIT_CENTIMETER, UNIT_FOOT, UNIT_INCH, UNIT_METER, WALL_CABINET_LAYOUTPOS } from "../../constants";
10
+ import { GeometryUtils, IDBroker, MoldingUtils } from "../../utils/export";
11
+ import { convert } from "../../utils/convert-units-lite";
12
+ import { calcDistancesFromItemToWalls, getLineSnapPointsOfItem, getSnappedWallLines, isOverlappedTwoItemsOnOneLine, pointsDistance, verticesDistance } from "../../utils/geometry";
13
+ import * as GeomUtils from "../../catalog/utils/geom-utils";
14
+ import { loadTexture } from "../../catalog/utils/item-loader";
15
+ import { isWarningCabinet } from "../../shared/domain/cabinet-warning";
16
+ import { returnReplaceableDeepSearchType } from "../viewer2d/utils";
17
+ import { animateDoor, isElevationView, isEmpty, isImmutable, replaceMeshesWithLineSegments, translateDrawer } from "../../utils/helper";
18
+ import { formatNumber } from "../../utils/math";
19
+ import { toJSIfNeeded } from "../../shared/objects/immutable";
20
+ import { isCornerCabinet } from "../../shared/domain/cabinet-corner";
21
+ import { APPLIANCE_CATEGORY_DISHWASHER } from "../../constants/applianceCategories";
22
+ export var fVLine = [];
23
+ var scene_mode = null;
24
+ export function parseData(sceneData, actions, catalog, camera, renderer, mode) {
25
+ var planData = {
26
+ catalog: catalog,
27
+ sceneData: sceneData
28
+ };
29
+ window.planData = planData;
30
+ planData.sceneGraph = {
31
+ unit: sceneData.unit,
32
+ layers: {},
33
+ busyResources: {
34
+ layers: {}
35
+ },
36
+ width: sceneData.width,
37
+ height: sceneData.height,
38
+ LODs: {}
39
+ };
40
+ planData.plan = new Three.Object3D();
41
+ planData.plan.name = 'plan';
42
+ planData.cam = new Three.Object3D();
43
+ planData.cam.name = 'cam';
44
+
45
+ // Add a grid to the plan
46
+ planData.grid = createGrid(sceneData);
47
+ planData.grid.name = 'grid';
48
+ planData.boundingBox = new Three.Box3().setFromObject(planData.grid);
49
+ planData.boundingBox.name = 'boundingBox';
50
+ var promises = [];
51
+ sceneData.layers.forEach(function (layer) {
52
+ if (layer.id === sceneData.selectedLayer || layer.visible) {
53
+ promises = promises.concat(createLayerObjects(layer, planData, sceneData, actions, catalog, mode, camera, renderer));
54
+ }
55
+ });
56
+ var p1 = new Promise(function (resolve) {
57
+ Promise.all(promises).then(function (value) {
58
+ if (planData.plan.parent !== null && planData.plan.children.length !== 0) {
59
+ updateBoundingBox(planData, false, mode);
60
+
61
+ // if mode is elevation, build elevation scene
62
+ if (isElevationView(mode)) buildElevationScene(planData, mode);
63
+ }
64
+ resolve('success');
65
+ });
66
+ });
67
+ return {
68
+ promise: p1,
69
+ planData: planData
70
+ };
71
+
72
+ // return planData;
73
+ }
74
+ export function visibleTransformBox(flag) {
75
+ // if (transformBox instanceof Three.Mesh)
76
+ // transformBox.visible = flag;
77
+ }
78
+ var buildElevationScene = function buildElevationScene(planData, mode) {
79
+ var scene = planData.plan.parent;
80
+ scene.updateMatrixWorld();
81
+ var ELEV_GRP = 'ELEV_GRP';
82
+ var oldElevationGroup = scene.getObjectByName(ELEV_GRP);
83
+ if (oldElevationGroup) oldElevationGroup.parent.remove(oldElevationGroup);
84
+ var elevationGroup = new Three.Group();
85
+ scene.traverse(function (obj) {
86
+ if (obj.name == 'MainObject') {
87
+ var clone = obj.clone();
88
+ clone.name = '';
89
+ clone.visible = obj.parent.visible;
90
+ clone.applyMatrix4(obj.parent.matrixWorld);
91
+ elevationGroup.add(clone);
92
+ }
93
+ });
94
+ elevationGroup.name = ELEV_GRP;
95
+ elevationGroup.visible = false;
96
+ planData.elevationGroup = elevationGroup;
97
+ scene.traverse(function (obj) {
98
+ if (obj.name == 'MainObject') {
99
+ replaceMeshesWithLineSegments(obj);
100
+ }
101
+ });
102
+ scene.add(elevationGroup);
103
+ };
104
+ function createLayerObjects(layer, planData, sceneData, actions, catalog, mode, camera, renderer) {
105
+ var promises = [];
106
+ var moldingGroups = MoldingUtils.getAllMoldingGroups(layer);
107
+ planData.sceneGraph.layers[layer.id] = {
108
+ id: layer.id,
109
+ lines: {},
110
+ holes: {},
111
+ areas: {},
112
+ items: {},
113
+ countertops: [],
114
+ moldingGroups: moldingGroups,
115
+ backsplashes: [],
116
+ visible: layer.visible,
117
+ altitude: layer.altitude
118
+ };
119
+ planData.sceneGraph.busyResources.layers[layer.id] = {
120
+ id: layer.id,
121
+ lines: {},
122
+ holes: {},
123
+ areas: {},
124
+ items: {},
125
+ moldingGroups: {}
126
+ };
127
+ // Import lines
128
+ layer.lines.forEach(function (line) {
129
+ promises.push(addLine(sceneData, planData, layer, line.id, catalog, actions.linesActions, mode));
130
+ line.holes.forEach(function (holeID) {
131
+ promises.push(addHole(sceneData, planData, layer, holeID, catalog, actions.holesActions, mode));
132
+ });
133
+ });
134
+
135
+ // Import areas
136
+ layer.areas.forEach(function (area) {
137
+ promises.push(addArea(sceneData, planData, layer, area.id, catalog, actions.areaActions, mode));
138
+ });
139
+ // Import items
140
+ layer.items.forEach(function (item) {
141
+ promises.push(addItem(sceneData, planData, layer, item.id, catalog, actions.itemsActions, mode, null, null
142
+ // false
143
+ ));
144
+ });
145
+ return promises;
146
+ }
147
+ var canvas = document.createElement('canvas');
148
+ canvas.width = 50;
149
+ canvas.height = 100;
150
+ canvas.style.width = 50 + 'px';
151
+ canvas.style.height = 100 + 'px';
152
+ var ctx = canvas.getContext('2d');
153
+ ctx.fillStyle = '#FFFFFF';
154
+ ctx.strokeStyle = '#ff7400';
155
+ ctx.beginPath();
156
+ ctx.arc(25, 25, 20, 0, 2 * Math.PI);
157
+ ctx.fill();
158
+ ctx.stroke();
159
+ var img1 = new Image();
160
+ img1.crossOrigin = 'anonymous';
161
+ img1.src = '/assets/img/svg/3d_item_warning_info.svg';
162
+ img1.onload = function () {
163
+ ctx.drawImage(img1, 0, 0, 50, 50);
164
+ };
165
+ ctx.lineWidth = 4;
166
+ ctx.beginPath();
167
+ ctx.arc(25, 75, 20, 0, 2 * Math.PI);
168
+ ctx.fill();
169
+ ctx.stroke();
170
+ var img2 = new Image();
171
+ img2.crossOrigin = 'anonymous';
172
+ img2.src = '/assets/img/svg/3d_item_warning_edit.svg';
173
+ img2.onload = function () {
174
+ ctx.drawImage(img2, 8, 58, 34, 34);
175
+ };
176
+ export function createWarningObject() {
177
+ var warningTexture = new Three.Texture(canvas);
178
+ warningTexture.needsUpdate = true;
179
+ var warningObj = new Three.Sprite(new Three.SpriteMaterial({
180
+ map: warningTexture,
181
+ sizeAttenuation: true
182
+ }));
183
+ warningObj.material.transparent = true;
184
+ warningObj.material.depthTest = false;
185
+ warningObj.scale.set(20, 40, 20);
186
+ warningObj.renderOrder = 3;
187
+ warningObj.name = 'warningObj';
188
+ return warningObj;
189
+ }
190
+ function swapLengthProperty(diffs) {
191
+ var idx1 = diffs.findIndex(function (v) {
192
+ return v.path[v.path.length - 1] === 'length';
193
+ });
194
+ var idx2 = diffs.findIndex(function (v) {
195
+ return v.path[v.path.length - 1] === '_length';
196
+ });
197
+ if (idx1 < 0 || idx2 < 0) return diffs;
198
+ if (idx1 > idx2) return diffs;
199
+ if (diffs[idx1].op === diffs[idx2].op) {
200
+ var isSwap = true;
201
+ for (var i = 0; i < diffs[idx1].path.length - 2; i++) {
202
+ if (diffs[idx1].path[i] !== diffs[idx2].path[i]) {
203
+ isSwap = false;
204
+ break;
205
+ }
206
+ }
207
+ if (isSwap) {
208
+ var temp = diffs[idx1];
209
+ diffs[idx1] = diffs[idx2];
210
+ diffs[idx2] = temp;
211
+ }
212
+ }
213
+ return diffs;
214
+ }
215
+ export function updateScene(planData, sceneData, oldSceneData, diffArray, actions, catalog) {
216
+ var _draggingItem$toJS, _filteredDiffs, _filteredDiffs2;
217
+ var mode = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
218
+ var toolObj = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
219
+ var angleObj = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : null;
220
+ var draggingItem = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : null;
221
+ var result = [];
222
+ if (mode != null) {
223
+ scene_mode = mode;
224
+ }
225
+ var splitted = diffArray.map(function (el) {
226
+ return {
227
+ op: el.op,
228
+ path: el.path.split('/'),
229
+ value: el.value
230
+ };
231
+ });
232
+
233
+ // move "length" to after "_length"
234
+ splitted = swapLengthProperty(splitted);
235
+ var filteredDiffs = filterDiffs(splitted, sceneData, oldSceneData);
236
+ //***testing additional filter***
237
+ filteredDiffs = filteredDiffs.filter(function (_ref) {
238
+ var path = _ref.path;
239
+ return path[3] !== 'selected';
240
+ });
241
+ filteredDiffs = filteredDiffs.filter(function (_ref2) {
242
+ var path = _ref2.path;
243
+ return path[1] !== 'groups';
244
+ });
245
+ //*******************************
246
+ //This is executed when dragging item is end and performs the updateing filteredDiffs.
247
+ if ((sceneData === null || sceneData === void 0 ? void 0 : sceneData.isEndDragging) === true && draggingItem && !isEmpty((_draggingItem$toJS = draggingItem.toJS) === null || _draggingItem$toJS === void 0 ? void 0 : _draggingItem$toJS.call(draggingItem)) && ((_filteredDiffs = filteredDiffs) === null || _filteredDiffs === void 0 || (_filteredDiffs = _filteredDiffs[0]) === null || _filteredDiffs === void 0 || (_filteredDiffs = _filteredDiffs.path) === null || _filteredDiffs === void 0 ? void 0 : _filteredDiffs.length) < DIFFERENT_VALUES_PATH_LENGTH && (_filteredDiffs2 = filteredDiffs) !== null && _filteredDiffs2 !== void 0 && (_filteredDiffs2 = _filteredDiffs2[0]) !== null && _filteredDiffs2 !== void 0 && (_filteredDiffs2 = _filteredDiffs2.path) !== null && _filteredDiffs2 !== void 0 && _filteredDiffs2.includes('showfg')) {
248
+ var _draggingItem$getIn, _draggingItem$getIn2;
249
+ var layerID = (_draggingItem$getIn = draggingItem.getIn) === null || _draggingItem$getIn === void 0 ? void 0 : _draggingItem$getIn.call(draggingItem, ['layerID']);
250
+ var itemID = (_draggingItem$getIn2 = draggingItem.getIn) === null || _draggingItem$getIn2 === void 0 ? void 0 : _draggingItem$getIn2.call(draggingItem, ['itemID']);
251
+ if (layerID && itemID) {
252
+ var _sceneData$getIn, _sceneData$getIn$toJS, _selLayer$items;
253
+ filteredDiffs[0].path = ['', 'layers', layerID, 'items', itemID, 'distArray'];
254
+ var selLayer = (_sceneData$getIn = sceneData.getIn) === null || _sceneData$getIn === void 0 || (_sceneData$getIn = _sceneData$getIn.call(sceneData, ['layers', layerID])) === null || _sceneData$getIn === void 0 || (_sceneData$getIn$toJS = _sceneData$getIn.toJS) === null || _sceneData$getIn$toJS === void 0 ? void 0 : _sceneData$getIn$toJS.call(_sceneData$getIn);
255
+ var distArray = selLayer === null || selLayer === void 0 || (_selLayer$items = selLayer.items) === null || _selLayer$items === void 0 || (_selLayer$items = _selLayer$items[itemID]) === null || _selLayer$items === void 0 ? void 0 : _selLayer$items.distArray;
256
+ filteredDiffs[0].value = distArray;
257
+ }
258
+ }
259
+
260
+ // Check to see if diffs includes changes associated with doorStyle and global molding simultaneously.
261
+ var isSettingDoorStyle = false; // If it includes any doorStyle change
262
+ var isUpdateMolding = false; // If it includes any global molding change
263
+ filteredDiffs.forEach(function (_ref3) {
264
+ var path = _ref3.path;
265
+ /**
266
+ * Every 'doorStyle' change has a 'door_style_id' change.
267
+ * So, if door_style_id changes, it indicates 'doorStyle' change.
268
+ */
269
+ if (path[1] === 'layers' && path[3] === 'molding' || path[path.length - 2] === 'doorStyle' && path[path.length - 1] === 'id' || ['id'].includes(path[path.length - 1])) isSettingDoorStyle = true;
270
+
271
+ // If there are any molding change of layer
272
+ if (path[1] === 'layers' && path[3] === 'molding') isUpdateMolding = true;
273
+ });
274
+ if (isSettingDoorStyle && isUpdateMolding)
275
+ /**
276
+ * If so, any other changes could be ignored.
277
+ * Because the molding change of layer invokes 'createLayerObject()'
278
+ * and that function re-renders an whole layer.
279
+ */
280
+ filteredDiffs = filteredDiffs.filter(function (_ref4) {
281
+ var path = _ref4.path;
282
+ return path[1] === 'layers' && path[3] === 'molding';
283
+ });
284
+ filteredDiffs.forEach(function (_ref5) {
285
+ var op = _ref5.op,
286
+ path = _ref5.path,
287
+ value = _ref5.value;
288
+ /* First of all I need to find the object I need to update */
289
+ if (path[1] === 'layers') {
290
+ var layer = sceneData.getIn(['layers', path[2]]);
291
+ if (path.length === 3 && op === 'remove') {
292
+ removeLayer(path[2], planData);
293
+ } else if (path.length > 3) {
294
+ if (path.length > 5) if (path[5] === 'submodule' || path[5] === 'doorStyle' || path[5] === 'properties') op = 'replace';
295
+ switch (op) {
296
+ case 'replace':
297
+ var promiseValue = replaceObject(path, layer, planData, actions, sceneData, oldSceneData, catalog, mode, value);
298
+ if (promiseValue !== undefined) {
299
+ result.push(promiseValue.promise);
300
+ }
301
+ break;
302
+ case 'add':
303
+ addObject(path, layer, planData, actions, sceneData, oldSceneData, catalog, mode, toolObj);
304
+ break;
305
+ case 'remove':
306
+ if (angleObj) planData.plan.parent.remove(angleObj);
307
+ if (toolObj) planData.plan.parent.remove(toolObj);
308
+ deleteSpecifiedMeshObjects('WarningBox' + path[4]);
309
+ deleteSpecifiedMeshObjects('backsplash' + path[4]);
310
+ var item = oldSceneData.getIn(['layers', path[2]]).getIn(['items', path[4]]);
311
+ deleteCountertop(planData.sceneGraph.layers[layer.id].countertops, item, planData, layer);
312
+ removeObject(path, layer, planData, actions, sceneData, oldSceneData, catalog);
313
+ break;
314
+ }
315
+ }
316
+ } else if (path[1] === 'selectedLayer') {
317
+ var layerSelectedID = value;
318
+ var layerSelected = sceneData.getIn(['layers', layerSelectedID]);
319
+ // First of all I check if the new selected layer is not visible
320
+ if (!layerSelected.visible) {
321
+ // I need to create the objects for this layer
322
+ var promises = createLayerObjects(layerSelected, planData, sceneData, actions, catalog, mode);
323
+ Promise.all(promises).then(function () {
324
+ return updateBoundingBox(planData, false, mode);
325
+ });
326
+ }
327
+ var layerGraph = planData.sceneGraph.layers[oldSceneData.selectedLayer];
328
+ if (layerGraph) {
329
+ if (!layerGraph.visible) {
330
+ // I need to remove the objects for this layer
331
+ for (var lineID in layerGraph.lines) removeLine(planData, layerGraph.id, lineID);
332
+ for (var areaID in layerGraph.areas) removeArea(planData, layerGraph.id, areaID);
333
+ for (var _itemID in layerGraph.items) removeItem(planData, layerGraph.id, _itemID);
334
+ for (var holeID in layerGraph.holes) removeHole(planData, layerGraph.id, holeID);
335
+ }
336
+ }
337
+ }
338
+ });
339
+ var p1 = new Promise(function (resolve) {
340
+ Promise.all(result).then(function (replaceValue) {
341
+ // if mode is elevation, build elevation scene
342
+ // When scene is updated, replaceValue is not empty.
343
+ if (isElevationView(mode) && !isEmpty(replaceValue)) buildElevationScene(planData, mode);
344
+ resolve('successPromise');
345
+ });
346
+ });
347
+ return {
348
+ promise: p1,
349
+ planData: planData
350
+ };
351
+ }
352
+ var animate_objects = {};
353
+ function myAnimRotate(obj, open_doors, item, isCorner) {
354
+ var animateStep = animate_objects[obj.name].animateStep;
355
+
356
+ // if open the door, animateStep increases to ANIMATE_STEP_MAX and if close the door, animateStep decreases to ANIMATE_STEP_MIN
357
+ animateStep = open_doors ? animateStep + 1 : animateStep - 1;
358
+
359
+ // clear interval when the opening or closing door is ended.
360
+ if (animateStep > ANIMATE_STEP_MAX || animateStep < ANIMATE_STEP_MIN) {
361
+ clearInterval(animate_objects[obj.name].animate_intervalID);
362
+ return;
363
+ }
364
+ animate_objects[obj.name].animateStep = animateStep;
365
+ animateDoor(animate_objects[obj.name].offset, obj, open_doors, item, isCorner, 'Opened3D');
366
+ }
367
+ function myAnimTranslate(obj, open_doors, item) {
368
+ var animateStep = animate_objects[obj.name].animateStep;
369
+ animateStep = open_doors ? animateStep + 1 : animateStep - 1;
370
+ if (animateStep > ANIMATE_STEP_MAX || animateStep < ANIMATE_STEP_MIN) {
371
+ clearInterval(animate_objects[obj.name].animate_intervalID);
372
+ return;
373
+ }
374
+ animate_objects[obj.name].animateStep = animateStep;
375
+ translateDrawer(item, obj, open_doors, 'Opened3D');
376
+ }
377
+ function replaceObject(modifiedPath, layer, planData, actions, sceneData, oldSceneData, catalog) {
378
+ var mode = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
379
+ var value = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : null;
380
+ var promises = [];
381
+ var matchStr = /\d_(door[^LR1-9]*)(_[LR])?(_[1-9])?$/;
382
+ switch (modifiedPath[3]) {
383
+ case 'vertices':
384
+ if (modifiedPath[5] !== 'selected') {
385
+ var vertex = layer.getIn(['vertices', modifiedPath[4]]);
386
+ if (modifiedPath[5] === 'x' || modifiedPath[5] === 'y') {
387
+ vertex.lines.forEach(function (lineID) {
388
+ var lineHoles = oldSceneData.getIn(['layers', layer.id, 'lines', lineID, 'holes']);
389
+ if (lineHoles) lineHoles.forEach(function (holeID) {
390
+ replaceObject([0, 0, 0, 'holes', holeID, 'selected'], layer, planData, actions, sceneData, oldSceneData, catalog, mode);
391
+ });
392
+ return replaceObject([0, 0, 0, 'lines', lineID], layer, planData, actions, sceneData, oldSceneData, catalog, mode);
393
+ });
394
+ vertex.areas.forEach(function (areaID) {
395
+ return replaceObject([0, 0, 0, 'areas', areaID], layer, planData, actions, sceneData, oldSceneData, catalog, mode);
396
+ });
397
+ }
398
+ if (modifiedPath[5] === 'areas') {
399
+ var areaID = vertex.getIn(['areas', ~~modifiedPath[6]]);
400
+ replaceObject([0, 0, 0, 'areas', areaID], layer, planData, actions, sceneData, oldSceneData, catalog, mode);
401
+ }
402
+ }
403
+ break;
404
+ case 'holes':
405
+ var newHoleData = layer.getIn(['holes', modifiedPath[4]]);
406
+ if (catalog.getElement(newHoleData.type).updateRender3D) {
407
+ promises.push(updateHole(sceneData, oldSceneData, planData, layer, modifiedPath[4], modifiedPath.slice(5), catalog, actions.holesActions, function () {
408
+ return removeHole(planData, layer.id, newHoleData.id);
409
+ }, function () {
410
+ return addHole(sceneData, planData, layer, newHoleData.id, catalog, actions.holesActions, mode);
411
+ }));
412
+ } else {
413
+ var lineID = newHoleData.line;
414
+ if (modifiedPath[5] === 'selected' || scene_mode === 'MODE_DRAWING_HOLE_3D' || scene_mode === 'MODE_DRAGGING_HOLE_3D') {
415
+ // I remove only the hole without removing the wall
416
+ removeHole(planData, layer.id, newHoleData.id);
417
+ promises.push(addHole(sceneData, planData, layer, newHoleData.id, catalog, actions.holesActions, mode));
418
+ } else {
419
+ layer.getIn(['lines', lineID, 'holes']).forEach(function (holeID) {
420
+ removeHole(planData, layer.id, holeID);
421
+ });
422
+ removeLine(planData, layer.id, lineID);
423
+ promises.push(addLine(sceneData, planData, layer, lineID, catalog, actions.linesActions));
424
+ layer.getIn(['lines', lineID, 'holes']).forEach(function (holeID) {
425
+ promises.push(addHole(sceneData, planData, layer, holeID, catalog, actions.holesActions, mode));
426
+ });
427
+ }
428
+ }
429
+ break;
430
+ case 'lines':
431
+ var line = layer.getIn(['lines', modifiedPath[4]]);
432
+ if (catalog.getElement(line.type).updateRender3D) {
433
+ promises.push(updateLine(sceneData, oldSceneData, planData, layer, modifiedPath[4], modifiedPath.slice(5), catalog, actions.linesActions, function () {
434
+ return removeLine(planData, layer.id, modifiedPath[4]);
435
+ }, function () {
436
+ return addLine(sceneData, planData, layer, modifiedPath[4], catalog, actions.linesActions);
437
+ }));
438
+ } else {
439
+ removeLine(planData, layer.id, modifiedPath[4]);
440
+ promises.push(addLine(sceneData, planData, layer, modifiedPath[4], catalog, actions.linesActions));
441
+ }
442
+ break;
443
+ case 'areas':
444
+ var area = layer.getIn(['areas', modifiedPath[4]]);
445
+ if (catalog.getElement(area.type).updateRender3D) {
446
+ promises.push(updateArea(sceneData, oldSceneData, planData, layer, modifiedPath[4], modifiedPath.slice(5), catalog, actions.areaActions, function () {
447
+ return removeArea(planData, layer.id, modifiedPath[4]);
448
+ }, function () {
449
+ return addArea(sceneData, planData, layer, modifiedPath[4], catalog, actions.areaActions);
450
+ }));
451
+ } else {
452
+ if (planData.sceneGraph.layers[layer.id].areas[modifiedPath[4]]) {
453
+ removeArea(planData, layer.id, modifiedPath[4]);
454
+ }
455
+ promises.push(addArea(sceneData, planData, layer, modifiedPath[4], catalog, actions.areaActions));
456
+ }
457
+ break;
458
+ case 'items':
459
+ var item = layer.getIn(['items', modifiedPath[4]]);
460
+ if (isEmpty(item)) break;
461
+ deleteCountertop(planData.sceneGraph.layers[layer.id].countertops, item, planData, layer);
462
+ var tmpMoldings = _toConsumableArray(planData.sceneGraph.layers[layer.id].moldingGroups);
463
+ if (catalog.getElement(item.type).updateRender3D) {
464
+ promises.push(updateItem(sceneData, oldSceneData, planData, layer, modifiedPath[4], modifiedPath.slice(5), catalog, actions.itemsActions, function () {
465
+ return removeItem(planData, layer.id, modifiedPath[4], oldSceneData.getIn(['layers', layer.id]), layer);
466
+ }, function () {
467
+ return addItem(sceneData, planData, layer, modifiedPath[4], catalog, actions.itemsActions, mode);
468
+ }));
469
+ } else {
470
+ var item3D = null;
471
+ try {
472
+ item3D = planData.sceneGraph.layers[layer.id].items[modifiedPath[4]];
473
+ } catch (err) {
474
+ console.log('modifiedPath: ', modifiedPath, '\nError: ', err);
475
+ return;
476
+ }
477
+ if (!item3D) return;
478
+ var keyIndex = modifiedPath.length - 1;
479
+ if (modifiedPath[keyIndex] == 'rotation') {
480
+ item3D.rotation.set(0, value * Math.PI / 180 + Math.PI, 0);
481
+ setTimeout(function () {
482
+ getDistances(layer, item);
483
+ }, 50);
484
+ removeSelItemMesh(tmpMoldings, item, planData, mode);
485
+ } else if (modifiedPath[keyIndex] == 'x') {
486
+ item3D.position.x = value;
487
+ setTimeout(function () {
488
+ getDistances(layer, item);
489
+ }, 50);
490
+ removeSelItemMesh(tmpMoldings, item, planData, mode);
491
+ } else if (modifiedPath[keyIndex] == 'y') {
492
+ item3D.position.z = -value;
493
+ setTimeout(function () {
494
+ getDistances(layer, item);
495
+ }, 50);
496
+ removeSelItemMesh(tmpMoldings, item, planData, mode);
497
+ } else if (modifiedPath[keyIndex] == 'mirrored') {
498
+ applyMirrorToItem3D(item3D, item.mirrored);
499
+ } else if (modifiedPath[keyIndex] == 'selected') {
500
+ var itemType = !!catalog.elements[item.type] ? catalog.elements[item.type].type : catalog.elements[returnReplaceableDeepSearchType(item.type)].type;
501
+ if (value == false) {
502
+ item3D.children[0].children = item3D.children[0].children.filter(function (item3DElement) {
503
+ return item3DElement.name !== 'TransformBox' && item3DElement.name !== 'TransformGizmo';
504
+ });
505
+ if (item3D) {
506
+ if (item3D.children.length > 1) {
507
+ item3D.children.pop();
508
+ }
509
+ var mBoxColor = 0x99c3fb;
510
+ var _item = item.toJS();
511
+ if (isWarningCabinet(_item)) {
512
+ mBoxColor = 'rgba(232,187,47,1)';
513
+ var mBox = GeomUtils.makeMBoxfromObject(item3D, mBoxColor);
514
+ var warningObj = createWarningObject();
515
+ warningObj.position.set(0, item.properties.get('height').get('length') / 3, 0);
516
+ if (mBox) {
517
+ mBox.add(warningObj);
518
+ item3D.add(mBox);
519
+ }
520
+ }
521
+ }
522
+ var temp_MGArray = planData.sceneGraph.layers[layer.id].moldingGroups;
523
+ } else {
524
+ if (item3D.name !== 'pivot' && item3D.children[0].children[item3D.children[0].children.length - 1].name == 'TransformGizmo') return;
525
+ if (item3D.children[0].children[item3D.children[0].children.length - 1].name == 'TransformGizmo') {
526
+ item3D.children[0].children.pop();
527
+ }
528
+ var object = item3D.children[0].clone();
529
+ if (item3D.children.length > 1) {
530
+ item3D.children.pop();
531
+ }
532
+ item3D.children.pop();
533
+ var altitude = item.properties.get('altitude').get('length');
534
+ var scalevec = new Three.Vector3(object.scale.x, object.scale.y, object.scale.z);
535
+ var posVec = new Three.Vector3(object.position.x, object.position.y, object.position.z);
536
+ var newAltitude = item.properties.get('altitude').get('_length');
537
+ var newUnit = item.properties.get('altitude').get('_unit') || 'in';
538
+ newAltitude = convert(newAltitude).from(newUnit).to(sceneData.unit);
539
+ var newWidth = item.properties.get('width').get('_length');
540
+ var newWidthUnit = item.properties.get('width').get('_unit') || 'in';
541
+ newWidth = convert(newWidth).from(newWidthUnit).to('in');
542
+ var newHeight = item.properties.get('height').get('_length');
543
+ var newHeightUnit = item.properties.get('height').get('_unit') || 'in';
544
+ newHeight = convert(newHeight).from(newHeightUnit).to('in');
545
+ var newDepth = item.properties.get('depth').get('_length');
546
+ var newDepthUnit = item.properties.get('depth').get('_unit') || 'in';
547
+ newDepth = convert(newDepth).from(newDepthUnit).to('in');
548
+ var sizeinfo = !!catalog.elements[item.type] ? catalog.elements[item.type].info.sizeinfo : catalog.elements[returnReplaceableDeepSearchType(item.type)].info.sizeinfo;
549
+ object.scale.set(1 * newWidth / sizeinfo.width, 1 * newHeight / sizeinfo.height, 1 * newDepth / sizeinfo.depth);
550
+ object.position.set(0, 0, 0);
551
+ object.rotation.set(0, 0, 0);
552
+ var box = GeomUtils.baseBoxHelper(object, 0xffffff);
553
+ box.material.lineWidth = 0.01;
554
+ var boundingBox = GeomUtils.baseBox3FromObject(object);
555
+ var max = boundingBox.max;
556
+ var min = boundingBox.min;
557
+ var radius = Math.sqrt((boundingBox.max.x - boundingBox.min.x) * (boundingBox.max.x - boundingBox.min.x) + (boundingBox.max.z - boundingBox.min.z) * (boundingBox.max.z - boundingBox.min.z)) / 2;
558
+ var moveBox = new Three.BoxGeometry(max.x - min.x, max.y - min.y, max.z - min.z);
559
+
560
+ // translate Object
561
+ var controlGeom = GeomUtils.controlGeom();
562
+
563
+ // rotate Object //////////
564
+ var rotGeom = GeomUtils.rotGeoms(radius + 0.05);
565
+ // //////////////////////////////////
566
+ // upwards Geometry///////////
567
+ var upwardsGeom = GeomUtils.upwardsGeom();
568
+ var vLineGeom = new Three.BufferGeometry();
569
+ var vertices = [(max.x - min.x) / 2 + min.x, 0, max.z, (max.x - min.x) / 2 + min.x, 0, max.z + 1.3];
570
+ vLineGeom.setAttribute('position', new Three.BufferAttribute(new Float32Array(vertices), 3));
571
+ vLineGeom.attributes.position.needsUpdate = true;
572
+ var vLineGeom1 = new Three.BufferGeometry();
573
+ var vertices1 = [(max.x - min.x) / 2 + min.x, 0, min.z, (max.x - min.x) / 2 + min.x, 0, min.z - 1.3];
574
+ vLineGeom1.setAttribute('position', new Three.BufferAttribute(new Float32Array(vertices1), 3));
575
+ vLineGeom1.attributes.position.needsUpdate = true;
576
+ var vLineGeom2 = new Three.BufferGeometry();
577
+ var vertices2 = [max.x, 0, max.z - (max.z - min.z) / 2, max.x + 1.3, 0, max.z - (max.z - min.z) / 2];
578
+ vLineGeom2.setAttribute('position', new Three.BufferAttribute(new Float32Array(vertices2), 3));
579
+ var vLineGeom3 = new Three.BufferGeometry();
580
+ var vertices3 = [min.x, 0, max.z - (max.z - min.z) / 2, min.x - 1.3, 0, max.z - (max.z - min.z) / 2];
581
+ vLineGeom3.setAttribute('position', new Three.BufferAttribute(new Float32Array(vertices3), 3));
582
+ // ///////////////////////////////////////
583
+
584
+ // set names of transform object
585
+ var rotFillObj = new Three.Mesh(rotGeom.rotFill, new Three.MeshPhongMaterial({
586
+ color: 0x000000,
587
+ side: Three.DoubleSide,
588
+ colorWrite: true
589
+ }));
590
+ var rotStrokeObj = new Three.Line(rotGeom.rotStroke, new Three.LineBasicMaterial({
591
+ color: 0xffffff,
592
+ colorWrite: true
593
+ }));
594
+ rotFillObj.name = 'rotate';
595
+ var upObj = new Three.Mesh(upwardsGeom, new Three.MeshBasicMaterial({
596
+ color: 0x000000,
597
+ side: Three.DoubleSide
598
+ }));
599
+ // let upLine = new Three.Line(upwardsGeom, new Three.LineBasicMaterial({ color: 0x000000 }));
600
+ // upLine.name = "transUp";
601
+ // upObj.add(upLine);
602
+ upObj.name = 'transUp';
603
+ var upwardbox = new Three.BoxHelper(upObj, 0x326780);
604
+ upwardbox.material.lineWidth = 0.01;
605
+ fVLine = [];
606
+ // let obj = new Three.Mesh(controlGeom, new Three.MeshPhongMaterial({ color: 0xffffff, side: Three.DoubleSide, colorWrite: true }));
607
+ // obj.name = "translateX";
608
+ var color = SHADE_DARK_PURPLE_COLOR;
609
+ var _mBox = new Three.Mesh(moveBox, new Three.MeshBasicMaterial({
610
+ color: 0xdd6699,
611
+ side: Three.DoubleSide,
612
+ transparent: true,
613
+ opacity: 0.4
614
+ }));
615
+ var vLine = new Three.Line(vLineGeom, new Three.LineBasicMaterial({
616
+ color: color
617
+ }));
618
+ var vLine1 = new Three.Line(vLineGeom1, new Three.LineBasicMaterial({
619
+ color: color
620
+ }));
621
+ var vLine2 = new Three.Line(vLineGeom2, new Three.LineBasicMaterial({
622
+ color: color
623
+ }));
624
+ var vLine3 = new Three.Line(vLineGeom3, new Three.LineBasicMaterial({
625
+ color: color
626
+ }));
627
+ fVLine.push(vLine);
628
+ fVLine.push(vLine1);
629
+ fVLine.push(vLine2);
630
+ fVLine.push(vLine3);
631
+ vLine.renderOrder = 1;
632
+ vLine1.renderOrder = 1;
633
+ vLine2.renderOrder = 1;
634
+ vLine3.renderOrder = 1;
635
+ vLine.material.transparent = true;
636
+ vLine1.material.transparent = true;
637
+ vLine2.material.transparent = true;
638
+ vLine3.material.transparent = true;
639
+ vLine.material.depthTest = false;
640
+ vLine1.material.depthTest = false;
641
+ vLine2.material.depthTest = false;
642
+ vLine3.material.depthTest = false;
643
+ var uVec = new Three.Vector3(-posVec.x / scalevec.x, -posVec.y / scalevec.y, -posVec.z / scalevec.z);
644
+ var blLighting = item.type.includes('Light');
645
+ vLine.translateY(blLighting ? 1.6 : boundingBox.min.y + 0.1);
646
+ vLine1.translateY(blLighting ? 1.6 : boundingBox.min.y + 0.1);
647
+ vLine2.translateY(blLighting ? 1.6 : boundingBox.min.y + 0.1);
648
+ vLine3.translateY(blLighting ? 1.6 : boundingBox.min.y + 0.1);
649
+ upObj.translateOnAxis(uVec, 1);
650
+ upObj.translateY(max.y - min.y);
651
+ _mBox.name = 'TransformBox';
652
+ _mBox.translateOnAxis(new Three.Vector3(uVec.x, uVec.y + (max.y - min.y) / 2, uVec.z), 1);
653
+ _mBox.scale.set(1.01, 1.01, 1.01);
654
+ var rotFillObj1 = rotFillObj.clone();
655
+ var rotStrokeObj1 = rotStrokeObj.clone();
656
+ rotFillObj1.rotateY(Math.PI);
657
+ rotStrokeObj1.rotateY(Math.PI);
658
+ var asrtObj = new Three.Group();
659
+ // let asrtObj1 = new Three.Group();
660
+ // asrtObj.add(obj);
661
+ // asrtObj.add(obj1);
662
+ rotFillObj.translateY(blLighting ? 1.6 : 0.1);
663
+ rotFillObj1.translateY(blLighting ? 1.6 : 0.1);
664
+ rotStrokeObj.translateY(blLighting ? 1.6 : 0.1);
665
+ rotStrokeObj1.translateY(blLighting ? 1.6 : 0.1);
666
+ upObj.translateY(posVec.y / scalevec.y);
667
+ upObj.add(upwardbox);
668
+ //asrtObj.add(upObj);
669
+ // vLine.translateY(posVec.y / scalevec.y);
670
+ // vLine1.translateY(posVec.y / scalevec.y);
671
+ // vLine2.translateY(posVec.y / scalevec.y);
672
+ // vLine3.translateY(posVec.y / scalevec.y);
673
+
674
+ _mBox.translateY(posVec.y / scalevec.y);
675
+ // asrtObj.add(rotFillObj);
676
+ // asrtObj.add(rotFillObj1);
677
+ // asrtObj.add(rotStrokeObj);
678
+ // asrtObj.add(rotStrokeObj1);
679
+ asrtObj.add(vLine);
680
+ asrtObj.add(vLine1);
681
+ asrtObj.add(vLine2);
682
+ asrtObj.add(vLine3);
683
+ asrtObj.add(box);
684
+ asrtObj.scale.set(1 / object.scale.x, object.scale.y, 1 / object.scale.z);
685
+ _mBox.visible = false;
686
+ // transformBox = mBox;
687
+ // asrtObj.add(mBox);
688
+ asrtObj.name = 'TransformGizmo';
689
+ object.add(asrtObj);
690
+ object.position.x = posVec.x;
691
+ object.position.y = posVec.y;
692
+ object.position.z = posVec.z;
693
+ // object.rotation.y = Math.PI;
694
+ object.scale.set(scalevec.x, scalevec.y, scalevec.z);
695
+ item3D.add(object);
696
+ if (item3D) {
697
+ var _mBoxColor = 0x99c3fb;
698
+ var _item2 = item.toJS();
699
+ if (isWarningCabinet(_item2)) {
700
+ _mBoxColor = 'rgba(232,187,47,1)';
701
+ var _mBox2 = GeomUtils.makeMBoxfromObject(item3D, _mBoxColor);
702
+ var _warningObj = createWarningObject();
703
+ _warningObj.position.set(0, item.properties.get('height').get('length') / 3, 0);
704
+ if (_mBox2) {
705
+ _mBox2.add(_warningObj);
706
+ item3D.add(_mBox2);
707
+ }
708
+ }
709
+ }
710
+ applyInteract(item3D, function () {
711
+ // closes the setting dialog
712
+ if (document.getElementById('setting_dialog')) {
713
+ document.getElementById('setting_dialog').style.display = 'none';
714
+ }
715
+ return actions.itemsActions.selectItem(layer.id, modifiedPath[4]);
716
+ });
717
+ setTimeout(function () {
718
+ getDistances(layer, item);
719
+ }, 100);
720
+ }
721
+ } else if (modifiedPath[keyIndex] == 'length') {
722
+ var _object = item3D.children[0];
723
+ var prevPos = _object.position;
724
+ _object.position.set(prevPos.x, value, prevPos.z);
725
+ } else if (modifiedPath[keyIndex] == 'flip_doorhandle') {
726
+ updateDoorHandleMesh(item, item3D, value);
727
+ var _object2 = item3D.children[0];
728
+ var door_animate_offset = _object2.userData.door_animate_offset;
729
+ var _loop = function _loop(it) {
730
+ if (_object2.children.filter(function (elem) {
731
+ return elem.name === it;
732
+ }).length) {
733
+ var door_match = it.match(matchStr);
734
+ var rotate_match_text = item.properties.toJS().flip_doorhandle ? 'rotate_L' : 'rotate_R';
735
+ if (door_match[2] === '_L') {
736
+ rotate_match_text = item.properties.toJS().flip_doorhandle ? 'rotate_R' : 'rotate_L';
737
+ }
738
+ _object2.children.filter(function (elem) {
739
+ return elem.name === it;
740
+ })[0].children[0].children.forEach(function (child) {
741
+ if (child.name.endsWith(rotate_match_text)) {
742
+ door_animate_offset[it] = {
743
+ x: child.position.x,
744
+ y: child.position.y,
745
+ z: child.position.z
746
+ };
747
+ }
748
+ });
749
+ }
750
+ };
751
+ for (var it in door_animate_offset) {
752
+ _loop(it);
753
+ }
754
+ _object2.userData.door_animate_offset = door_animate_offset;
755
+ } else if (modifiedPath[keyIndex] == 'animValue') {
756
+ return;
757
+ } else if (modifiedPath[keyIndex] == 'open_doors') {
758
+ var _object3 = item3D.children[0];
759
+ var userData = item3D.children[0].userData;
760
+ var moveObjectChildrens = [];
761
+ var selectedItem = layer.getIn(['items', layer.selected.toJS().items[0]]).toJS();
762
+ _object3.children.forEach(function (child, idx) {
763
+ var object_match = child.name.match(/\d_(interior_drawer[^LR1-9]*)(_[LR1-9])?$/) || child.name.match(matchStr);
764
+ if (object_match && object_match.length > 2) {
765
+ moveObjectChildrens.push({
766
+ type: object_match[1],
767
+ obj: child
768
+ });
769
+ animate_objects[child.name] = animate_objects[child.name] || {};
770
+ }
771
+ });
772
+ var temp = moveObjectChildrens.filter(function (item) {
773
+ var _object3$userData$doo;
774
+ return (_object3$userData$doo = _object3.userData.door_animate_offset[item.obj.name]) === null || _object3$userData$doo === void 0 ? void 0 : _object3$userData$doo.isCorner;
775
+ });
776
+ var isCorner = temp.length > 0;
777
+ moveObjectChildrens.forEach(function (element) {
778
+ var _animate_objects$elem, _animate_objects$elem2;
779
+ if (((_animate_objects$elem = animate_objects[element.obj.name]) === null || _animate_objects$elem === void 0 ? void 0 : _animate_objects$elem.animateStep) === undefined) {
780
+ animate_objects[element.obj.name].animateStep = selectedItem.properties.open_doors ? ANIMATE_STEP_MIN : ANIMATE_STEP_MAX;
781
+ }
782
+
783
+ // clear origin Interval.
784
+ if ((_animate_objects$elem2 = animate_objects[element.obj.name]) !== null && _animate_objects$elem2 !== void 0 && _animate_objects$elem2.animate_intervalID) {
785
+ var _animate_objects$elem3;
786
+ clearInterval((_animate_objects$elem3 = animate_objects[element.obj.name]) === null || _animate_objects$elem3 === void 0 ? void 0 : _animate_objects$elem3.animate_intervalID);
787
+ }
788
+ if (element.type === 'door') {
789
+ var _userData$door_animat, _element$obj;
790
+ // This is excuted when item has door.
791
+ var offset = userData === null || userData === void 0 || (_userData$door_animat = userData.door_animate_offset) === null || _userData$door_animat === void 0 ? void 0 : _userData$door_animat[element === null || element === void 0 || (_element$obj = element.obj) === null || _element$obj === void 0 ? void 0 : _element$obj.name];
792
+ if (offset) {
793
+ var _offset$x, _offset$y, _offset$z;
794
+ animate_objects[element.obj.name].offset = {
795
+ x: (_offset$x = offset.x) !== null && _offset$x !== void 0 ? _offset$x : 0,
796
+ y: (_offset$y = offset.y) !== null && _offset$y !== void 0 ? _offset$y : 0,
797
+ z: (_offset$z = offset.z) !== null && _offset$z !== void 0 ? _offset$z : 0
798
+ };
799
+ } else {
800
+ var _element$obj2;
801
+ console.warn('⚠ Missing door_animate_offset for', element === null || element === void 0 || (_element$obj2 = element.obj) === null || _element$obj2 === void 0 ? void 0 : _element$obj2.name);
802
+ animate_objects[element.obj.name].offset = {
803
+ x: 0,
804
+ y: 0,
805
+ z: 0
806
+ };
807
+ }
808
+
809
+ // Set the interval ID to new interval ID
810
+ animate_objects[element.obj.name].animate_intervalID = setInterval(function () {
811
+ myAnimRotate(element.obj, selectedItem.properties.open_doors, selectedItem, isCorner);
812
+ }, 30);
813
+ } else {
814
+ // This is excuted when item has drawer box
815
+ // Set the interval ID to new interval ID
816
+ animate_objects[element.obj.name].animate_intervalID = setInterval(function () {
817
+ myAnimTranslate(element.obj, selectedItem.properties.open_doors, selectedItem);
818
+ }, 30);
819
+ }
820
+ });
821
+ } else if (['_length', 'doorStyle', 'cabinet_door_style_id', 'counterTop', 'texture', 'drawer_door_handle_1_gltf'].includes(modifiedPath[keyIndex])) {
822
+ var rItem = planData.sceneGraph.layers[layer.id].items[modifiedPath[4]];
823
+ if (rItem) {
824
+ if (rItem.children.length > 1) {
825
+ rItem.children.pop();
826
+ }
827
+ var _mBoxColor2 = 0x99c3fb;
828
+ var _item3 = item.toJS();
829
+ if (isWarningCabinet(_item3)) {
830
+ _mBoxColor2 = 'rgba(232,187,47,1)';
831
+ }
832
+ rItem.children[0].children.forEach(function (rItemElement) {
833
+ rItemElement.visible = false;
834
+ });
835
+ var _mBox3 = GeomUtils.makeMBoxfromObject(rItem, _mBoxColor2);
836
+ if (_mBox3) {
837
+ //rItem.add (mBox);
838
+ }
839
+ }
840
+ if (rItem != null) {
841
+ removeItemWithoutItem(planData, layer.id, modifiedPath[4]);
842
+ promises.push(addItem(sceneData, planData, layer, modifiedPath[4], catalog, actions.itemsActions, mode, null, rItem));
843
+ setTimeout(function () {
844
+ getDistances(layer, item);
845
+ }, 100);
846
+ }
847
+ break;
848
+ }
849
+ }
850
+ item = layer.getIn(['items', modifiedPath[4]]);
851
+ addCountertop(planData.sceneGraph.layers[layer.id].countertops, item, planData, layer);
852
+ // Toggle selection should not update molding
853
+ if (item.category === 'cabinet' && modifiedPath[modifiedPath.length - 1] !== 'selected' && !modifiedPath[modifiedPath.length - 1].includes('handle')) {
854
+ planData.sceneGraph.layers[layer.id].moldingGroups = addMolding(tmpMoldings, item, planData, layer, actions.itemsActions, mode) || _toConsumableArray(tmpMoldings);
855
+ }
856
+ break;
857
+ case 'visible':
858
+ if (!layer.visible) {
859
+ var _layerGraph = planData.sceneGraph.layers[layer.id];
860
+ for (var _lineID in _layerGraph.lines) removeLine(planData, layer.id, _lineID);
861
+ for (var _areaID in _layerGraph.areas) removeArea(planData, layer.id, _areaID);
862
+ for (var itemID in _layerGraph.items) removeItem(planData, layer.id, itemID);
863
+ for (var holeID in _layerGraph.holes) removeHole(planData, layer.id, holeID);
864
+ } else {
865
+ promises = promises.concat(createLayerObjects(layer, planData, sceneData, actions, catalog, mode));
866
+ }
867
+ break;
868
+ case 'unit':
869
+ case 'ceilHeight':
870
+ case 'opacity':
871
+ case 'altitude':
872
+ case 'molding':
873
+ var layerGraph = planData.sceneGraph.layers[layer.id];
874
+ for (var _lineID2 in layerGraph.lines) removeLine(planData, layer.id, _lineID2);
875
+ for (var _areaID2 in layerGraph.areas) removeArea(planData, layer.id, _areaID2);
876
+ for (var _itemID2 in layerGraph.items) removeItem(planData, layer.id, _itemID2);
877
+ for (var _holeID in layerGraph.holes) removeHole(planData, layer.id, _holeID);
878
+ promises = promises.concat(createLayerObjects(layer, planData, sceneData, actions, catalog, mode));
879
+ }
880
+ var p1 = new Promise(function (resolve) {
881
+ Promise.all(promises).then(function (values) {
882
+ updateBoundingBox(planData, true, mode);
883
+ resolve('replaceObject');
884
+ });
885
+ });
886
+ return {
887
+ promise: p1
888
+ };
889
+ }
890
+ export function getDistances(layer, curItem, isCalcWall) {
891
+ // matching fvLine distance with OP
892
+ var pointArray = calcDistancesFromItemToWalls(curItem, layer).PointArray;
893
+ if ((pointArray === null || pointArray === void 0 ? void 0 : pointArray.length) > 0) {
894
+ var _loop2 = function _loop2() {
895
+ var direction = i === 0 ? 90 : i === 1 ? -90 : i === 2 ? 180 : 0;
896
+ if (fVLine[i].userData) {
897
+ var _pointArray$filter$;
898
+ var opDist = (_pointArray$filter$ = pointArray.filter(function (v) {
899
+ return v[1] === direction;
900
+ })[0]) !== null && _pointArray$filter$ !== void 0 ? _pointArray$filter$ : fVLine[i].userData.distance;
901
+ fVLine[i].userData.opDist = opDist[0];
902
+ }
903
+ };
904
+ for (var i = 0; i < ((_fVLine = fVLine) === null || _fVLine === void 0 ? void 0 : _fVLine.length); i++) {
905
+ var _fVLine;
906
+ _loop2();
907
+ }
908
+ }
909
+ fVLine.forEach(function (line, index) {
910
+ getLineDistance2(line, layer, isEmpty(isCalcWall) ? false : isCalcWall, index);
911
+ });
912
+ }
913
+ function getLineDistance2(obj, layer, isCalcWall, index) {
914
+ var _obj$userData$opDist, _obj$userData, _obj$userData2, _obj$userData$opDist2, _obj$userData3, _obj$userData4;
915
+ if (obj === undefined) return;
916
+ var positionAttribute = obj.geometry.attributes.position;
917
+ if (positionAttribute === undefined) return;
918
+ var wPoint0 = new Three.Vector3().fromBufferAttribute(positionAttribute, 0).applyMatrix4(obj.matrixWorld);
919
+ var wPoint1 = new Three.Vector3().fromBufferAttribute(positionAttribute, 1).applyMatrix4(obj.matrixWorld);
920
+ var raycaster = new Three.Raycaster(wPoint0, new Three.Vector3(wPoint1.x - wPoint0.x, wPoint1.y - wPoint0.y, wPoint1.z - wPoint0.z));
921
+ var rayDirection = raycaster.ray.direction;
922
+ raycaster.camera = new Three.Camera();
923
+ rayDirection.normalize();
924
+ var meshes = [];
925
+ planData.plan.traverse(function (child) {
926
+ if (child.isMesh && child.geometry) {
927
+ meshes.push(child);
928
+ }
929
+ });
930
+ var dx = wPoint0.x - wPoint1.x;
931
+ var dy = wPoint0.y - wPoint1.y;
932
+ var dz = wPoint0.z - wPoint1.z;
933
+ var length = Math.sqrt(dx * dx + dy * dy + dz * dz);
934
+ var scale = 1;
935
+ var extrudeSettings = {
936
+ steps: 2,
937
+ depth: 0.01,
938
+ bevelEnabled: false
939
+ };
940
+ var w = 0.2;
941
+ var h = w * (Math.sqrt(3) / 2);
942
+ var shape = new Three.Shape();
943
+ shape.moveTo(0, 0);
944
+ shape.lineTo(-w / 4, h / 2);
945
+ shape.lineTo(w / 4, h / 2);
946
+ var geom = new Three.ExtrudeGeometry(shape, extrudeSettings);
947
+ geom.center();
948
+ var opDist = (_obj$userData$opDist = (_obj$userData = obj.userData) === null || _obj$userData === void 0 ? void 0 : _obj$userData.opDist) !== null && _obj$userData$opDist !== void 0 ? _obj$userData$opDist : (_obj$userData2 = obj.userData) === null || _obj$userData2 === void 0 ? void 0 : _obj$userData2.distance;
949
+ scale = opDist / length;
950
+ if (opDist <= 0.1) {
951
+ scale = 0.1 / length;
952
+ }
953
+ obj.userData.distance = (_obj$userData$opDist2 = (_obj$userData3 = obj.userData) === null || _obj$userData3 === void 0 ? void 0 : _obj$userData3.opDist) !== null && _obj$userData$opDist2 !== void 0 ? _obj$userData$opDist2 : (_obj$userData4 = obj.userData) === null || _obj$userData4 === void 0 ? void 0 : _obj$userData4.distance;
954
+ // obj.userData.target = intersects[i].object;
955
+ var originPoint = obj.geometry.attributes.position.array.slice(0, 3);
956
+ var lx = obj.geometry.attributes.position.array[3] - obj.geometry.attributes.position.array[0];
957
+ var ly = obj.geometry.attributes.position.array[4] - obj.geometry.attributes.position.array[1];
958
+ var lz = obj.geometry.attributes.position.array[5] - obj.geometry.attributes.position.array[2];
959
+ var newVec = new Three.Vector3(originPoint[0] + lx * scale, originPoint[1] + ly * scale, originPoint[2] + lz * scale);
960
+ obj.geometry.attributes.position.array[3] = newVec.x;
961
+ obj.geometry.attributes.position.array[4] = newVec.y;
962
+ obj.geometry.attributes.position.array[5] = newVec.z;
963
+ obj.geometry.attributes.position.needsUpdate = true;
964
+ obj.geometry.computeBoundingSphere();
965
+ obj.geometry.computeBoundingBox();
966
+ var dist = convert(opDist).from('cm').to('in');
967
+ if (dist > 3) {
968
+ var _canvas = getDistanceCanvas(dist, layer);
969
+ var wid = _canvas.width / window.innerWidth * 30;
970
+ var hei = _canvas.height / window.innerHeight * 30;
971
+ var texture = new Three.Texture(_canvas);
972
+ texture.minFilter = Three.LinearFilter;
973
+ texture.needsUpdate = true;
974
+ var geometry = new Three.PlaneGeometry(wid / 5, hei / 5);
975
+ geometry.computeBoundingBox();
976
+ var material = new Three.MeshBasicMaterial({
977
+ map: texture,
978
+ side: Three.DoubleSide
979
+ });
980
+ var textMesh = new Three.Mesh(geometry, material);
981
+ for (; obj.children.length != 0;) {
982
+ var temp = obj.children.pop();
983
+ disposeObject(temp);
984
+ }
985
+ textMesh.rotation.set(Math.PI / 2, Math.PI, 0);
986
+ // obj.add(textMesh);
987
+ textMesh.position.set((obj.geometry.attributes.position.array[0] + obj.geometry.attributes.position.array[3]) / 2, 0.01, (obj.geometry.attributes.position.array[2] + obj.geometry.attributes.position.array[5]) / 2);
988
+ textMesh.name = 'lineText';
989
+ textMesh.renderOrder = 2;
990
+ textMesh.material.depthTest = false;
991
+ textMesh.material.transparent = true;
992
+ var sprite1 = new Three.Sprite(new Three.SpriteMaterial({
993
+ map: texture
994
+ }));
995
+ sprite1.position.set((obj.geometry.attributes.position.array[0] + obj.geometry.attributes.position.array[3]) / 2, 0.01, (obj.geometry.attributes.position.array[2] + obj.geometry.attributes.position.array[5]) / 2);
996
+ sprite1.name = 'lineText';
997
+ sprite1.renderOrder = 2;
998
+ sprite1.scale.set(0.2, 0.1, 0.2);
999
+ sprite1.layers.set(1);
1000
+ sprite1.material.depthTest = false;
1001
+ obj.add(sprite1);
1002
+ if (obj.parent != null) {
1003
+ // is not lighting
1004
+ var item3D = obj.parent.parent.parent;
1005
+ var max = item3D.children[0].userData.max;
1006
+ var min = item3D.children[0].userData.min;
1007
+ var objW = (max.x - min.x) / 100,
1008
+ objL = (max.z - min.z) / 100;
1009
+ var triangle = new Three.Mesh(geom, new Three.MeshBasicMaterial({
1010
+ color: SHADE_DARK_PURPLE_COLOR
1011
+ }));
1012
+ var triangle1 = new Three.Mesh(geom, new Three.MeshBasicMaterial({
1013
+ color: SHADE_DARK_PURPLE_COLOR
1014
+ }));
1015
+ triangle.position.set((index < 2 ? 0 : Math.sin((index === 2 ? 1 : -1) * Math.PI / 2)) * (obj.geometry.attributes.position.array[0] + h / 4 + (index % 2 === 0 ? 0 : objW)), newVec.y, (index < 2 ? Math.cos(index * Math.PI) : 0) * (obj.geometry.attributes.position.array[2] + h / 4 + (index % 2 === 0 ? 0 : objL)));
1016
+ triangle1.position.set(newVec.x - (index < 2 ? 0 : Math.sin((index === 2 ? 1 : -1) * Math.PI / 2)) * h / 4, newVec.y, newVec.z - (index < 2 ? Math.cos(index * Math.PI) : 0) * h / 4);
1017
+ if (index < 2) {
1018
+ triangle.rotation.x = Math.cos(index * Math.PI) * Math.PI / 2;
1019
+ triangle1.rotation.x = -Math.cos(index * Math.PI) * Math.PI / 2;
1020
+ } else {
1021
+ triangle.rotation.x = -Math.PI / 2;
1022
+ triangle.rotation.z = -(index === 2 ? 1 : -1) * Math.PI / 2;
1023
+ triangle1.rotation.x = Math.PI / 2;
1024
+ triangle1.rotation.z = (index === 2 ? 1 : -1) * Math.PI / 2;
1025
+ }
1026
+ triangle.name = 'lineText';
1027
+ triangle1.name = 'lineText';
1028
+ triangle.renderOrder = 2;
1029
+ triangle1.renderOrder = 2;
1030
+ triangle.material.transparent = true;
1031
+ triangle1.material.transparent = true;
1032
+ triangle.material.depthTest = false;
1033
+ triangle1.material.depthTest = false;
1034
+ obj.add(triangle);
1035
+ obj.add(triangle1);
1036
+ }
1037
+ }
1038
+
1039
+ // if (obj.userData.distance <= 50 && obj.userData.distance >= 0.5) {
1040
+ var real_target = obj.userData.target;
1041
+ for (; ((_real_target = real_target) === null || _real_target === void 0 ? void 0 : _real_target.name) != 'pivot';) {
1042
+ var _real_target, _real_target2, _real_target3;
1043
+ if (((_real_target2 = real_target) === null || _real_target2 === void 0 ? void 0 : _real_target2.parent) == null) break;
1044
+ real_target = (_real_target3 = real_target) === null || _real_target3 === void 0 ? void 0 : _real_target3.parent;
1045
+ }
1046
+ // let item3D = obj.parent.parent.parent;
1047
+ // let origin = obj.geometry.vertices[0].clone().applyMatrix4(obj.matrixWorld);
1048
+ // let target = obj.geometry.vertices[1].clone().applyMatrix4(obj.matrixWorld);
1049
+ // let uVec = new Three.Vector3(target.x - origin.x - 0.2, target.y - origin.y - 0.2, target.z - origin.z - 0.2);
1050
+ obj.visible = true;
1051
+ if (dist < 3) obj.visible = false;
1052
+ return obj;
1053
+ }
1054
+ function getLineDistance(obj, layer, isCalcWall, index) {
1055
+ if (obj === undefined) return;
1056
+ var positionAttribute = obj.geometry.attributes.position;
1057
+ if (positionAttribute === undefined) return;
1058
+ var wPoint0 = new Three.Vector3().fromBufferAttribute(positionAttribute, 0).applyMatrix4(obj.matrixWorld);
1059
+ var wPoint1 = new Three.Vector3().fromBufferAttribute(positionAttribute, 1).applyMatrix4(obj.matrixWorld);
1060
+ var raycaster = new Three.Raycaster(wPoint0, new Three.Vector3(wPoint1.x - wPoint0.x, wPoint1.y - wPoint0.y, wPoint1.z - wPoint0.z));
1061
+ var rayDirection = raycaster.ray.direction;
1062
+ raycaster.camera = new Three.Camera();
1063
+ rayDirection.normalize();
1064
+ var meshes = [];
1065
+ planData.plan.traverse(function (child) {
1066
+ if (child.isMesh && child.geometry) {
1067
+ meshes.push(child);
1068
+ }
1069
+ });
1070
+ var intersects = raycaster.intersectObjects(meshes, true);
1071
+ var lx = wPoint0.x - wPoint1.x;
1072
+ var ly = wPoint0.y - wPoint1.y;
1073
+ var lz = wPoint0.z - wPoint1.z;
1074
+ var length = Math.sqrt(lx * lx + ly * ly + lz * lz);
1075
+ var scale = 1;
1076
+ var extrudeSettings = {
1077
+ steps: 2,
1078
+ depth: 0.01,
1079
+ bevelEnabled: false
1080
+ };
1081
+ var w = 0.2;
1082
+ var h = w * (Math.sqrt(3) / 2);
1083
+ var shape = new Three.Shape();
1084
+ shape.moveTo(0, 0);
1085
+ shape.lineTo(-w / 4, h / 2);
1086
+ shape.lineTo(w / 4, h / 2);
1087
+ var geom = new Three.ExtrudeGeometry(shape, extrudeSettings);
1088
+ geom.center();
1089
+ if (!isCalcWall) {
1090
+ for (var i = 0; i < intersects.length; i++) {
1091
+ if (intersects[i].object.name != 'TransformBox' && !intersects[i].object.name.includes('WarningBox') && intersects[i].object.type != 'Line' && intersects[i].object.name != 'rotate' && intersects[i].object.name != 'lineText' && intersects[i].object.type != 'BoxHelper' && !intersects[i].object.name.includes('molding') && intersects[i].object.name != 'soul') {
1092
+ scale = intersects[i].distance / length;
1093
+ if (intersects[i].distance <= 0.1) {
1094
+ scale = 0.1 / length;
1095
+ }
1096
+ obj.userData.distance = intersects[i].distance;
1097
+ obj.userData.target = intersects[i].object;
1098
+ var originPoint = obj.geometry.attributes.position.array.slice(0, 3);
1099
+ var _lx = obj.geometry.attributes.position.array[3] - obj.geometry.attributes.position.array[0];
1100
+ var _ly = obj.geometry.attributes.position.array[4] - obj.geometry.attributes.position.array[1];
1101
+ var _lz = obj.geometry.attributes.position.array[5] - obj.geometry.attributes.position.array[2];
1102
+ var newVec = new Three.Vector3(originPoint[0] + _lx * scale, originPoint[1] + _ly * scale, originPoint[2] + _lz * scale);
1103
+ obj.geometry.attributes.position.array[3] = newVec.x;
1104
+ obj.geometry.attributes.position.array[4] = newVec.y;
1105
+ obj.geometry.attributes.position.array[5] = newVec.z;
1106
+ obj.geometry.attributes.position.needsUpdate = true;
1107
+ obj.geometry.computeBoundingSphere();
1108
+ obj.geometry.computeBoundingBox();
1109
+ var dist = convert(intersects[i].distance).from('cm').to('in');
1110
+ if (dist > 3) {
1111
+ var _canvas2 = getDistanceCanvas(dist, layer);
1112
+ var wid = _canvas2.width / window.innerWidth * 30;
1113
+ var hei = _canvas2.height / window.innerHeight * 30;
1114
+ var texture = new Three.Texture(_canvas2);
1115
+ texture.minFilter = Three.LinearFilter;
1116
+ texture.needsUpdate = true;
1117
+ var geometry = new Three.PlaneGeometry(wid / 5, hei / 5);
1118
+ geometry.computeBoundingBox();
1119
+ var material = new Three.MeshBasicMaterial({
1120
+ map: texture,
1121
+ side: Three.DoubleSide
1122
+ });
1123
+ var textMesh = new Three.Mesh(geometry, material);
1124
+ for (; obj.children.length != 0;) {
1125
+ var temp = obj.children.pop();
1126
+ disposeObject(temp);
1127
+ }
1128
+ textMesh.rotation.set(Math.PI / 2, Math.PI, 0);
1129
+ // obj.add(textMesh);
1130
+ textMesh.position.set((obj.geometry.attributes.position.array[0] + obj.geometry.attributes.position.array[3]) / 2, 0.01, (obj.geometry.attributes.position.array[2] + obj.geometry.attributes.position.array[5]) / 2);
1131
+ textMesh.name = 'lineText';
1132
+ textMesh.renderOrder = 2;
1133
+ textMesh.material.depthTest = false;
1134
+ textMesh.material.transparent = true;
1135
+ var sprite1 = new Three.Sprite(new Three.SpriteMaterial({
1136
+ map: texture
1137
+ }));
1138
+ sprite1.position.set((obj.geometry.attributes.position.array[0] + obj.geometry.attributes.position.array[3]) / 2, 0.01, (obj.geometry.attributes.position.array[2] + obj.geometry.attributes.position.array[5]) / 2);
1139
+ sprite1.name = 'lineText';
1140
+ sprite1.renderOrder = 2;
1141
+ sprite1.scale.set(0.2, 0.1, 0.2);
1142
+ sprite1.layers.set(1);
1143
+ sprite1.material.depthTest = false;
1144
+ obj.add(sprite1);
1145
+ if (obj.parent != null) {
1146
+ // is not lighting
1147
+ var item3D = obj.parent.parent.parent;
1148
+ var max = item3D.children[0].userData.max;
1149
+ var min = item3D.children[0].userData.min;
1150
+ var objW = (max.x - min.x) / 100,
1151
+ objL = (max.z - min.z) / 100;
1152
+ var triangle = new Three.Mesh(geom, new Three.MeshBasicMaterial({
1153
+ color: SHADE_DARK_PURPLE_COLOR
1154
+ }));
1155
+ var triangle1 = new Three.Mesh(geom, new Three.MeshBasicMaterial({
1156
+ color: SHADE_DARK_PURPLE_COLOR
1157
+ }));
1158
+ triangle.position.set((index < 2 ? 0 : Math.sin((index === 2 ? 1 : -1) * Math.PI / 2)) * (obj.geometry.attributes.position.array[0] + h / 4 + (index % 2 === 0 ? 0 : objW)), newVec.y, (index < 2 ? Math.cos(index * Math.PI) : 0) * (obj.geometry.attributes.position.array[2] + h / 4 + (index % 2 === 0 ? 0 : objL)));
1159
+ triangle1.position.set(newVec.x - (index < 2 ? 0 : Math.sin((index === 2 ? 1 : -1) * Math.PI / 2)) * h / 4, newVec.y, newVec.z - (index < 2 ? Math.cos(index * Math.PI) : 0) * h / 4);
1160
+ if (index < 2) {
1161
+ triangle.rotation.x = Math.cos(index * Math.PI) * Math.PI / 2;
1162
+ triangle1.rotation.x = -Math.cos(index * Math.PI) * Math.PI / 2;
1163
+ } else {
1164
+ triangle.rotation.x = -Math.PI / 2;
1165
+ triangle.rotation.z = -(index === 2 ? 1 : -1) * Math.PI / 2;
1166
+ triangle1.rotation.x = Math.PI / 2;
1167
+ triangle1.rotation.z = (index === 2 ? 1 : -1) * Math.PI / 2;
1168
+ }
1169
+ triangle.name = 'lineText';
1170
+ triangle1.name = 'lineText';
1171
+ triangle.renderOrder = 2;
1172
+ triangle1.renderOrder = 2;
1173
+ triangle.material.transparent = true;
1174
+ triangle1.material.transparent = true;
1175
+ triangle.material.depthTest = false;
1176
+ triangle1.material.depthTest = false;
1177
+ obj.add(triangle);
1178
+ obj.add(triangle1);
1179
+ }
1180
+ }
1181
+
1182
+ // if (obj.userData.distance <= 50 && obj.userData.distance >= 0.5) {
1183
+ var real_target = obj.userData.target;
1184
+ for (; real_target.name != 'pivot';) {
1185
+ if (real_target.parent == null) break;
1186
+ real_target = real_target.parent;
1187
+ }
1188
+ // let item3D = obj.parent.parent.parent;
1189
+ // let origin = obj.geometry.vertices[0].clone().applyMatrix4(obj.matrixWorld);
1190
+ // let target = obj.geometry.vertices[1].clone().applyMatrix4(obj.matrixWorld);
1191
+ // let uVec = new Three.Vector3(target.x - origin.x - 0.2, target.y - origin.y - 0.2, target.z - origin.z - 0.2);
1192
+ obj.visible = true;
1193
+ if (dist < 3) obj.visible = false;
1194
+ return obj;
1195
+ }
1196
+ }
1197
+ }
1198
+ var tX = wPoint0.x - planData.plan.position.x;
1199
+ var tZ = wPoint0.z - planData.plan.position.z;
1200
+ tZ = -tZ;
1201
+ var tX1 = wPoint1.x - planData.plan.position.x;
1202
+ var tZ1 = wPoint1.z - planData.plan.position.z;
1203
+ tZ1 = -tZ1;
1204
+ if (!layer) return;
1205
+ layer.lines.forEach(function (data) {
1206
+ var px = [];
1207
+ var py = [];
1208
+ var opX = [tX, tX1];
1209
+ var opY = [tZ, tZ1];
1210
+ data.vertices.forEach(function (vec) {
1211
+ var vertices = layer.vertices.get(vec);
1212
+ px.push(vertices.x);
1213
+ py.push(vertices.y);
1214
+ });
1215
+ var distance = getIntersectPoint(opX, opY, px, py);
1216
+ if (distance != null) {
1217
+ obj.userData.distance = distance;
1218
+ obj.userData.target = planData.sceneGraph.layers[layer.id].lines[data.get('id')];
1219
+ scale = distance / length;
1220
+ if (distance <= 0.1) {
1221
+ scale = 0.1 / length;
1222
+ }
1223
+ var _originPoint = obj.geometry.attributes.position.array.slice(0, 3);
1224
+ lx = obj.geometry.attributes.position.array[3] - obj.geometry.attributes.position.array[0];
1225
+ ly = obj.geometry.attributes.position.array[4] - obj.geometry.attributes.position.array[1];
1226
+ lz = obj.geometry.attributes.position.array[5] - obj.geometry.attributes.position.array[2];
1227
+ var _newVec = new Three.Vector3(_originPoint.x + lx * scale, _originPoint.y + ly * scale, _originPoint.z + lz * scale);
1228
+ obj.geometry.attributes.position.array[3] = _newVec.x;
1229
+ obj.geometry.attributes.position.array[4] = _newVec.y;
1230
+ obj.geometry.attributes.position.array[5] = _newVec.z;
1231
+ obj.geometry.attributes.position.needsUpdate = true;
1232
+ var _dist = convert(formatNumber(distance, DECIMAL_PLACES_2)).from('cm').to('in');
1233
+ if (_dist > 3) {
1234
+ var _canvas3 = getDistanceCanvas(_dist, layer);
1235
+ var _wid = _canvas3.width / window.innerWidth * 30;
1236
+ var _hei = _canvas3.height / window.innerHeight * 30;
1237
+ var _texture = new Three.Texture(_canvas3);
1238
+ _texture.needsUpdate = true;
1239
+ var _geometry = new Three.PlaneGeometry(_wid / 2, _hei / 2);
1240
+ _geometry.computeBoundingBox();
1241
+ var _material = new Three.MeshBasicMaterial({
1242
+ map: _texture,
1243
+ side: Three.DoubleSide
1244
+ });
1245
+ var _textMesh = new Three.Mesh(_geometry, _material);
1246
+ for (; obj.children.length != 0;) {
1247
+ var _temp = obj.children.pop();
1248
+ disposeObject(_temp);
1249
+ }
1250
+ _textMesh.rotation.set(Math.PI / 2, Math.PI, 0);
1251
+ // obj.add(textMesh);
1252
+ _textMesh.position.set((obj.geometry.attributes.position.array[0] + obj.geometry.attributes.position.array[3]) / 2, 0.01, (obj.geometry.attributes.position.array[2] + obj.geometry.attributes.position.array[5]) / 2);
1253
+ _textMesh.name = 'lineText';
1254
+ _textMesh.renderOrder = 2;
1255
+ _textMesh.material.depthTest = false;
1256
+ _textMesh.material.transparent = true;
1257
+ var _sprite = new Three.Sprite(new Three.SpriteMaterial({
1258
+ map: _texture
1259
+ }));
1260
+ _sprite.position.set((obj.geometry.attributes.position.array[0] + obj.geometry.attributes.position.array[3]) / 2, 0.01, (obj.geometry.attributes.position.array[2] + obj.geometry.attributes.position.array[5]) / 2);
1261
+ _sprite.name = 'lineText';
1262
+ _sprite.scale.set(0.2, 0.1, 0.2);
1263
+ _sprite.layers.set(1);
1264
+ obj.add(_sprite);
1265
+ var _item3D = obj.parent.parent.parent;
1266
+ var _max = _item3D.children[0].userData.max;
1267
+ var _min = _item3D.children[0].userData.min;
1268
+ var _objW = (_max.x - _min.x) / 100,
1269
+ _objL = (_max.z - _min.z) / 100;
1270
+ var triangle = new Three.Mesh(geom, new Three.MeshBasicMaterial({
1271
+ color: SHADE_DARK_PURPLE_COLOR
1272
+ }));
1273
+ var triangle1 = new Three.Mesh(geom, new Three.MeshBasicMaterial({
1274
+ color: SHADE_DARK_PURPLE_COLOR
1275
+ }));
1276
+ triangle.position.set((index < 2 ? 0 : Math.sin((index === 2 ? 1 : -1) * Math.PI / 2)) * (obj.geometry.attributes.position.array[0] + h / 4 + (index % 2 === 0 ? 0 : _objW)), _newVec.y, (index < 2 ? Math.cos(index * Math.PI) : 0) * (obj.geometry.attributes.position.array[2] + h / 4 + (index % 2 === 0 ? 0 : _objL)) - 0.02);
1277
+ triangle1.position.set(_newVec.x - (index < 2 ? 0 : Math.sin((index === 2 ? 1 : -1) * Math.PI / 2)) * h / 4, _newVec.y, _newVec.z - (index < 2 ? Math.cos(index * Math.PI) : 0) * h / 4);
1278
+ if (index < 2) {
1279
+ triangle.rotation.x = Math.cos(index * Math.PI) * Math.PI / 2;
1280
+ triangle1.rotation.x = -Math.cos(index * Math.PI) * Math.PI / 2;
1281
+ } else {
1282
+ triangle.rotation.x = -Math.PI / 2;
1283
+ triangle.rotation.z = -(index === 2 ? 1 : -1) * Math.PI / 2;
1284
+ triangle1.rotation.x = Math.PI / 2;
1285
+ triangle1.rotation.z = (index === 2 ? 1 : -1) * Math.PI / 2;
1286
+ }
1287
+ triangle.name = 'lineText';
1288
+ triangle1.name = 'lineText';
1289
+ triangle.renderOrder = 2;
1290
+ triangle1.renderOrder = 2;
1291
+ triangle.material.transparent = true;
1292
+ triangle1.material.transparent = true;
1293
+ triangle.material.depthTest = false;
1294
+ triangle1.material.depthTest = false;
1295
+ obj.add(triangle);
1296
+ obj.add(triangle1);
1297
+ }
1298
+ // if (obj.userData.distance <= 50 && obj.userData.distance >= 0.5) {
1299
+ // let item3D = obj.parent.parent.parent;
1300
+ // let pos = item3D.position.clone();
1301
+ // let origin = obj.geometry.vertices[0].clone().applyMatrix4(obj.matrixWorld);
1302
+ // let target = obj.geometry.vertices[1].clone().applyMatrix4(obj.matrixWorld);
1303
+ // let uVec = new Three.Vector3(target.x - origin.x - 0.2, target.y - origin.y - 0.2, target.z - origin.z - 0.2);
1304
+ obj.visible = true;
1305
+ if (_dist > 3) obj.visible = false;
1306
+ return obj;
1307
+ // itemsActions.updateDraggingItemChanged(pos.x - uVec.x, -pos.z + uVec.z);
1308
+ // }
1309
+ }
1310
+ });
1311
+ obj.visible = false;
1312
+ return obj;
1313
+ }
1314
+ export function getIntersectPoint(opX, opY, pX, pY) {
1315
+ var oA;
1316
+ if (opX[1] == opX[0]) oA = null;else oA = (opY[1] - opY[0]) / (opX[1] - opX[0]);
1317
+ var A;
1318
+ if (pX[1] == pX[0]) A = null;else A = (pY[1] - pY[0]) / (pX[1] - pX[0]);
1319
+ if (oA == A) return null;
1320
+ if (oA != null && A != null) {
1321
+ var oB = opY[0] - oA * opX[0];
1322
+ var B = pY[0] - A * pX[0];
1323
+ var iX = (B - oB) / (oA - A);
1324
+ if (pX[0] <= iX && iX <= pX[1] || pX[0] >= iX && iX >= pX[1]) {
1325
+ if (opX[0] <= opX[1] && opX[0] <= iX || opX[0] >= opX[1] && opX[0] >= iX) {
1326
+ var iY = pY[0] + A * (iX - pX[0]);
1327
+ var distance = Math.sqrt((opX[0] - iX) * (opX[0] - iX) + (opY[0] - iY) * (opY[0] - iY));
1328
+ return distance;
1329
+ }
1330
+ return null;
1331
+ }
1332
+ }
1333
+ if (oA == null) {
1334
+ var _iX = opX[0];
1335
+ if (A != null) {
1336
+ if (pX[0] <= _iX && _iX <= pX[1] || pX[0] >= _iX && _iX >= pX[1]) {
1337
+ var _iY = pY[0] + A * (_iX - pX[0]);
1338
+ if (opY[0] <= _iY && opY[0] <= opY[1] || opY[0] >= _iY && opY[0] >= opY[1]) {
1339
+ var _distance = Math.sqrt((opX[0] - _iX) * (opX[0] - _iX) + (opY[0] - _iY) * (opY[0] - _iY));
1340
+ return _distance;
1341
+ }
1342
+ }
1343
+ }
1344
+ }
1345
+ if (A == null) {
1346
+ var _iX2 = pX[0];
1347
+ if (oA != null) {
1348
+ var _iY2 = _iX2 * oA + opY[0] - oA * opX[0];
1349
+ if (pY[0] <= _iY2 && _iY2 <= pY[1] || pY[0] >= _iY2 && _iY2 >= pY[1]) {
1350
+ if (opY[0] <= _iY2 && opY[0] <= opY[1] || opY[0] >= _iY2 && opY[0] >= opY[1]) {
1351
+ var _distance2 = Math.sqrt((opX[0] - _iX2) * (opX[0] - _iX2) + (opY[0] - _iY2) * (opY[0] - _iY2));
1352
+ return _distance2;
1353
+ }
1354
+ }
1355
+ }
1356
+ }
1357
+ return null;
1358
+ }
1359
+ function gcd(a, b) {
1360
+ return a % b ? gcd(b, a % b) : b;
1361
+ }
1362
+ function getDistanceCanvas(distance, layer) {
1363
+ var _layer$unit;
1364
+ var parameters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
1365
+ var canvas = document.createElement('canvas');
1366
+ var ctx = canvas.getContext('2d');
1367
+ var curUnit = (_layer$unit = layer === null || layer === void 0 ? void 0 : layer.unit) !== null && _layer$unit !== void 0 ? _layer$unit : UNIT_INCH;
1368
+ var fixedLength = (layer === null || layer === void 0 ? void 0 : layer.unit) === UNIT_METER || (layer === null || layer === void 0 ? void 0 : layer.unit) === UNIT_FOOT ? 2 : 0;
1369
+ var distText = String((Math.round(convert(distance).from('in').to(curUnit) * 100) / 100).toFixed(fixedLength));
1370
+ var fontSize = 16;
1371
+ var integral = distText + curUnit;
1372
+ // let integral = String(distance) + "''";
1373
+
1374
+ parameters.fontName = parameters.fontName || ARROW_TEXT_FONTFACE;
1375
+
1376
+ // Prepare the font to be able to measure
1377
+ ctx.font = "".concat(fontSize, "px ") + parameters.fontName;
1378
+ if (parameters.italic) {
1379
+ ctx.font = "italic ".concat(fontSize, "px ") + parameters.fontName;
1380
+ }
1381
+ if (parameters.bold) {
1382
+ ctx.font = "bold ".concat(fontSize, "px ") + parameters.fontName;
1383
+ }
1384
+ if (parameters.bold && parameters.italic) {
1385
+ ctx.font = "italic bold ".concat(fontSize, "px ") + parameters.fontName;
1386
+ }
1387
+ var textMetrics = ctx.measureText(integral);
1388
+ var width = 70;
1389
+ var height = fontSize + 20;
1390
+
1391
+ // Resize canvas to match text size
1392
+ canvas.width = width;
1393
+ canvas.height = height;
1394
+ canvas.style.width = width + 'px';
1395
+ canvas.style.height = height + 'px';
1396
+
1397
+ // Re-apply font since canvas is resized.
1398
+ ctx.font = "".concat(fontSize, "px ") + parameters.fontName;
1399
+ if (parameters.italic) {
1400
+ ctx.font = "italic ".concat(fontSize, "px ") + parameters.fontName;
1401
+ }
1402
+ if (parameters.bold) {
1403
+ ctx.font = "bold ".concat(fontSize, "px ") + parameters.fontName;
1404
+ }
1405
+ if (parameters.bold && parameters.italic) {
1406
+ ctx.font = "italic bold ".concat(fontSize, "px ") + parameters.fontName;
1407
+ }
1408
+ //ctx.textAlign = parameters.align || "center";
1409
+ ctx.textBaseline = parameters.baseline || 'middle';
1410
+ var r = 10;
1411
+ // Make the canvas transparent for simplicity
1412
+ ctx.fillStyle = ARROW_TEXT_BACKCOLOR;
1413
+ // ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
1414
+ var w = ctx.canvas.width;
1415
+ var h = ctx.canvas.height;
1416
+ ctx.beginPath();
1417
+ ctx.moveTo(r, 0);
1418
+ ctx.lineTo(w - r, 0);
1419
+ ctx.arcTo(w, 0, w, r, r);
1420
+ ctx.lineTo(w, h - r);
1421
+ ctx.arcTo(w, h, w - r, h, r);
1422
+ ctx.lineTo(r, h);
1423
+ ctx.arcTo(0, h, 0, h - r, r);
1424
+ ctx.lineTo(0, r);
1425
+ ctx.arcTo(0, 0, r, 0, r);
1426
+ // ctx.arcTo(w+r, h+2*r, w+r, 0, r);
1427
+ ctx.fill();
1428
+ ctx.fillStyle = parameters.fillColor || ARROW_TEXT_FORECOLOR;
1429
+ ctx.fillText(integral, (width - textMetrics.width) / 2, height / 2);
1430
+ ctx.strokeStyle = parameters.strokeColor || ARROW_TEXT_FORECOLOR;
1431
+ ctx.strokeText(integral, (width - textMetrics.width) / 2, height / 2);
1432
+
1433
+ // ctx.font = `${fontSize - 5}px ` + parameters.fontName;
1434
+ // const denoMetrics = ctx.measureText(deno);
1435
+ // const numoMetrics = ctx.measureText(numo);
1436
+ // ctx.fillStyle = ARROW_TEXT_FORECOLOR;
1437
+ // ctx.fillRect(
1438
+ // ctx.canvas.width / 2 + 3,
1439
+ // ctx.canvas.height / 2 - 2,
1440
+ // denoMetrics.width,
1441
+ // 1
1442
+ // );
1443
+
1444
+ // const denoMetrics = ctx.measureText(deno);
1445
+ // ctx.fillStyle = ARROW_TEXT_FORECOLOR;
1446
+ // ctx.fillRect(
1447
+ // ctx.canvas.width / 2 + 3,
1448
+ // ctx.canvas.height / 2 - 2,
1449
+ // denoMetrics.width,
1450
+ // 1
1451
+ // );
1452
+
1453
+ // ctx.fillStyle = parameters.fillColor || ARROW_TEXT_FORECOLOR;
1454
+ // ctx.fillText(
1455
+ // numo,
1456
+ // ctx.canvas.width / 2 + 3 + (denoMetrics.width - numoMetrics.width) / 2,
1457
+ // height / 2 - 8
1458
+ // );
1459
+ // ctx.font = `${fontSize}px ` + parameters.fontName;
1460
+ // ctx.fillText(
1461
+ // "''",
1462
+ // ctx.canvas.width / 2 + 4 + denoMetrics.width,
1463
+ // height / 2 - 7
1464
+ // );
1465
+ // ctx.font = `${fontSize - 5}px ` + parameters.fontName;
1466
+
1467
+ // ctx.strokeStyle = parameters.strokeColor || ARROW_TEXT_FORECOLOR;
1468
+ // ctx.strokeText(
1469
+ // numo,
1470
+ // ctx.canvas.width / 2 + 3 + (denoMetrics.width - numoMetrics.width) / 2,
1471
+ // height / 2 - 8
1472
+ // );
1473
+
1474
+ // ctx.fillStyle = parameters.fillColor || ARROW_TEXT_FORECOLOR;
1475
+ // ctx.fillText(deno, ctx.canvas.width / 2 + 3, height / 2 + 8);
1476
+ // ctx.strokeStyle = parameters.strokeColor || ARROW_TEXT_FORECOLOR;
1477
+ // ctx.strokeText(deno, ctx.canvas.width / 2 + 3, height / 2 + 8);
1478
+ return canvas;
1479
+ }
1480
+ function removeObject(modifiedPath, layer, planData, actions, sceneData, oldSceneData, catalog) {
1481
+ var promises = [];
1482
+ switch (modifiedPath[3]) {
1483
+ case 'lines':
1484
+ // Here I remove the line with all its holes
1485
+ var lineID = modifiedPath[4];
1486
+ oldSceneData.getIn(['layers', layer.id, 'lines', lineID, 'holes']).forEach(function (holeID) {
1487
+ removeHole(planData, layer.id, holeID);
1488
+ });
1489
+ removeLine(planData, layer.id, lineID);
1490
+ var mode = oldSceneData.mode;
1491
+ if (ARRAY_3D_MODES.includes(mode)) mode = MODE_IDLE_3D;else mode = MODE_IDLE;
1492
+ if (modifiedPath.length > 5) {
1493
+ // I removed an hole, so I should add the new line
1494
+ promises.push(addLine(sceneData, planData, layer, lineID, catalog, actions.linesActions));
1495
+ layer.getIn(['lines', lineID, 'holes']).forEach(function (holeID) {
1496
+ promises.push(addHole(sceneData, planData, layer, holeID, catalog, actions.holesActions, mode));
1497
+ });
1498
+ }
1499
+ break;
1500
+ case 'areas':
1501
+ if (modifiedPath.length === 5) {
1502
+ // I am removing an entire area
1503
+ removeArea(planData, layer.id, modifiedPath[4]);
1504
+ }
1505
+ break;
1506
+ case 'items':
1507
+ if (modifiedPath.length === 5) {
1508
+ // I am removing an item
1509
+ removeItem(planData, layer.id, modifiedPath[4], oldSceneData.getIn(['layers', layer.id]), layer);
1510
+ }
1511
+ break;
1512
+ }
1513
+ Promise.all(promises).then(function (values) {
1514
+ return updateBoundingBox(planData);
1515
+ });
1516
+ }
1517
+ function removeLayer(layerId, planData) {
1518
+ var layerGraph = planData.sceneGraph.layers[layerId];
1519
+ for (var lineID in layerGraph.lines) removeLine(planData, layerId, lineID);
1520
+ for (var areaID in layerGraph.areas) removeArea(planData, layerId, areaID);
1521
+ for (var itemID in layerGraph.items) removeItem(planData, layerId, itemID);
1522
+ for (var holeID in layerGraph.holes) removeHole(planData, layerId, holeID);
1523
+ delete planData.sceneGraph.layers[layerId];
1524
+ }
1525
+ function removeHole(planData, layerId, holeID) {
1526
+ if (planData.sceneGraph.busyResources.layers[layerId].holes[holeID]) {
1527
+ setTimeout(function () {
1528
+ return removeHole(planData, layerId, holeID);
1529
+ }, 100);
1530
+ return;
1531
+ }
1532
+ planData.sceneGraph.busyResources.layers[layerId].holes[holeID] = true;
1533
+ var hole3D = planData.sceneGraph.layers[layerId].holes[holeID];
1534
+ if (hole3D) {
1535
+ planData.plan.remove(hole3D);
1536
+ disposeObject(hole3D);
1537
+ delete planData.sceneGraph.layers[layerId].holes[holeID];
1538
+ delete planData.sceneGraph.LODs[holeID];
1539
+ hole3D = null;
1540
+ updateBoundingBox(planData, true);
1541
+ }
1542
+ planData.sceneGraph.busyResources.layers[layerId].holes[holeID] = false;
1543
+ }
1544
+ function removeLine(planData, layerId, lineID) {
1545
+ if (planData.sceneGraph.busyResources.layers[layerId].lines[lineID]) {
1546
+ setTimeout(function () {
1547
+ return removeLine(planData, layerId, lineID);
1548
+ }, 100);
1549
+ return;
1550
+ }
1551
+ planData.sceneGraph.busyResources.layers[layerId].lines[lineID] = true;
1552
+ var line3D = planData.sceneGraph.layers[layerId].lines[lineID];
1553
+ if (line3D) {
1554
+ planData.plan.remove(line3D);
1555
+ disposeObject(line3D);
1556
+ delete planData.sceneGraph.layers[layerId].lines[lineID];
1557
+ delete planData.sceneGraph.LODs[lineID];
1558
+ line3D = null;
1559
+ updateBoundingBox(planData, true);
1560
+ }
1561
+ planData.sceneGraph.busyResources.layers[layerId].lines[lineID] = false;
1562
+ }
1563
+ function removeArea(planData, layerId, areaID) {
1564
+ if (planData.sceneGraph.busyResources.layers[layerId].areas[areaID]) {
1565
+ setTimeout(function () {
1566
+ return removeArea(planData, layerId, areaID);
1567
+ }, 100);
1568
+ return;
1569
+ }
1570
+ planData.sceneGraph.busyResources.layers[layerId].areas[areaID] = true;
1571
+ var area3D = planData.sceneGraph.layers[layerId].areas[areaID];
1572
+ if (area3D) {
1573
+ planData.plan.remove(area3D);
1574
+ disposeObject(area3D);
1575
+ delete planData.sceneGraph.layers[layerId].areas[areaID];
1576
+ delete planData.sceneGraph.LODs[areaID];
1577
+ area3D = null;
1578
+ updateBoundingBox(planData, true);
1579
+ }
1580
+ planData.sceneGraph.busyResources.layers[layerId].areas[areaID] = false;
1581
+ }
1582
+ export function removeItem(planData, layerId, itemID) {
1583
+ var oldSceneLayer = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
1584
+ var newSceneLayer = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
1585
+ if (planData.sceneGraph.busyResources.layers[layerId].items[itemID]) {
1586
+ setTimeout(function () {
1587
+ return removeItem(planData, layerId, itemID, oldSceneLayer, newSceneLayer);
1588
+ }, 100);
1589
+ return;
1590
+ }
1591
+ planData.sceneGraph.busyResources.layers[layerId].items[itemID] = true;
1592
+
1593
+ // The layer variable is layer that contains the deleted item.
1594
+ var layer = oldSceneLayer ? oldSceneLayer : planData.sceneData.getIn(['layers', layerId]);
1595
+ var item = layer.getIn(['items', itemID]); // deleted item.
1596
+ deleteCountertop(planData.sceneGraph.layers[layerId].countertops, item, planData, layer);
1597
+ planData.sceneGraph.layers[layerId].moldingGroups = deleteAllMolding(planData.sceneGraph.layers[layerId].moldingGroups, item, planData, layer, newSceneLayer);
1598
+ var item3D = planData.sceneGraph.layers[layerId].items[itemID];
1599
+ if (item3D) {
1600
+ planData.plan.remove(item3D);
1601
+ disposeObject(item3D);
1602
+ delete planData.sceneGraph.layers[layerId].items[itemID];
1603
+ delete planData.sceneGraph.LODs[itemID];
1604
+ item3D = null;
1605
+ updateBoundingBox(planData, true);
1606
+ }
1607
+ planData.sceneGraph.busyResources.layers[layerId].items[itemID] = false;
1608
+ }
1609
+ function removeItemWithoutItem(planData, layerId, itemID) {
1610
+ if (planData.sceneGraph.busyResources.layers[layerId].items[itemID]) {
1611
+ setTimeout(function () {
1612
+ return removeItemWithoutItem(planData, layerId, itemID);
1613
+ }, 100);
1614
+ return;
1615
+ }
1616
+ planData.sceneGraph.busyResources.layers[layerId].items[itemID] = true;
1617
+ var layer = planData.sceneData.getIn(['layers', layerId]);
1618
+ var item = layer.getIn(['items', itemID]);
1619
+ deleteCountertop(planData.sceneGraph.layers[layerId].countertops, item, planData, layer);
1620
+ var item3D = planData.sceneGraph.layers[layerId].items[itemID];
1621
+ if (item3D) {
1622
+ planData.plan.remove(item3D);
1623
+ disposeObject(item3D);
1624
+ item3D = null;
1625
+ updateBoundingBox(planData);
1626
+ delete planData.sceneGraph.layers[layerId].items[itemID];
1627
+ delete planData.sceneGraph.LODs[itemID];
1628
+ }
1629
+ planData.sceneGraph.busyResources.layers[layerId].items[itemID] = false;
1630
+ }
1631
+
1632
+ //TODO generate an area's replace if vertex has been changed
1633
+ function addObject(modifiedPath, layer, planData, actions, sceneData, oldSceneData, catalog, mode, toolObj) {
1634
+ if (modifiedPath.length >= 5) {
1635
+ var addPromise = null,
1636
+ addAction = null;
1637
+ switch (modifiedPath[3]) {
1638
+ case 'lines':
1639
+ if (modifiedPath[5] === 'holes' && scene_mode !== 'MODE_DRAWING_HOLE_3D' && scene_mode !== 'MODE_DRAGGING_HOLE_3D') {
1640
+ removeLine(planData, layer.id, modifiedPath[4]);
1641
+ }
1642
+ if (scene_mode !== 'MODE_DRAWING_HOLE_3D' && scene_mode !== 'MODE_DRAGGING_HOLE_3D') {
1643
+ addPromise = addLine;
1644
+ }
1645
+ addAction = actions.linesActions;
1646
+ break;
1647
+ case 'areas':
1648
+ addPromise = addArea;
1649
+ addAction = actions.areaActions;
1650
+ break;
1651
+ case 'items':
1652
+ addPromise = addItem;
1653
+ addAction = actions.itemsActions;
1654
+ break;
1655
+ case 'holes':
1656
+ addPromise = addHole;
1657
+ addAction = actions.holesActions;
1658
+ break;
1659
+ }
1660
+ if (addPromise) {
1661
+ // if( addPromise(sceneData, planData, layer, modifiedPath[4], catalog, addAction) === undefined ) {
1662
+ // return;
1663
+ // }
1664
+ addPromise(sceneData, planData, layer, modifiedPath[4], catalog, addAction, mode, toolObj).then(function () {
1665
+ return updateBoundingBox(planData);
1666
+ });
1667
+ }
1668
+ }
1669
+ }
1670
+ function addHole(sceneData, planData, layer, holeID, catalog, holesActions, mode) {
1671
+ var toolObj = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
1672
+ var holeData = layer.getIn(['holes', holeID]);
1673
+
1674
+ // Create the hole object
1675
+ return holeData === undefined ? '' : catalog.getElement(holeData.type).render3D(holeData, layer, sceneData).then(function (object) {
1676
+ if (object instanceof Three.LOD) {
1677
+ planData.sceneGraph.LODs[holeID] = object;
1678
+ }
1679
+ object.children.forEach(function (item) {
1680
+ var name = item.name;
1681
+ item.castShadow = true;
1682
+ var texture;
1683
+ if (name.includes('_wood')) {
1684
+ texture = loadTexture('/assets/img/texture/white1px.jpg');
1685
+ } else if (name.includes('_glass')) {
1686
+ var material = new Three.MeshPhysicalMaterial({
1687
+ roughness: 0.5,
1688
+ transmission: 1,
1689
+ thickness: 0.5,
1690
+ // Add refraction!
1691
+ transparency: 0.6
1692
+ });
1693
+ item.material = material;
1694
+ return item;
1695
+ } else if (name.includes('_steel')) {
1696
+ texture = loadTexture('/assets/img/texture/steel.jpg');
1697
+ } else if (name.includes('_glass')) {
1698
+ var _material2 = new Three.MeshPhysicalMaterial({
1699
+ roughness: 0.5,
1700
+ transmission: 1,
1701
+ thickness: 0.5,
1702
+ // Add refraction!
1703
+ transparency: 0.6
1704
+ });
1705
+ item.material = _material2;
1706
+ return item;
1707
+ }
1708
+ });
1709
+ if (holeData.selected) {
1710
+ // if object is drawing in 3d mode and selected
1711
+ if (holeData.type === 'FrameLess Doorway') {
1712
+ var x, y, z;
1713
+ x = holeData.getIn(['properties', 'width', 'length']) || 0;
1714
+ y = holeData.getIn(['properties', 'height', 'length']) || 0;
1715
+ z = holeData.getIn(['properties', 'thickness', 'length']) || 0;
1716
+ var moveBox = new Three.BoxGeometry(x, y, z);
1717
+ var mBox = new Three.Mesh(moveBox, new Three.MeshBasicMaterial({
1718
+ color: 0x99c3fb,
1719
+ side: Three.DoubleSide,
1720
+ transparent: true,
1721
+ opacity: 0.4
1722
+ }));
1723
+ mBox.name = 'FrameLessDoormBox';
1724
+ mBox.renderOrder = 1;
1725
+ if (mBox !== undefined) {
1726
+ object.add(mBox);
1727
+ }
1728
+ } else {
1729
+ var _boundingBox = GeomUtils.baseBox3FromObject(object);
1730
+ if (_boundingBox === undefined) return;
1731
+ var max = _boundingBox.max;
1732
+ if (!Number.isFinite(max.x)) return;
1733
+ var transGroup = new Three.Group();
1734
+ var extrudeSettings = {
1735
+ depth: 1,
1736
+ bevelEnabled: true,
1737
+ bevelSegments: 2,
1738
+ steps: 2,
1739
+ bevelSize: 1,
1740
+ bevelThickness: 1
1741
+ };
1742
+ var triangleShape = new Three.Shape().moveTo(max.x, 15) // A
1743
+ .lineTo(max.x + 6, 15) // B
1744
+ .lineTo(max.x + 6, 30) // C
1745
+ .lineTo(max.x + 16, 0) // D
1746
+ .lineTo(max.x + 6, -29) // E
1747
+ .lineTo(max.x + 6, -15) // F
1748
+ .lineTo(max.x, -15) // G
1749
+ .lineTo(max.x, 15); // close path
1750
+ var transHole_Right = GeomUtils.addShape(triangleShape, extrudeSettings, scene_mode !== 'MODE_DRAGGING_HOLE_3D' ? 0x000000 : 0x99c3fb, 0, 0, 0, 0, 0, 0, 1);
1751
+ transHole_Right.name = 'transHole_Right';
1752
+ transGroup.add(transHole_Right);
1753
+ triangleShape = new Three.Shape().moveTo(-max.x, 15) // A
1754
+ .lineTo(-(max.x + 6), 15) // B
1755
+ .lineTo(-(max.x + 6), 30) // C
1756
+ .lineTo(-(max.x + 16), 0) // D
1757
+ .lineTo(-(max.x + 6), -29) // E
1758
+ .lineTo(-(max.x + 6), -15) // F
1759
+ .lineTo(-max.x, -15) // G
1760
+ .lineTo(-max.x, 15); // close path
1761
+ var transHole_Left = GeomUtils.addShape(triangleShape, extrudeSettings, scene_mode !== 'MODE_DRAGGING_HOLE_3D' ? 0x000000 : 0x99c3fb, 0, 0, 0, 0, 0, 0, 1);
1762
+ transHole_Left.name = 'transHole_Left';
1763
+ transGroup.add(transHole_Left);
1764
+ transGroup.scale.set(1 / object.scale.x, 1 / object.scale.y, 1 / object.scale.z);
1765
+ object.add(transGroup);
1766
+ }
1767
+ }
1768
+ var pivot = new Three.Object3D();
1769
+ pivot.name = 'pivot';
1770
+ if (isElevationView(mode)) {
1771
+ var lineID = holeData.getIn(['line']);
1772
+ if (planData.sceneGraph.layers['layer-1'].lines[lineID].visible) {
1773
+ pivot.visible = true;
1774
+ } else {
1775
+ pivot.visible = false;
1776
+ }
1777
+ object.traverse(function (obj) {
1778
+ replaceMeshesWithLineSegments(obj);
1779
+ });
1780
+ }
1781
+ pivot.add(object);
1782
+ var line = layer.getIn(['lines', holeData.line]);
1783
+
1784
+ // First of all I need to find the vertices of this line
1785
+ var vertex0 = layer.vertices.get(line.vertices.get(0));
1786
+ var vertex1 = layer.vertices.get(line.vertices.get(1));
1787
+ var offset = holeData.offset;
1788
+ if (vertex0.x > vertex1.x) {
1789
+ var tmp = vertex0;
1790
+ vertex0 = vertex1;
1791
+ vertex1 = tmp;
1792
+ offset = 1 - offset;
1793
+ }
1794
+ var distance = Math.sqrt(Math.pow(vertex0.x - vertex1.x, 2) + Math.pow(vertex0.y - vertex1.y, 2));
1795
+ var alpha = Math.asin((vertex1.y - vertex0.y) / distance);
1796
+ var boundingBox = new Three.Box3().setFromObject(pivot);
1797
+ var center = [(boundingBox.max.x - boundingBox.min.x) / 2 + boundingBox.min.x, (boundingBox.max.y - boundingBox.min.y) / 2 + boundingBox.min.y, (boundingBox.max.z - boundingBox.min.z) / 2 + boundingBox.min.z];
1798
+ var holeAltitude = holeData.properties.getIn(['altitude', 'length']);
1799
+ var holeHeight = holeData.properties.getIn(['height', 'length']);
1800
+ pivot.rotation.y = alpha;
1801
+ pivot.position.x = vertex0.x + distance * offset * Math.cos(alpha) - center[0] * Math.cos(alpha) - center[2] * Math.sin(alpha);
1802
+ pivot.position.y = holeAltitude + holeHeight / 2 - center[1] + layer.altitude;
1803
+ pivot.position.z = -vertex0.y - distance * offset * Math.sin(alpha) - center[2] * Math.cos(alpha) + center[0] * Math.sin(alpha);
1804
+ pivot.userData.type = 'hole';
1805
+ pivot.userData.layerId = layer.id;
1806
+ pivot.userData.holeId = holeData.id;
1807
+
1808
+ // if holeId is existing, remove it first
1809
+ var childLen = planData.plan.children.length;
1810
+ var children = [];
1811
+ for (var i = 0; i < childLen; i++) {
1812
+ if (planData.plan.children[i].userData.holeId != holeData.id) children.push(planData.plan.children[i]);
1813
+ }
1814
+ planData.plan.children = children;
1815
+ planData.plan.add(pivot);
1816
+ planData.sceneGraph.layers[layer.id].holes[holeData.id] = pivot;
1817
+ applyInteract(pivot, function () {
1818
+ if (document.getElementById('setting_dialog')) {
1819
+ document.getElementById('setting_dialog').style.display = 'none';
1820
+ }
1821
+ return holesActions.selectHole(layer.id, holeData.id);
1822
+ });
1823
+ var opacity = layer.opacity;
1824
+ if (holeData.selected) {
1825
+ opacity = 1;
1826
+ }
1827
+ applyOpacity(pivot, opacity);
1828
+ });
1829
+ }
1830
+ function updateHole(sceneData, oldSceneData, planData, layer, holeID, differences, catalog, holesActions, selfDestroy, selfBuild) {
1831
+ var hole = layer.getIn(['holes', holeID]);
1832
+ var oldHole = oldSceneData.getIn(['layers', layer.id, 'holes', holeID]);
1833
+ var mesh = planData.sceneGraph.layers[layer.id].holes[holeID];
1834
+ if (!mesh) return null;
1835
+ return catalog.getElement(hole.type).updateRender3D(hole, layer, sceneData, mesh, oldHole, differences, selfDestroy, selfBuild);
1836
+ }
1837
+ function addLine(sceneData, planData, layer, lineID, catalog, linesActions) {
1838
+ var mode = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
1839
+ var toolObj = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
1840
+ if (planData.sceneGraph.busyResources.layers[layer.id].lines[lineID]) {
1841
+ setTimeout(function () {
1842
+ return addLine(sceneData, planData, layer, lineID, catalog, linesActions, mode);
1843
+ }, 100);
1844
+ return;
1845
+ }
1846
+ planData.sceneGraph.busyResources.layers[layer.id].lines[lineID] = true;
1847
+ var line = layer.getIn(['lines', lineID]);
1848
+ line.userData.stateMode = scene_mode;
1849
+
1850
+ // First of all I need to find the vertices of this line
1851
+ var vertex0 = layer.vertices.get(line.vertices.get(0));
1852
+ var vertex1 = layer.vertices.get(line.vertices.get(1));
1853
+ if (vertex0.x > vertex1.x) {
1854
+ var tmp = vertex0;
1855
+ vertex0 = vertex1;
1856
+ vertex1 = tmp;
1857
+ }
1858
+ return catalog.getElement(line.type).render3D(line, layer, sceneData, mode).then(function (line3D) {
1859
+ if (line3D === null) {
1860
+ return;
1861
+ }
1862
+ if (line3D instanceof Three.LOD) {
1863
+ planData.sceneGraph.LODs[line.id] = line3D;
1864
+ }
1865
+ var pivot = new Three.Object3D();
1866
+ pivot.name = 'pivot';
1867
+ pivot.add(line3D);
1868
+ pivot.position.x = (vertex0.x + vertex1.x) / 2;
1869
+ pivot.position.y = layer.altitude;
1870
+ pivot.position.z = -(vertex0.y + vertex1.y) / 2;
1871
+ pivot.userData.type = 'line';
1872
+
1873
+ // In elevation view, show(visible = true) just selected wall pivot. If not, hidden(visible = false)
1874
+ if (isElevationView(mode)) {
1875
+ var lineVisible;
1876
+ if (line.selected) {
1877
+ pivot.traverse(function (obj) {
1878
+ replaceMeshesWithLineSegments(obj);
1879
+ });
1880
+ lineVisible = true;
1881
+ } else {
1882
+ lineVisible = false;
1883
+ }
1884
+ pivot.visible = lineVisible;
1885
+ }
1886
+ pivot.userData.layerId = layer.id;
1887
+ pivot.userData.lineId = lineID;
1888
+ planData.plan.add(pivot);
1889
+ planData.sceneGraph.layers[layer.id].lines[lineID] = pivot;
1890
+ applyInteract(pivot, function () {
1891
+ if (document.getElementById('setting_dialog')) {
1892
+ document.getElementById('setting_dialog').style.display = 'none';
1893
+ }
1894
+ return linesActions.selectLine(layer.id, line.id);
1895
+ });
1896
+ var opacity = layer.opacity;
1897
+ if (line.selected) {
1898
+ opacity = 1;
1899
+ }
1900
+ applyOpacity(pivot, opacity);
1901
+ planData.sceneGraph.busyResources.layers[layer.id].lines[lineID] = false;
1902
+ });
1903
+ }
1904
+ function updateLine(sceneData, oldSceneData, planData, layer, lineID, differences, catalog, linesActions, selfDestroy, selfBuild) {
1905
+ var line = layer.getIn(['lines', lineID]);
1906
+ var oldLine = oldSceneData.getIn(['layers', layer.id, 'lines', lineID]);
1907
+ var mesh = planData.sceneGraph.layers[layer.id].lines[lineID];
1908
+ if (!mesh) return null;
1909
+ return catalog.getElement(line.type).updateRender3D(line, layer, sceneData, mesh, oldLine, differences, selfDestroy, selfBuild);
1910
+ }
1911
+ function addArea(sceneData, planData, layer, areaID, catalog, areaActions, mode) {
1912
+ var toolObj = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
1913
+ if (planData.sceneGraph.busyResources.layers[layer.id].areas[areaID]) {
1914
+ setTimeout(function () {
1915
+ return addArea(sceneData, planData, layer, areaID, catalog, areaActions, mode);
1916
+ }, 100);
1917
+ return;
1918
+ }
1919
+ planData.sceneGraph.busyResources.layers[layer.id].areas[areaID] = true;
1920
+ var area = layer.getIn(['areas', areaID]);
1921
+ var interactFunction = function interactFunction() {
1922
+ return areaActions.selectArea(layer.id, areaID);
1923
+ };
1924
+ return catalog.getElement(area.type).render3D(area, layer, sceneData).then(function (area3D) {
1925
+ if (area3D instanceof Three.LOD) {
1926
+ planData.sceneGraph.LODs[areaID] = area3D;
1927
+ }
1928
+ var pivot = new Three.Object3D();
1929
+ var floorSupport = area3D.userData.floorSupport;
1930
+ floorSupport.onBeforeRender = function (renderer, scene, camera, geometry, material, group) {
1931
+ var floorMesh = this.parent.getObjectByName('floor');
1932
+ if (geometry.attributes.normal === undefined) return floorMesh.visible = false;
1933
+ geometry.computeVertexNormals();
1934
+ var normals = geometry.attributes.normal.array;
1935
+ var pos = new Three.Vector4(0, 0, 0, 1);
1936
+ pos = pos.applyMatrix4(this.matrixWorld);
1937
+ pos = pos.applyMatrix4(camera.matrixWorldInverse);
1938
+ var normal = new Three.Vector4(normals[0], normals[1], normals[2], 0);
1939
+ normal = normal.applyMatrix4(this.matrixWorld);
1940
+ normal = normal.applyMatrix4(camera.matrixWorldInverse);
1941
+ if (floorMesh) {
1942
+ if (normal.dot(pos) <= 0) {
1943
+ floorMesh.visible = true;
1944
+ } else {
1945
+ floorMesh.visible = false;
1946
+ }
1947
+ }
1948
+ };
1949
+ var ceil = area3D.userData.floorSupport.clone();
1950
+ var ceilMaterial = new Three.MeshStandardMaterial({
1951
+ color: 0xdfdfdf,
1952
+ side: Three.BackSide,
1953
+ roughness: 0.3,
1954
+ metalness: 0.4
1955
+ });
1956
+ ceil.name = 'ceil';
1957
+ ceil.material = ceilMaterial;
1958
+ var vertices = [];
1959
+ var lines = [];
1960
+ var height = 100;
1961
+ area.vertices.forEach(function (data) {
1962
+ vertices.push(data);
1963
+ });
1964
+ layer.lines.forEach(function (data) {
1965
+ lines.push(data);
1966
+ });
1967
+ var _loop3 = function _loop3() {
1968
+ var data = lines[i];
1969
+ var realVec = [];
1970
+ data.vertices.forEach(function (vec) {
1971
+ realVec.push(vec);
1972
+ });
1973
+ if (vertices.includes(realVec[0]) && vertices.includes(realVec[1])) {
1974
+ height = convert(layer.ceilHeight).from(layer.unit).to(UNIT_CENTIMETER);
1975
+ // height = data.properties.getIn(["height", "length"]);
1976
+ return 1; // break
1977
+ }
1978
+ };
1979
+ for (var i = 0; i < lines.length; i++) {
1980
+ if (_loop3()) break;
1981
+ }
1982
+ ceil.translateZ(convert(layer.ceilHeight).from(layer.unit).to(UNIT_CENTIMETER));
1983
+ pivot.name = 'pivot';
1984
+ pivot.add(area3D);
1985
+ pivot.add(area3D.userData.floorSupport);
1986
+ pivot.add(ceil);
1987
+ pivot.position.y = layer.altitude;
1988
+
1989
+ // if elevation view, show just wall - not show floor and ceil
1990
+ if (isElevationView(mode)) pivot.visible = false;
1991
+ planData.plan.add(pivot);
1992
+ planData.sceneGraph.layers[layer.id].areas[areaID] = pivot;
1993
+ if (document.getElementById('setting_dialog')) {
1994
+ document.getElementById('setting_dialog').style.display = 'none';
1995
+ }
1996
+ applyInteract(pivot, interactFunction);
1997
+ var opacity = layer.opacity;
1998
+ if (area.selected) {
1999
+ opacity = 1;
2000
+ }
2001
+ applyOpacity(pivot, opacity);
2002
+ planData.sceneGraph.busyResources.layers[layer.id].areas[areaID] = false;
2003
+ });
2004
+ }
2005
+ function updateArea(sceneData, oldSceneData, planData, layer, areaID, differences, catalog, areaActions, selfDestroy, selfBuild) {
2006
+ var area = layer.getIn(['areas', areaID]);
2007
+ var oldArea = oldSceneData.getIn(['layers', layer.id, 'areas', areaID]);
2008
+ var mesh = planData.sceneGraph.layers[layer.id].areas[areaID];
2009
+ if (!mesh) return null;
2010
+ return catalog.getElement(area.type).updateRender3D(area, layer, sceneData, mesh, oldArea, differences, selfDestroy, selfBuild);
2011
+ }
2012
+ function addItem(sceneData, planData, layer, itemID, catalog, itemsActions) {
2013
+ var mode = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
2014
+ var toolObj = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
2015
+ var rItem = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : null;
2016
+ var bAddMolding = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : true;
2017
+ if (planData.sceneGraph.busyResources.layers[layer.id].items[itemID]) {
2018
+ setTimeout(function () {
2019
+ return addItem(sceneData, planData, layer, itemID, catalog, itemsActions, mode, toolObj, rItem, bAddMolding);
2020
+ }, 100);
2021
+ return;
2022
+ }
2023
+ var item = layer.getIn(['items', itemID]);
2024
+ if (item.doorStyle === null) {
2025
+ console.log(item.name + 's doorStyle is null!');
2026
+ return;
2027
+ }
2028
+ if (!sceneData.loadFlag && scene_mode == MODE_DRAWING_ITEM_3D) {
2029
+ itemsActions.toggleLoadingCabinet();
2030
+ }
2031
+ var catalogElement = catalog.getElement(item.type);
2032
+ if (!catalogElement) catalogElement = catalog.getElement(returnReplaceableDeepSearchType(item.type));
2033
+ if (!catalogElement) return false;
2034
+ return catalogElement.render3D(item, layer, sceneData, mode).then(function (item3D) {
2035
+ var _item$properties$getI, _item$properties$getI2, _item$properties$getI3;
2036
+ if (item3D instanceof Three.LOD) {
2037
+ planData.sceneGraph.LODs[itemID] = item3D;
2038
+ }
2039
+ if (rItem !== null) {
2040
+ planData.plan.remove(rItem);
2041
+ disposeObject(rItem);
2042
+ rItem = null;
2043
+ }
2044
+ var pivot = new Three.Object3D();
2045
+ pivot.name = 'pivot';
2046
+ pivot.add(item3D);
2047
+ if (pivot) {
2048
+ var mBoxColor = 0x99c3fb;
2049
+ var _item = item.toJS();
2050
+ if (isWarningCabinet(_item)) {
2051
+ mBoxColor = 'rgba(232,187,47,1)';
2052
+ } else {
2053
+ pivot.children[0].children.forEach(function (pivotElement) {
2054
+ pivotElement.visible = false;
2055
+ });
2056
+ }
2057
+ var mBox = GeomUtils.makeMBoxfromObject(pivot, mBoxColor);
2058
+ var warningObj = createWarningObject();
2059
+ warningObj.position.set(0, item.properties.get('height').get('length') / 3, 0);
2060
+ if (mBox) {
2061
+ mBox.add(warningObj);
2062
+ pivot.add(mBox);
2063
+ }
2064
+ }
2065
+
2066
+ // if (item.selected) {
2067
+ // let tranformControl = item3D.children[item3D.children.length - 1];
2068
+ // transformBox =
2069
+ // tranformControl.children[tranformControl.children.length - 1];
2070
+ // }
2071
+
2072
+ pivot.rotation.y = item.rotation * Math.PI / 180 + Math.PI;
2073
+ // pivot.rotation.y = item.rotation;
2074
+ pivot.position.x = item.x;
2075
+ pivot.position.y = layer.altitude;
2076
+ pivot.position.z = -item.y;
2077
+ applyInteract(item3D, function () {
2078
+ // closes the setting dialog
2079
+ if (document.getElementById('setting_dialog')) {
2080
+ document.getElementById('setting_dialog').style.display = 'none';
2081
+ }
2082
+ return itemsActions.selectItem(layer.id, item.id);
2083
+ });
2084
+ var opacity = layer.opacity;
2085
+ if (item.selected) {
2086
+ opacity = 1;
2087
+ fVLine = [];
2088
+ var TransformGizmo = item3D.children[item3D.children.length - 1];
2089
+ TransformGizmo.children.forEach(function (child) {
2090
+ if (child.type === 'Line' && child.geometry.attributes !== undefined) fVLine.push(child);
2091
+ });
2092
+ setTimeout(function () {
2093
+ getDistances(layer, item);
2094
+ }, 50);
2095
+ }
2096
+ applyOpacity(pivot, opacity);
2097
+ pivot.userData.type = 'item';
2098
+ pivot.userData.layerId = layer.id;
2099
+ pivot.userData.itemId = item.id;
2100
+
2101
+ /**
2102
+ *
2103
+ * @param {array} itemRect Array of item's 4 side lines
2104
+ * @returns {boolean} true (if item is snapped into wall) or false (if item is not snapped into wall)
2105
+ */
2106
+ //////////////////
2107
+ ///// wall ///////
2108
+ // 3 ***** 2
2109
+ // * *
2110
+ // * item *
2111
+ // * *
2112
+ // 0 ***** 1
2113
+
2114
+ var getItemVisible = function getItemVisible(itemRect) {
2115
+ var selectedLine = layer.lines.get(layer.selected.lines.toJS()[0]);
2116
+ var itemVisible = false;
2117
+ var vertex0 = layer.vertices.get(selectedLine.vertices.get(0));
2118
+ var vertex1 = layer.vertices.get(selectedLine.vertices.get(1));
2119
+ var l0 = {
2120
+ x: vertex0.x,
2121
+ y: vertex0.y
2122
+ };
2123
+ var l1 = {
2124
+ x: vertex1.x,
2125
+ y: vertex1.y
2126
+ };
2127
+ var r0 = itemRect.rect[0];
2128
+ var r1 = itemRect.rect[1];
2129
+ var r2 = itemRect.rect[2];
2130
+ var r3 = itemRect.rect[3];
2131
+
2132
+ // it doesn't need consider distance between item's line01 (frontside - it has door) and wall
2133
+ var delta12 = GeometryUtils.distancePointFromLineSegment(l0, l1, (r1.x + r2.x) / 2, (r1.y + r2.y) / 2); // distance between item's line12 and wall
2134
+ var delta23 = GeometryUtils.distancePointFromLineSegment(l0, l1, (r2.x + r3.x) / 2, (r2.y + r3.y) / 2); // distance between item's line23 and wall
2135
+ var delta30 = GeometryUtils.distancePointFromLineSegment(l0, l1, (r3.x + r0.x) / 2, (r3.y + r0.y) / 2); // distance between item's line30 and wall
2136
+
2137
+ if (delta12 < DISTANCE_EPSILON || delta23 < DISTANCE_EPSILON || delta30 < DISTANCE_EPSILON) {
2138
+ itemVisible = true;
2139
+ }
2140
+ return itemVisible;
2141
+ };
2142
+ var val = {
2143
+ pos: {
2144
+ x: item.x,
2145
+ y: item.y
2146
+ },
2147
+ rotRad: item.rotation / 180 * Math.PI
2148
+ };
2149
+ var catid = item.type;
2150
+ var cat = catalog.elements[catid];
2151
+ if (!cat) cat = catalog.elements[returnReplaceableDeepSearchType(catid)];
2152
+ var width = convert(item.properties.getIn(['width', '_length'])).from((_item$properties$getI = item.properties.getIn(['width', '_unit'])) !== null && _item$properties$getI !== void 0 ? _item$properties$getI : 'in').to(sceneData.unit);
2153
+ var height = convert(item.properties.getIn(['height', '_length'])).from((_item$properties$getI2 = item.properties.getIn(['height', '_unit'])) !== null && _item$properties$getI2 !== void 0 ? _item$properties$getI2 : 'in').to(sceneData.unit);
2154
+ var depth = convert(item.properties.getIn(['depth', '_length'])).from((_item$properties$getI3 = item.properties.getIn(['depth', '_unit'])) !== null && _item$properties$getI3 !== void 0 ? _item$properties$getI3 : 'in').to(sceneData.unit);
2155
+ val.size = {
2156
+ width: width,
2157
+ height: height,
2158
+ depth: depth
2159
+ };
2160
+ val.layoutpos = item === null || item === void 0 ? void 0 : item.layoutpos;
2161
+ val.is_corner = item === null || item === void 0 ? void 0 : item.is_corner;
2162
+ val.item = item;
2163
+ var calcrect = GeometryUtils.getCalcRectFromItem3D(val);
2164
+
2165
+ // In elevation view, determin if item show or not
2166
+ if (isElevationView(mode)) pivot.visible = getItemVisible(calcrect);
2167
+ planData.plan.add(pivot);
2168
+ planData.sceneGraph.layers[layer.id].items[item.id] = pivot;
2169
+ //In a 3D view, merge each couterTop of equal height into a single conuterTop.
2170
+ if (!isElevationView(mode)) {
2171
+ addCountertop(planData.sceneGraph.layers[layer.id].countertops, item, planData, layer);
2172
+ }
2173
+ if (bAddMolding && item.category === 'cabinet' && (isElevationView(mode) && getItemVisible(calcrect) || !isElevationView(mode))) {
2174
+ planData.sceneGraph.layers[layer.id].moldingGroups = addMolding(planData.sceneGraph.layers[layer.id].moldingGroups, item, planData, layer, itemsActions, mode) || planData.sceneGraph.layers[layer.id].moldingGroups;
2175
+ }
2176
+ if (pivot) {
2177
+ // update the tool object's position to selected object's position
2178
+ var selectedItem = planData.sceneGraph.layers[sceneData.selectedLayer].items[itemID];
2179
+ var itemPos = selectedItem.position.clone();
2180
+ if (!isEmpty(toolObj)) {
2181
+ toolObj.position.set(planData.plan.position.x + itemPos.x, selectedItem.category === 'lighting' ? -planData.plan.position.y - selectedItem.properties.get('height').get('length') : planData.plan.position.y + selectedItem.children[0].position.y, planData.plan.position.z + itemPos.z);
2182
+ }
2183
+ pivot.children[0].children.forEach(function (pivotElement) {
2184
+ pivotElement.visible = true;
2185
+ });
2186
+ if (pivot.children.length > 1) {
2187
+ var _item4 = item.toJS();
2188
+ if (_item4.category === ITEM_TYPE.CABINET) {
2189
+ if (!isWarningCabinet(item)) {
2190
+ pivot.children.pop();
2191
+ }
2192
+ } else {
2193
+ pivot.children.pop();
2194
+ }
2195
+ }
2196
+ }
2197
+ applyInteract(pivot, function () {
2198
+ if (document.getElementById('setting_dialog')) {
2199
+ document.getElementById('setting_dialog').style.display = 'none';
2200
+ }
2201
+ return itemsActions.selectItem(layer.id, item.id);
2202
+ });
2203
+ setTimeout(function () {
2204
+ return getDistances(layer, item);
2205
+ }, 100);
2206
+ if (!sceneData.loadFlag && scene_mode == MODE_DRAWING_ITEM_3D) {
2207
+ itemsActions.endLoading();
2208
+ itemsActions.toggleLoadingCabinet();
2209
+ }
2210
+ });
2211
+ }
2212
+ function updateItem(sceneData, oldSceneData, planData, layer, itemID, differences, catalog, itemsActions, selfDestroy, selfBuild) {
2213
+ var item = layer.getIn(['items', itemID]);
2214
+ var oldItem = oldSceneData.getIn(['layers', layer.id, 'items', itemID]);
2215
+ var mesh = planData.sceneGraph.layers[layer.id].items[itemID];
2216
+ if (!mesh) return null;
2217
+ return catalog.getElement(item.type).updateRender3D(item, layer, sceneData, mesh, oldItem, differences, selfDestroy, selfBuild);
2218
+ }
2219
+ function applyMirrorToItem3D(item3D, mirrored) {
2220
+ var _item3D$children, _object$children;
2221
+ var object = item3D === null || item3D === void 0 || (_item3D$children = item3D.children) === null || _item3D$children === void 0 ? void 0 : _item3D$children[0];
2222
+ if (!object || !object.scale) return;
2223
+ var shouldMirror = mirrored === true;
2224
+ var isCurrentlyMirrored = object.scale.x < 0;
2225
+ if (shouldMirror !== isCurrentlyMirrored) object.scale.x *= -1;
2226
+ var transformGizmo = (_object$children = object.children) === null || _object$children === void 0 ? void 0 : _object$children.find(function (child) {
2227
+ return child.name === 'TransformGizmo';
2228
+ });
2229
+ if (transformGizmo !== null && transformGizmo !== void 0 && transformGizmo.scale) {
2230
+ var sign = object.scale.x < 0 ? -1 : 1;
2231
+ transformGizmo.scale.x = sign * Math.abs(transformGizmo.scale.x);
2232
+ }
2233
+ object.userData.mirrored = shouldMirror;
2234
+ }
2235
+
2236
+ // Apply interact function to children of an Object3D
2237
+ function applyInteract(object, interactFunction) {
2238
+ if (document.getElementById('setting_dialog')) {
2239
+ document.getElementById('setting_dialog').style.display = 'none';
2240
+ }
2241
+ object.traverse(function (child) {
2242
+ if (child instanceof Three.Mesh) {
2243
+ child.interact = interactFunction;
2244
+ }
2245
+ });
2246
+ }
2247
+
2248
+ // Apply opacity to children of an Object3D
2249
+ function applyOpacity(object, opacity) {
2250
+ object.traverse(function (child) {
2251
+ if (child instanceof Three.Mesh) {
2252
+ if (child.material && !Array.isArray(child.material)) {
2253
+ // child.material.materials.forEach(materialChild => {
2254
+ // materialChild.transparent = true;
2255
+ // if (materialChild.maxOpacity) {
2256
+ // materialChild.opacity = Math.min(materialChild.maxOpacity, opacity);
2257
+ // } else if (materialChild.opacity && materialChild.opacity > opacity) {
2258
+ // materialChild.maxOpacity = materialChild.opacity;
2259
+ // materialChild.opacity = opacity;
2260
+ // }
2261
+ // });
2262
+ } else if (child.material instanceof Array) {
2263
+ child.material.forEach(function (material) {
2264
+ material.transparent = true;
2265
+ if (material.maxOpacity) {
2266
+ material.opacity = Math.min(material.maxOpacity, opacity);
2267
+ } else if (material.opacity && material.opacity > opacity) {
2268
+ material.maxOpacity = material.opacity;
2269
+ material.opacity = opacity;
2270
+ }
2271
+ });
2272
+ } else {
2273
+ child.material.transparent = true;
2274
+ if (child.material.maxOpacity) {
2275
+ child.material.opacity = Math.min(child.material.maxOpacity, opacity);
2276
+ } else if (child.material.opacity && child.material.opacity > opacity) {
2277
+ child.material.maxOpacity = child.material.opacity;
2278
+ child.material.opacity = opacity;
2279
+ }
2280
+ }
2281
+ }
2282
+ });
2283
+ }
2284
+ function updateBoundingBox(planData) {
2285
+ var flag = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
2286
+ var mode = arguments.length > 2 ? arguments[2] : undefined;
2287
+ if (scene_mode == MODE_DRAWING_ITEM_3D) return;
2288
+ var newBoundingBox = new Three.Box3().setFromObject(planData.plan);
2289
+ if (isFinite(newBoundingBox.max.x) && isFinite(newBoundingBox.min.x) && isFinite(newBoundingBox.max.y) && isFinite(newBoundingBox.min.y) && isFinite(newBoundingBox.max.z) && isFinite(newBoundingBox.min.z)) {
2290
+ var newCenter = new Three.Vector3((newBoundingBox.max.x - newBoundingBox.min.x) / 2 + newBoundingBox.min.x, (newBoundingBox.max.y - newBoundingBox.min.y) / 2 + newBoundingBox.min.y, (newBoundingBox.max.z - newBoundingBox.min.z) / 2 + newBoundingBox.min.z);
2291
+ if (!flag) {
2292
+ planData.plan.position.sub(newCenter);
2293
+ planData.grid.position.sub(newCenter);
2294
+ if (isElevationView(mode)) {
2295
+ planData.cam.position.sub(newCenter);
2296
+ }
2297
+ }
2298
+ newBoundingBox.min.sub(newCenter);
2299
+ newBoundingBox.max.sub(newCenter);
2300
+ planData.boundingBox = newBoundingBox;
2301
+ }
2302
+ }
2303
+
2304
+ /**
2305
+ * Filter the array of diffs
2306
+ * @param diffArray
2307
+ * @param sceneData
2308
+ * @param oldSceneData
2309
+ * @returns {Array}
2310
+ */
2311
+ function filterDiffs(diffArray, sceneData, oldSceneData) {
2312
+ return minimizeRemoveDiffsWhenSwitchingLayers(minimizeChangePropertiesAfterSelectionsDiffs(minimizeChangePropertiesDiffs(diffArray, sceneData, oldSceneData), sceneData, oldSceneData), sceneData, oldSceneData);
2313
+ }
2314
+
2315
+ /**
2316
+ * Reduces the number of remove diffs when switching an hidden layer
2317
+ * @param diffArray the array of the diffs
2318
+ * @param sceneData
2319
+ * @param oldSceneData
2320
+ * @returns {Array}
2321
+ */
2322
+ function minimizeRemoveDiffsWhenSwitchingLayers(diffArray, sceneData, oldSceneData) {
2323
+ var foundDiff;
2324
+ var i;
2325
+ for (i = 0; i < diffArray.length && !foundDiff; i++) {
2326
+ if (diffArray[i].path[1] === 'selectedLayer') {
2327
+ foundDiff = diffArray[i];
2328
+ }
2329
+ }
2330
+ if (foundDiff) {
2331
+ if (!sceneData.getIn(['layers', oldSceneData.selectedLayer, 'visible'])) {
2332
+ return diffArray.filter(function (_ref6) {
2333
+ var op = _ref6.op,
2334
+ path = _ref6.path;
2335
+ return !(path[path.length - 1] === 'selected' && path[1] === 'layers' && path[2] === oldSceneData.selectedLayer) && !(op === 'remove' && path.indexOf(oldSceneData.selectedLayer) !== -1);
2336
+ });
2337
+ }
2338
+ }
2339
+ return diffArray;
2340
+ }
2341
+
2342
+ /**
2343
+ * Reduces the number of change properties diffs for selected elements
2344
+ * @param diffArray the array of the diffs
2345
+ * @param sceneData
2346
+ * @param oldSceneData
2347
+ * @returns {Array}
2348
+ */
2349
+ function minimizeChangePropertiesAfterSelectionsDiffs(diffArray, sceneData, oldSceneData) {
2350
+ var idsFound = {};
2351
+ diffArray.forEach(function (_ref7) {
2352
+ var path = _ref7.path;
2353
+ if (path[5] === 'selected') {
2354
+ idsFound[path[4]] = path[4];
2355
+ }
2356
+ });
2357
+ return diffArray.filter(function (_ref8) {
2358
+ var path = _ref8.path;
2359
+ if (path[5] === 'properties') {
2360
+ return idsFound[path[4]] ? false : true;
2361
+ }
2362
+ return true;
2363
+ });
2364
+ }
2365
+
2366
+ /**
2367
+ * Reduces the number of change properties diffs
2368
+ * @param diffArray the array of the diffs
2369
+ * @param sceneData
2370
+ * @param oldSceneData
2371
+ * @returns {Array}
2372
+ */
2373
+ function minimizeChangePropertiesDiffs(diffArray, sceneData, oldSceneData) {
2374
+ var idsFound = {};
2375
+ return diffArray.filter(function (_ref9) {
2376
+ var path = _ref9.path;
2377
+ if (path[5] === 'properties') {
2378
+ return idsFound[path[4]] ? false : idsFound[path[4]] = true;
2379
+ } else if (path[5] === 'misc') {
2380
+ // Remove misc changes
2381
+ return false;
2382
+ }
2383
+ return true;
2384
+ });
2385
+ }
2386
+
2387
+ // countertops:
2388
+ // o id:
2389
+ // o items: [itemid]
2390
+ // o ct3d: 3d object
2391
+ // o catid
2392
+ // o pos
2393
+ // o rotRad
2394
+ // o size
2395
+ function createCTFromItem(item, unit, catalog) {
2396
+ return createCTFromItems([item], unit, catalog);
2397
+ }
2398
+ function createCTFromItems(items, unit, catalog) {
2399
+ var item0 = items[0];
2400
+ var item1 = items[items.length - 1];
2401
+ var CTId = IDBroker.acquireID();
2402
+ var ct3d = null;
2403
+ var catid = item0.type;
2404
+ var pos = {
2405
+ x: (item0.x + item1.x) / 2,
2406
+ y: (item0.y + item1.y) / 2
2407
+ };
2408
+ var rotRad = item0.rotation / 180 * Math.PI;
2409
+ var cat = catalog.elements[catid];
2410
+ // let width = convert(item0.properties.getIn(['width', '_length'])).from('in').to('cm');
2411
+ // let depth = convert(item0.properties.getIn(['depth', '_length'])).from('in').to('cm');
2412
+ // let height = convert(item0.properties.getIn(['height', '_length'])).from('in').to('cm');
2413
+ var width = item0.properties.get('width').get('_length');
2414
+ var widthUnit = item0.properties.get('width').get('_unit') || 'cm';
2415
+ width = convert(width).from(widthUnit).to('cm');
2416
+ var depth = item0.properties.get('depth').get('_length');
2417
+ var depthUnit = item0.properties.get('depth').get('_unit') || 'cm';
2418
+ depth = convert(depth).from(depthUnit).to('cm');
2419
+ var height = item0.properties.get('height').get('_length');
2420
+ var heightUnit = item0.properties.get('height').get('_unit') || 'cm';
2421
+ height = convert(height).from(heightUnit).to('cm');
2422
+ var size = {
2423
+ width: width * items.length,
2424
+ depth: depth,
2425
+ height: height
2426
+ };
2427
+ return {
2428
+ id: CTId,
2429
+ items: items,
2430
+ ct3d: ct3d,
2431
+ catid: catid,
2432
+ pos: pos,
2433
+ rotRad: rotRad,
2434
+ size: size
2435
+ };
2436
+ }
2437
+ export function createMDFromItem(item, lines, molding) {
2438
+ var MDId = IDBroker.acquireID();
2439
+ var z = item.properties.get('altitude').get('_length');
2440
+ var zUnit = item.properties.get('altitude').get('_unit') || 'cm';
2441
+ z = convert(z).from(zUnit).to('cm');
2442
+ var height = item.properties.get('height').get('_length');
2443
+ var heightUnit = item.properties.get('height').get('_unit') || 'cm';
2444
+ height = convert(height).from(heightUnit).to('cm');
2445
+ switch (molding.location_type) {
2446
+ case TOP_MOLDING_LOCATION:
2447
+ z += height;
2448
+ break;
2449
+ case MIDDLE_MOLDING_LOCATION:
2450
+ z += height / 2;
2451
+ break;
2452
+ case BOTTOM_MOLDING_LOCATION:
2453
+ z += 0;
2454
+ break;
2455
+ default:
2456
+ break;
2457
+ }
2458
+ return {
2459
+ id: MDId,
2460
+ items: [item],
2461
+ meshes: [],
2462
+ pos: {
2463
+ x: 0,
2464
+ y: 0,
2465
+ z: z
2466
+ },
2467
+ size: {
2468
+ width: 0,
2469
+ depth: 0,
2470
+ height: 0
2471
+ },
2472
+ lines: lines,
2473
+ molding: molding,
2474
+ pointGroups: []
2475
+ };
2476
+ }
2477
+ function tryAdjacent(ct1, ct2) {
2478
+ if (ct1.catid.includes(APPLIANCE_CATEGORY_DISHWASHER) && ct1.catid.includes('BF')) {
2479
+ var temp = ct1;
2480
+ ct1 = ct2;
2481
+ ct2 = temp;
2482
+ }
2483
+ log('----tryAdjacent', ct1.id, ct2.id);
2484
+ if (!ct2.catid.includes(APPLIANCE_CATEGORY_DISHWASHER) && !ct2.catid.includes('BF') && ct1.catid != ct2.catid) return false;
2485
+ if (ct1.items[0].layoutpos === 'Vanity' || ct2.items[0].layoutpos === 'Vanity') return false;
2486
+ if (ct1.rotRad != ct2.rotRad) return false;
2487
+ log('ct1', ct1.pos.x, ct1.pos.y, ct1.size.width);
2488
+ log('ct2', ct2.pos.x, ct2.pos.y, ct2.size.width);
2489
+ var dist = GeometryUtils.verticesDistance(ct1.pos, ct2.pos);
2490
+ var totalwidth = ct1.size.width + ct2.size.width;
2491
+ log('epsilon', dist, totalwidth, Math.abs(2 * dist - totalwidth));
2492
+ if (Math.abs(2 * dist - totalwidth) / totalwidth > 1e-3) return false;
2493
+ log('----success');
2494
+ var newpos = {
2495
+ x: (ct1.pos.x * ct1.size.width + ct2.pos.x * ct2.size.width) / totalwidth,
2496
+ y: (ct1.pos.y * ct1.size.width + ct2.pos.y * ct2.size.width) / totalwidth
2497
+ };
2498
+ var newsize = {
2499
+ width: totalwidth,
2500
+ depth: ct1.size.depth,
2501
+ height: ct1.size.height
2502
+ };
2503
+ var CTId = IDBroker.acquireID();
2504
+ var items = GeometryUtils.compareVertices(ct1.pos, ct2.pos) > 0 ? [].concat(_toConsumableArray(ct1.items), _toConsumableArray(ct2.items)) : [].concat(_toConsumableArray(ct2.items), _toConsumableArray(ct1.items));
2505
+ var ct3d = null;
2506
+ var catid = ct1.catid;
2507
+ return {
2508
+ id: CTId,
2509
+ items: items,
2510
+ ct3d: ct3d,
2511
+ catid: catid,
2512
+ pos: newpos,
2513
+ rotRad: ct1.rotRad,
2514
+ size: newsize
2515
+ };
2516
+ }
2517
+ function isParallelLines(line1, line2) {
2518
+ var isParallel = false;
2519
+ if (Math.abs(line1[0].y - line1[1].y) <= EPSILON && Math.abs(line2[0].y - line2[1].y) <= EPSILON) isParallel = true;
2520
+ if (Math.abs(line1[0].x - line1[1].x) <= EPSILON && Math.abs(line2[0].x - line2[1].x) <= EPSILON) isParallel = true;
2521
+ if (Math.abs((line1[0].x - line1[1].x) / (line1[0].y - line1[1].y) - (line2[0].x - line2[1].x) / (line2[0].y - line2[1].y)) <= EPSILON) isParallel = true;
2522
+ if (isParallel) {
2523
+ return true;
2524
+ }
2525
+ return false;
2526
+ }
2527
+ export function tryAdjacentMD(md1, md2, molding) {
2528
+ log('----tryAdjacent', md1.id, md2.id);
2529
+ if (Math.abs(md1.pos.z - md2.pos.z) > EPSILON) return false;
2530
+ var id1 = md1.items[0].doorStyle.hasOwnProperty('id') ? md1.items[0].doorStyle.id : md1.items[0].doorStyle.toJS().id,
2531
+ id2 = md2.items[0].doorStyle.hasOwnProperty('id') ? md2.items[0].doorStyle.id : md2.items[0].doorStyle.toJS().id;
2532
+ if (id1 !== id2) return false;
2533
+ var newLines = md1.lines.concat(md2.lines);
2534
+ var isMerge = false;
2535
+ md1.lines.forEach(function (line1) {
2536
+ md2.lines.map(function (line2) {
2537
+ // filter removed lines
2538
+ if (newLines.findIndex(function (a) {
2539
+ return a[2] === line1[2];
2540
+ }) === -1 || newLines.findIndex(function (a) {
2541
+ return a[2] === line2[2];
2542
+ }) === -1) return false;
2543
+ // is parallel two lines
2544
+ if (isParallelLines(line1, line2)) {
2545
+ var disLine1 = GeometryUtils.verticesDistance(line1[0], line1[1]);
2546
+ var disLine2 = GeometryUtils.verticesDistance(line2[0], line2[1]);
2547
+ if (GeometryUtils.sameMDistances(GeometryUtils.verticesDistance(line2[0], line1[0]) + GeometryUtils.verticesDistance(line1[1], line2[1]), Math.abs(disLine2 - disLine1))) {
2548
+ newLines = newLines.filter(function (a) {
2549
+ return !(a[2] === line1[2] || a[2] === line2[2]);
2550
+ });
2551
+ if (!GeometryUtils.sameMPoints(line1[0], line2[0])) newLines.push([line1[0], line2[0], IDBroker.acquireID()]);
2552
+ if (!GeometryUtils.sameMPoints(line1[1], line2[1])) newLines.push([line1[1], line2[1], IDBroker.acquireID()]);
2553
+ isMerge = true;
2554
+ return false;
2555
+ }
2556
+ if (GeometryUtils.sameMDistances(GeometryUtils.verticesDistance(line2[0], line1[1]) + GeometryUtils.verticesDistance(line1[0], line2[1]), Math.abs(disLine2 - disLine1))) {
2557
+ newLines = newLines.filter(function (a) {
2558
+ return !(a[2] === line1[2] || a[2] === line2[2]);
2559
+ });
2560
+ if (!GeometryUtils.sameMPoints(line1[1], line2[0])) newLines.push([line1[1], line2[0], IDBroker.acquireID()]);
2561
+ if (!GeometryUtils.sameMPoints(line1[0], line2[1])) newLines.push([line1[0], line2[1], IDBroker.acquireID()]);
2562
+ isMerge = true;
2563
+ return false;
2564
+ }
2565
+ var samePointNum = -1,
2566
+ i = 0;
2567
+ while (i < 4 && samePointNum === -1) {
2568
+ if (GeometryUtils.sameMPoints(line1[Math.floor(i / 2)], line2[i % 2]) && GeometryUtils.sameMDistances(disLine1 + disLine2, GeometryUtils.verticesDistance(line1[Math.floor((3 - i) / 2)], line2[(3 - i) % 2]))) {
2569
+ samePointNum = 3 - i;
2570
+ } else {
2571
+ i++;
2572
+ }
2573
+ }
2574
+ if (samePointNum > -1) {
2575
+ newLines = newLines.filter(function (a) {
2576
+ return !(a[2] === line1[2] || a[2] === line2[2]);
2577
+ });
2578
+ newLines.push([_objectSpread({}, line1[Math.floor(samePointNum / 2)]), _objectSpread({}, line2[samePointNum % 2]), IDBroker.acquireID()]);
2579
+ isMerge = true;
2580
+ return false;
2581
+ }
2582
+ var pointNum = -1,
2583
+ k = 0;
2584
+ while (k < 4 && pointNum === -1) {
2585
+ if (GeometryUtils.sameMDistances(GeometryUtils.verticesDistance(line1[Math.floor(k / 2)], line2[k % 2]) + GeometryUtils.verticesDistance(line1[1 - Math.floor(k / 2)], line2[k % 2]), disLine1) && GeometryUtils.sameMDistances(GeometryUtils.verticesDistance(line1[1 - Math.floor(k / 2)], line2[k % 2]) + GeometryUtils.verticesDistance(line1[1 - Math.floor(k / 2)], line2[1 - k % 2]), disLine2)) {
2586
+ pointNum = k;
2587
+ } else {
2588
+ k++;
2589
+ }
2590
+ }
2591
+ }
2592
+ return false;
2593
+ });
2594
+ });
2595
+ if (!newLines.length) return _objectSpread({}, md2);
2596
+ if (!isMerge) return false;
2597
+ return {
2598
+ id: IDBroker.acquireID(),
2599
+ items: [].concat(_toConsumableArray(md2.items.filter(function (item) {
2600
+ return md1.items.findIndex(function (it) {
2601
+ return it.id === item.id;
2602
+ }) === -1;
2603
+ })), _toConsumableArray(md1.items)),
2604
+ meshes: [],
2605
+ pos: md1.pos,
2606
+ size: md1.size,
2607
+ lines: newLines,
2608
+ molding: molding
2609
+ };
2610
+ }
2611
+ function showItemCT(item, CT, visible, planData, layer) {
2612
+ var item3D = planData.sceneGraph.layers[layer.id].items[item.id];
2613
+ if (item3D === undefined) return undefined;
2614
+ item3D.traverse(function (child) {
2615
+ if (child.name.includes('countertop')) {
2616
+ child.visible = visible;
2617
+ if (child.material.map === null) {
2618
+ var normalMap = item.counterTop.uri;
2619
+ var interiortexture = loadTexture(normalMap);
2620
+ applyTexture(child.material, interiortexture, 100, 100);
2621
+ child.material.color = new Color(1, 1, 1);
2622
+ return;
2623
+ }
2624
+ child.material.map.repeat.x = 1;
2625
+ }
2626
+ });
2627
+ }
2628
+ function getCountertopMesh(item, visible, planData, layer) {
2629
+ if (item.type.includes(APPLIANCE_CATEGORY_DISHWASHER)) return undefined;
2630
+ if (item.type.includes('BF')) return undefined;
2631
+ var item3D = planData.sceneGraph.layers[layer.id].items[item.id];
2632
+ var countertop = null;
2633
+ if (item3D === undefined) return undefined;
2634
+ item3D.traverse(function (child) {
2635
+ if (child.name.includes('countertop')) {
2636
+ countertop = child;
2637
+ }
2638
+ });
2639
+ return countertop;
2640
+ }
2641
+ function getDoorStyleMaterial(items, planData, layer, name) {
2642
+ var item3D = null;
2643
+ // find Item with visible = true, in elevation mode
2644
+ items.forEach(function (item) {
2645
+ var tempItem = null;
2646
+ tempItem = planData.sceneGraph.layers[layer.id].items[item.id];
2647
+ if (tempItem && tempItem.visible) {
2648
+ item3D = tempItem;
2649
+ }
2650
+ });
2651
+ var door_mesh = null;
2652
+ if (!item3D) return undefined;
2653
+ item3D.traverse(function (child) {
2654
+ if (!door_mesh && !child.name.includes('countertop') && !child.name.includes('_interior_') && !child.name.includes('handle') && child.type === OBJTYPE_MESH) {
2655
+ door_mesh = child;
2656
+ }
2657
+ });
2658
+ return door_mesh && door_mesh.material;
2659
+ }
2660
+ function addCTMesh(countertop, planData, layer) {
2661
+ if (countertop.items.length == 1) {
2662
+ showItemCT(countertop.items[0], countertop, true, planData, layer);
2663
+ } else {
2664
+ var ctMesh = null;
2665
+ countertop.items.some(function (item) {
2666
+ ctMesh = getCountertopMesh(item, true, planData, layer);
2667
+ return ctMesh != null;
2668
+ });
2669
+ if (!ctMesh) return;
2670
+ if (0) {
2671
+ var material = ctMesh.material;
2672
+ var thickness = 3.81;
2673
+ var geometry = new Three.BoxGeometry(countertop.size.width, thickness, countertop.size.depth);
2674
+ var ct3d = new Three.Mesh(geometry, material);
2675
+ countertop.ct3d = ct3d;
2676
+ planData.plan.add(ct3d);
2677
+ ct3d.position.x = countertop.pos.x;
2678
+ ct3d.position.z = -countertop.pos.y;
2679
+ ct3d.position.y = countertop.size.height + thickness / 2;
2680
+ ct3d.quaternion.setFromAxisAngle(new Three.Vector3(0, 1, 0), countertop.rotRad);
2681
+ ct3d.name = 'countertops';
2682
+ } else {
2683
+ var _ct3d = ctMesh.clone();
2684
+ countertop.ct3d = _ct3d;
2685
+ _ct3d.visible = true;
2686
+ _ct3d.material = ctMesh.material.clone();
2687
+ if (_ct3d.material.map !== null) {
2688
+ _ct3d.material.map.copy(ctMesh.material.map);
2689
+ _ct3d.material.map.repeat.x = countertop.items.length;
2690
+ }
2691
+ ctMesh.updateMatrix();
2692
+ ctMesh.parent.updateMatrix();
2693
+ ctMesh.parent.parent.updateMatrix();
2694
+ var ctmeshMat = ctMesh.matrix;
2695
+ var objMat = ctMesh.parent.matrix;
2696
+ var pivotMat = ctMesh.parent.parent.matrix;
2697
+ pivotMat.setPosition(new Three.Vector3(countertop.pos.x, 0, -countertop.pos.y));
2698
+ var width = countertop.items.find(function (ct) {
2699
+ return !ct.type.includes(APPLIANCE_CATEGORY_DISHWASHER) && !ct.type.includes('BF');
2700
+ }).properties.get('width').get('_length');
2701
+ var unit_width = countertop.items.find(function (ct) {
2702
+ return !ct.type.includes(APPLIANCE_CATEGORY_DISHWASHER) && !ct.type.includes('BF');
2703
+ }).properties.get('width').get('_unit') || 'cm';
2704
+ width = convert(width).from(unit_width).to('cm');
2705
+ pivotMat.scale(new Three.Vector3(countertop.size.width / width, 1, 1));
2706
+ var finalMat = objMat.premultiply(pivotMat);
2707
+ _ct3d.applyMatrix4(finalMat);
2708
+ planData.plan.add(_ct3d);
2709
+ _ct3d.name = 'countertops';
2710
+ }
2711
+ }
2712
+ }
2713
+ function getArea(a, b, c) {
2714
+ return a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y);
2715
+ }
2716
+ function isSingleQuadrilateral(groupCount, pointGroup) {
2717
+ return groupCount === 1 && pointGroup.length === 4;
2718
+ }
2719
+
2720
+ /**
2721
+ * @param MDV - molding points
2722
+ * @param width - cabinet width
2723
+ * @param depth - cabinet depth ( z axis )
2724
+ * @param model - molding info that appear in real 3D
2725
+ */
2726
+ function moldingVertices(mPointGroup, mdGeo, MDV, model, svg_width, svg_height, groupCount) {
2727
+ // Guard against bad SVG metadata (missing/zero dimensions) which would produce NaN/Infinity vertices.
2728
+ if (!Number.isFinite(svg_width) || !Number.isFinite(svg_height) || svg_width <= 0 || svg_height <= 0) {
2729
+ mdGeo.setAttribute('position', new Three.BufferAttribute(new Float32Array(), 3));
2730
+ mdGeo.needsUpdate = true;
2731
+ return mdGeo;
2732
+ }
2733
+ var pointGroup = mPointGroup;
2734
+ var length = pointGroup.length;
2735
+ var isSnap = true;
2736
+
2737
+ // Point O
2738
+ var o = new Three.Vector2(0, 0);
2739
+ if (GeometryUtils.samePoints(pointGroup[0], pointGroup[length - 1])) {
2740
+ pointGroup = pointGroup.slice(0, length - 1);
2741
+ length--;
2742
+ isSnap = false;
2743
+ }
2744
+ var verticesArray = [];
2745
+ var t = [[-1, -1], [1, -1], [1, 1], [-1, 1]];
2746
+ if (!isSnap && isSingleQuadrilateral(groupCount, pointGroup)) {
2747
+ var tmp_pos = [];
2748
+ t.forEach(function (tmp) {
2749
+ pointGroup.forEach(function (point) {
2750
+ if (point.x * tmp[0] > 0 && point.y * tmp[1] > 0) {
2751
+ tmp_pos.push(point);
2752
+ }
2753
+ });
2754
+ });
2755
+ pointGroup = tmp_pos;
2756
+ }
2757
+ pointGroup.forEach(function (cur, i) {
2758
+ var prev = isSnap && i === 0 ? cur : pointGroup[(i + length - 1) % length];
2759
+ var next = isSnap && i === length - 1 ? cur : pointGroup[(i + 1) % length];
2760
+ var vecPC = cur.clone().sub(prev); // vector from point `prev` to point `cur`
2761
+ var vecNC = cur.clone().sub(next); // vector from point `next` to point `cur`
2762
+
2763
+ // Calculate normal vector to `vecPC`
2764
+ var vecNorm = new Three.Vector2(0, 1);
2765
+ if (vecPC.x) {
2766
+ if (vecPC.x > 0) {
2767
+ vecNorm = new Three.Vector2(-vecPC.y / vecPC.x, 1);
2768
+ } else {
2769
+ vecNorm = new Three.Vector2(vecPC.y / vecPC.x, -1);
2770
+ }
2771
+ } else {
2772
+ if (vecPC.y === 0) {
2773
+ if (vecNC.x) {
2774
+ if (vecNC.x > 0) {
2775
+ vecNorm = new Three.Vector2(vecNC.y / vecNC.x, -1);
2776
+ } else {
2777
+ vecNorm = new Three.Vector2(-vecNC.y / vecNC.x, 1);
2778
+ }
2779
+ } else {
2780
+ if (vecNC.y > 0) {
2781
+ vecNorm = new Three.Vector2(1, 0);
2782
+ } else {
2783
+ vecNorm = new Three.Vector2(-1, 0);
2784
+ }
2785
+ }
2786
+ } else {
2787
+ if (vecPC.y > 0) {
2788
+ vecNorm = new Three.Vector2(-1, 0);
2789
+ } else {
2790
+ vecNorm = new Three.Vector2(1, 0);
2791
+ }
2792
+ }
2793
+ }
2794
+ var p1 = cur.clone().add(vecNorm); // the point that's away from `cur` by `vecNorm`
2795
+ if (getArea(prev, p1, cur) > 0) {
2796
+ vecNorm.multiplyScalar(-1);
2797
+ }
2798
+ var area = 0.5 * getArea(prev, cur, next);
2799
+ var lenPN = next.clone().sub(prev).length();
2800
+ var lenNC = vecNC.length();
2801
+ var lenPC = vecPC.length();
2802
+ var alpha = Math.acos((lenNC * lenNC + lenPC * lenPC - lenPN * lenPN) / (2 * lenNC * lenPC));
2803
+ if (area < 0) alpha = 2 * Math.PI - alpha; // Exterior Angle
2804
+ alpha /= 2;
2805
+ if (isNaN(alpha)) {
2806
+ alpha = Math.PI / 2;
2807
+ }
2808
+ vecNorm.rotateAround(o, Math.PI / 2 - alpha);
2809
+ vecNorm.normalize();
2810
+ var sinAlpha = Math.sin(alpha);
2811
+ if (Math.abs(sinAlpha) > 1e-6) {
2812
+ vecNorm.multiplyScalar(1 / sinAlpha);
2813
+ }
2814
+
2815
+ // Make 3D Points
2816
+ MDV.forEach(function (p) {
2817
+ var x = cur.x - vecNorm.x * ((p.x / svg_width - 0.5) * model.length);
2818
+ var y = (0.5 - p.y / svg_height) * model.width;
2819
+ var z = -cur.y + vecNorm.y * ((p.x / svg_width - 0.5) * model.length);
2820
+ if (Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z)) {
2821
+ verticesArray.push(x, y, z);
2822
+ }
2823
+ });
2824
+ });
2825
+ var mdGeo1 = mdGeo.setAttribute('position', new Three.BufferAttribute(new Float32Array(verticesArray), 3));
2826
+ mdGeo1.needsUpdate = true;
2827
+ return mdGeo1;
2828
+ }
2829
+ var dcmFace = function dcmFace(a, leng, MDV) {
2830
+ for (var i = a; i < a + 2; i++) {
2831
+ var f_a1 = i;
2832
+ var f_b1 = i + leng;
2833
+ var f_c1 = i + leng + 1;
2834
+ var f_a2 = i;
2835
+ var f_b2 = i + 1;
2836
+ var f_c2 = f_c1;
2837
+ var _indices = Array.from(MDV.index.array);
2838
+ _indices.push(f_a1, f_b1, f_c1, f_c2, f_b2, f_a2);
2839
+ MDV.setIndex(_indices);
2840
+ }
2841
+ var indices = Array.from(MDV.index.array);
2842
+ indices.push(a + 2, a + leng + 2, a + leng + 4, a + leng + 4, a + 4, a + 2);
2843
+ MDV.setIndex(indices);
2844
+ for (var _i = a + 4; _i < a + 74; _i++) {
2845
+ var _f_a = _i;
2846
+ var _f_b = _i + leng;
2847
+ var _f_c = _i + leng + 1;
2848
+ var _f_a2 = _i;
2849
+ var _f_b2 = _i + 1;
2850
+ var _f_c2 = _f_c;
2851
+ var _indices2 = Array.from(MDV.index.array);
2852
+ _indices2.push(_f_a, _f_b, _f_c, _f_c2, _f_b2, _f_a2);
2853
+ MDV.setIndex(_indices2);
2854
+ }
2855
+ var faces = Array.from(MDV.index.array);
2856
+ faces.push(a + 50, a + 3, a + 103, a + 103, a + 150, a + 50);
2857
+ MDV.setIndex(faces);
2858
+ };
2859
+ var fbmFace = function fbmFace(a, leng, MDV) {
2860
+ var total_leng = leng * 4;
2861
+ for (var i = a; i < a + leng - 1; i++) {
2862
+ var f_a1 = i;
2863
+ var f_b1 = (i + leng) % total_leng;
2864
+ var f_c1 = (i + leng + 1) % total_leng;
2865
+ var f_a2 = i;
2866
+ var f_b2 = i + 1;
2867
+ var f_c2 = f_c1;
2868
+ var indices = [];
2869
+ if (MDV.index !== null) {
2870
+ indices = Array.from(MDV.index.array);
2871
+ }
2872
+ indices.push(f_a1, f_b1, f_c1, f_c2, f_b2, f_a2);
2873
+ MDV.setIndex(indices);
2874
+ }
2875
+ };
2876
+ var assignUVs = function assignUVs(geometry) {
2877
+ geometry.computeBoundingBox();
2878
+ var h = 400;
2879
+ var _geometry$boundingBox = geometry.boundingBox,
2880
+ min = _geometry$boundingBox.min,
2881
+ max = _geometry$boundingBox.max;
2882
+ var offset = new Three.Vector2(0 - min.x, 0 - min.z);
2883
+ var range = new Three.Vector2(max.x - min.x, max.z - min.z);
2884
+ geometry.faceVertexUvs[0] = geometry.faces.map(function (face) {
2885
+ var v1 = geometry.vertices[face.a];
2886
+ var v2 = geometry.vertices[face.b];
2887
+ var v3 = geometry.vertices[face.c];
2888
+ return [new Three.Vector2((v1.x + offset.x) / range.x, (v1.z + offset.y) / (range.y + h)), new Three.Vector2((v2.x + offset.x) / range.x, (v2.z + offset.y) / (range.y + h)), new Three.Vector2((v3.x + offset.x) / range.x, (v3.z + offset.y) / (range.y + h))];
2889
+ });
2890
+ geometry.uvsNeedUpdate = true;
2891
+ };
2892
+ var assignUVsA = function assignUVsA(geometry) {
2893
+ geometry.computeBoundingBox();
2894
+ var h = 200;
2895
+ var _geometry$boundingBox2 = geometry.boundingBox,
2896
+ min = _geometry$boundingBox2.min,
2897
+ max = _geometry$boundingBox2.max;
2898
+ var offset = new Three.Vector2(0 - min.x, 0 - min.y);
2899
+ var range = new Three.Vector2(max.x - min.x, max.y - min.y);
2900
+ geometry.faceVertexUvs[0] = geometry.faces.map(function (face) {
2901
+ var v1 = geometry.vertices[face.a];
2902
+ var v2 = geometry.vertices[face.b];
2903
+ var v3 = geometry.vertices[face.c];
2904
+ return [new Three.Vector2((v1.x + offset.x) / (range.x + h), (v1.y + offset.y) / (range.y + h)), new Three.Vector2((v2.x + offset.x) / (range.x + h), (v2.y + offset.y) / (range.y + h)), new Three.Vector2((v3.x + offset.x) / (range.x + h), (v3.y + offset.y) / (range.y + h))];
2905
+ });
2906
+ geometry.uvsNeedUpdate = true;
2907
+ };
2908
+
2909
+ /*
2910
+ Remove specified type of 3d object easily
2911
+ */
2912
+ export function deleteSpecifiedMeshObjects(type) {
2913
+ var childLen = planData.plan.children.length;
2914
+ var children = [];
2915
+ for (var i = 0; i < childLen; i++) {
2916
+ if (planData.plan.children[i].name != type) children.push(planData.plan.children[i]);
2917
+ }
2918
+ planData.plan.children = children;
2919
+ }
2920
+ export function getMeshesFromScene() {
2921
+ var childLen = planData.plan.children.length;
2922
+ var children = [];
2923
+ for (var i = 0; i < childLen; i++) {
2924
+ if (planData.plan.children[i].type == OBJTYPE_MESH) children.push(planData.plan.children[i]);
2925
+ }
2926
+ return children;
2927
+ }
2928
+ export function threedfabs(a) {
2929
+ return a > 0 ? a : -a;
2930
+ }
2931
+ export function getDistanceBetweenLineSegment(pos1, pos2, pos3, pos4) {
2932
+ if (pos1.x == pos2.x && pos3.x == pos4.x) return pos3.x - pos1.x;else if (pos1.y == pos2.y && pos3.y == pos4.y) return pos3.y - pos1.y;else return -1;
2933
+ }
2934
+ function isSimilar(a, b) {
2935
+ if (threedfabs(a - b) <= 0.01) return 1;
2936
+ return 0;
2937
+ }
2938
+ export function sameSign(pos1, pos2, pos3) {
2939
+ var ch1 = 0.0;
2940
+ var ch2 = 1.0;
2941
+ if (isSimilar(pos1.x, pos2.x) && isSimilar(pos1.x, pos3.x)) {
2942
+ ch1 = (pos2.y - pos1.y) * (pos3.y - pos1.y);
2943
+ } else if (isSimilar(pos1.y, pos2.y) && isSimilar(pos1.y, pos3.y)) {
2944
+ ch1 = (pos2.x - pos1.x) * (pos3.x - pos1.x);
2945
+ } else {
2946
+ ch1 = (pos2.y - pos1.y) * 1.0 / (pos2.x - pos1.x);
2947
+ ch2 = (pos3.y - pos1.y) * 1.0 / (pos3.x - pos1.x);
2948
+ }
2949
+ if (ch1 * ch2 >= 0) return 1;
2950
+ return 0;
2951
+ }
2952
+ export function getTotalDistance(pos, rect) {
2953
+ var sum = 0;
2954
+ for (var i = 0; i < rect.length; i++) {
2955
+ sum += verticesDistance(pos, rect[i]);
2956
+ }
2957
+ return sum;
2958
+ }
2959
+ var applyTexture = function applyTexture(material, texture, length, height) {
2960
+ if (texture) {
2961
+ material.map = texture;
2962
+ material.needsUpdate = true;
2963
+ material.map.wrapS = Three.RepeatWrapping;
2964
+ material.map.wrapT = Three.RepeatWrapping;
2965
+ material.map.repeat.set(length * 0.01, height * 0.01);
2966
+ if (texture.normal) {
2967
+ material.normalMap = loadTexture(texture.normal.uri);
2968
+ material.normalScale = new Vector2(texture.normal.normalScaleX, texture.normal.normalScaleY);
2969
+ material.normalMap.wrapS = Three.RepeatWrapping;
2970
+ material.normalMap.wrapT = Three.RepeatWrapping;
2971
+ material.normalMap.repeat.set(length * texture.normal.lengthRepeatScale, height * texture.normal.heightRepeatScale);
2972
+ }
2973
+ }
2974
+ };
2975
+
2976
+ /**
2977
+ *
2978
+ * @param {{is_corner:number,itemInfo:Item,layoutpos:string,pos:{x:number,y:number},rect:[{x:number,y:number}],
2979
+ * rotRad:number,size:{depth:number,width:number,height:number}}} item
2980
+ * @param {Layer} layer
2981
+ * @param {{boundingBox:Box3,catalog:Catalog,grid: Object3D,plan: Object3D,sceneData: Scene,sceneGraph}} planData
2982
+ * @param {Scene} scene
2983
+ */
2984
+ export function createBacksplash(item, layer, planData, scene) {
2985
+ var _getSnappedWallLines;
2986
+ var sceneGraph = planData.sceneGraph;
2987
+ var selectedLayer = planData.sceneData.selectedLayer;
2988
+ /**
2989
+ * @type {[{backsplash,info:{rotY:number,posX:number,posY:number,posZ:number,splashWidth:number,splashHeight:number,splashDepth:number,id:string}}]}
2990
+ */
2991
+ var backsplashes = sceneGraph.layers[selectedLayer].backsplashes;
2992
+ var backsplashApplied = layer.get('backsplashApplied');
2993
+ var name = 'backsplash' + item.itemInfo.id;
2994
+ var index = backsplashes.findIndex(function (item) {
2995
+ return item.backsplash.name === name;
2996
+ });
2997
+ var itemToSave = {
2998
+ backsplash: null,
2999
+ info: {}
3000
+ };
3001
+ if (!item.itemInfo.backsplashVisible) {
3002
+ // If backsplash is not visible
3003
+ if (index >= 0) {
3004
+ backsplashes.splice(index, 1); // Remove from backsplashes array
3005
+ }
3006
+ return;
3007
+ }
3008
+
3009
+ // Get current wall line that item is snapped
3010
+ var wLines = (_getSnappedWallLines = getSnappedWallLines(item.itemInfo, layer, planData.catalog)) === null || _getSnappedWallLines === void 0 ? void 0 : _getSnappedWallLines.filter(function (sLine) {
3011
+ return sLine.snapSide === 'front';
3012
+ });
3013
+ var curLine = wLines.length > 0 ? wLines[0] : null;
3014
+
3015
+ // Get wall items which snapped to the curLine
3016
+
3017
+ var i,
3018
+ wallItems = [];
3019
+ var allWallItems = GeometryUtils.getAllItemSpecified(scene, planData.catalog, WALL_CABINET_LAYOUTPOS, curLine === null || curLine === void 0 ? void 0 : curLine.lineRect);
3020
+ for (i = 0; i < allWallItems.others.length; i++) wallItems.push(allWallItems.others[i]);
3021
+ if (allWallItems.cur) wallItems.push(allWallItems.cur);
3022
+
3023
+ // Get information of item itself
3024
+
3025
+ var altitude = item.itemInfo.properties.get('altitude').get('_length');
3026
+ var altitudeUnit = item.itemInfo.properties.get('altitude').get('_unit') || 'cm';
3027
+ altitude = convert(altitude).from(altitudeUnit).to('cm');
3028
+ var thickness = 1,
3029
+ /** Height --- altitude */depth;
3030
+
3031
+ // Calc wall & hole items info
3032
+
3033
+ /**
3034
+ * Wall & Hole items info
3035
+ * @type {[{x:number,width:number,altitude:number}]}
3036
+ */
3037
+ var altItems = [],
3038
+ flag = false;
3039
+ var D0 = {},
3040
+ D1 = {};
3041
+ wallItems.map(function (wallItem) {
3042
+ var _wallItem$itemInfo, _wallItem$itemInfo2;
3043
+ var altitude = (_wallItem$itemInfo = wallItem.itemInfo) === null || _wallItem$itemInfo === void 0 || (_wallItem$itemInfo = _wallItem$itemInfo.properties) === null || _wallItem$itemInfo === void 0 ? void 0 : _wallItem$itemInfo.get('altitude').get('_length');
3044
+ var altitudeUnit = ((_wallItem$itemInfo2 = wallItem.itemInfo) === null || _wallItem$itemInfo2 === void 0 || (_wallItem$itemInfo2 = _wallItem$itemInfo2.properties) === null || _wallItem$itemInfo2 === void 0 ? void 0 : _wallItem$itemInfo2.get('altitude').get('_unit')) || 'cm';
3045
+ if (!isEmpty(altitude) && !isEmpty(altitudeUnit)) {
3046
+ altitude = convert(altitude).from(altitudeUnit).to('cm');
3047
+ var altPoints = getLineSnapPointsOfItem(layer, curLine, wallItem);
3048
+ if (altPoints.length > 1) {
3049
+ D0 = altPoints[0];
3050
+ D1 = altPoints[1];
3051
+ }
3052
+ altItems.push({
3053
+ D0: D0,
3054
+ // D0, D1: item's snapped points with line
3055
+ D1: D1,
3056
+ x: wallItem.pos.x,
3057
+ width: wallItem.size.width,
3058
+ altitude: altitude
3059
+ });
3060
+ }
3061
+ });
3062
+ layer.holes.map(function (hole) {
3063
+ var _hole$properties, _hole$properties2, _layer$lines, _layer$vertices, _line$vertices, _layer$vertices2, _line$vertices2;
3064
+ var width = (_hole$properties = hole.properties) === null || _hole$properties === void 0 ? void 0 : _hole$properties.getIn(['width', 'length']);
3065
+ var altitude = (_hole$properties2 = hole.properties) === null || _hole$properties2 === void 0 ? void 0 : _hole$properties2.getIn(['altitude', 'length']);
3066
+ var line = (_layer$lines = layer.lines) === null || _layer$lines === void 0 ? void 0 : _layer$lines.get(curLine === null || curLine === void 0 ? void 0 : curLine.id);
3067
+ var v0 = (_layer$vertices = layer.vertices) === null || _layer$vertices === void 0 ? void 0 : _layer$vertices.get(line === null || line === void 0 || (_line$vertices = line.vertices) === null || _line$vertices === void 0 ? void 0 : _line$vertices.get(0));
3068
+ var v1 = (_layer$vertices2 = layer.vertices) === null || _layer$vertices2 === void 0 ? void 0 : _layer$vertices2.get(line === null || line === void 0 || (_line$vertices2 = line.vertices) === null || _line$vertices2 === void 0 ? void 0 : _line$vertices2.get(1));
3069
+ if (!isEmpty(v0) || !isEmpty(v1)) {
3070
+ var lineLength = pointsDistance(v0.x, v0.y, v1.x, v1.y);
3071
+ var disD0 = lineLength * hole.offset - width / 2;
3072
+ var disD1 = lineLength * hole.offset + width / 2;
3073
+ D0 = {
3074
+ x: v0.x + disD0 * Math.cos(hole.rotation),
3075
+ y: v0.y + disD0 * Math.sin(hole.rotation)
3076
+ };
3077
+ D1 = {
3078
+ x: v0.x + disD1 * Math.cos(hole.rotation),
3079
+ y: v0.y + disD1 * Math.sin(hole.rotation)
3080
+ };
3081
+ }
3082
+ if (!isEmpty(width) && !isEmpty(altitude) && hole.line === (curLine === null || curLine === void 0 ? void 0 : curLine.id)) altItems.push({
3083
+ D0: D0,
3084
+ // D0, D1: hole's two points
3085
+ D1: D1,
3086
+ x: hole.x,
3087
+ width: width,
3088
+ altitude: altitude
3089
+ });
3090
+ });
3091
+ var DEFAULT_BACKSPLASH_HEIGHT = 52 * 2.54;
3092
+ if (altItems.length > 0) {
3093
+ depth = altItems[0].altitude;
3094
+ altItems.map(function (altItem) {
3095
+ if (isOverlappedTwoItemsOnOneLine(layer, curLine, item, altItem)) {
3096
+ if (depth >= altItem.altitude) {
3097
+ depth = altItem.altitude;
3098
+ flag = true;
3099
+ }
3100
+ } else if (!flag || depth > DEFAULT_BACKSPLASH_HEIGHT) depth = DEFAULT_BACKSPLASH_HEIGHT;
3101
+ });
3102
+ }
3103
+
3104
+ // Get backsplash info
3105
+
3106
+ var posX = item.pos.x - Math.sin(item.rotRad) * (item.size.depth / 2 - thickness);
3107
+ var posY = altitude + depth / 2;
3108
+ var posZ = -item.pos.y - Math.cos(item.rotRad) * (item.size.depth / 2 - thickness);
3109
+ // TODO If you want apply backsplash to walls that's not vertical or horizontal ( slope )
3110
+ // You must update this calcuating rotY
3111
+ var rotY = item.rotRad;
3112
+ var posX1 = item.pos.x + Math.cos(item.rotRad) * (item.size.width / 2 - thickness);
3113
+ var posY1 = altitude + depth / 2;
3114
+ var posZ1 = -item.pos.y - Math.sin(item.rotRad) * (item.size.width / 2 - thickness);
3115
+ // TODO If you want apply backsplash to walls that's not vertical or horizontal ( slope )
3116
+ // You must update this calcuating rotY
3117
+ var rotY1 = item.rotRad + Math.PI / 2;
3118
+ var splashWidth = item.size.width;
3119
+ var splashHeight = depth;
3120
+ var splashDepth = thickness;
3121
+
3122
+ // Find mergeable other backsplashes
3123
+
3124
+ // let info,
3125
+ // wholeWidth,
3126
+ // /** Width factor */ factor,
3127
+ // distance,
3128
+ // halfWidth,
3129
+ // /** To get new center */ centerFactor;
3130
+
3131
+ // for (let back of backsplashes) {
3132
+ // info = back.info;
3133
+ // if (info.height === splashHeight && info.rotY === rotY) {
3134
+ // factor = Math.cos(rotY) || 1;
3135
+ // distance = Math.hypot(posX - info.posX, posZ - info.posZ) / factor;
3136
+ // halfWidth = (info.width + splashWidth) / 2;
3137
+
3138
+ // if (Math.abs(distance - halfWidth) < 1e-2) {
3139
+ // // dispose `back`
3140
+ // if (info.id) {
3141
+ // deleteSpecifiedMeshObjects('backsplash' + info.id);
3142
+ // }
3143
+
3144
+ // // Get center position
3145
+ // wholeWidth = info.width + splashWidth;
3146
+ // centerFactor = info.width / wholeWidth;
3147
+ // posX = posX + centerFactor * (info.posX - posX);
3148
+ // posZ = posZ + centerFactor * (info.posZ - posZ);
3149
+
3150
+ // splashWidth = wholeWidth;
3151
+ // }
3152
+ // }
3153
+ // }
3154
+
3155
+ itemToSave.info.posX = posX;
3156
+ itemToSave.info.posY = posY;
3157
+ itemToSave.info.posZ = posZ;
3158
+ itemToSave.info.rotY = rotY;
3159
+ itemToSave.info.width = splashWidth;
3160
+ itemToSave.info.height = splashHeight;
3161
+ itemToSave.info.depth = splashDepth;
3162
+
3163
+ // Make material
3164
+
3165
+ var texture = layer.get('backsplash');
3166
+ var areaMaterial = new Three.MeshStandardMaterial({
3167
+ side: Three.DoubleSide,
3168
+ metalness: texture.metalness,
3169
+ roughness: texture.roughness
3170
+ });
3171
+ var interiortexture = loadTexture(texture.uri);
3172
+ applyTexture(areaMaterial, interiortexture, splashWidth * 1.5, splashHeight * 1.5);
3173
+
3174
+ // Make geometry
3175
+ var geometry = new Three.BoxGeometry(splashWidth, splashHeight, splashDepth);
3176
+
3177
+ // Make backsplash mesh
3178
+
3179
+ var backsplash = itemToSave.backsplash = new Three.Mesh(geometry, areaMaterial);
3180
+ backsplash.position.x = itemToSave.info.posX;
3181
+ backsplash.position.y = itemToSave.info.posY;
3182
+ backsplash.position.z = itemToSave.info.posZ;
3183
+ backsplash.rotation.y = itemToSave.info.rotY;
3184
+ var allLines = GeometryUtils.getAllLines(layer);
3185
+ var allLineRects = GeometryUtils.buildRectFromLines(layer, allLines);
3186
+ if (isCornerCabinet(item) && GeometryUtils.isSnappedSideLine(item, allLineRects)) {
3187
+ // corner cabinet item.itemInfo.getIn(["cabinet_category"]) === "Corner Base Cabinets"
3188
+ var geometry1 = new Three.BoxGeometry(splashWidth, splashHeight, splashDepth);
3189
+ // Make backsplash mesh
3190
+ //console.log(sceneGraph.layers["layer-1"].lines);
3191
+ var backsplash1 = itemToSave.backsplash = new Three.Mesh(geometry1, areaMaterial);
3192
+ backsplash1.position.x = posX1;
3193
+ backsplash1.position.y = posY1;
3194
+ backsplash1.position.z = posZ1;
3195
+ backsplash1.rotation.y = rotY1;
3196
+ var newBacksplash = new Group();
3197
+ newBacksplash.add(backsplash);
3198
+ newBacksplash.add(backsplash1);
3199
+ backsplash = newBacksplash;
3200
+ }
3201
+ itemToSave.info.id = item.itemInfo.id;
3202
+ deleteSpecifiedMeshObjects('backsplash' + item.itemInfo.id);
3203
+ if (Math.abs(item.rotRad % (Math.PI / 2)) < EPSILON || Math.abs(item.rotRad % (Math.PI / 2) - Math.PI / 2) < EPSILON) planData.plan.add(backsplash);
3204
+ backsplash.name = name;
3205
+ backsplash.visible = item.itemInfo.get('backsplashVisible') && backsplashApplied && Math.abs(item.rotRad % (Math.PI / 2)) < EPSILON || Math.abs(item.rotRad % (Math.PI / 2) - Math.PI / 2) < EPSILON;
3206
+
3207
+ // Save to scene graph
3208
+
3209
+ if (index < 0) {
3210
+ backsplashes.push(itemToSave);
3211
+ } else {
3212
+ disposeObject(backsplashes[index].backsplash);
3213
+ backsplashes.splice(index, 1, itemToSave);
3214
+ }
3215
+ }
3216
+
3217
+ /**
3218
+ * @param {Map} item - Selected Item
3219
+ */
3220
+ function addMGMesh(molding, planData, layer) {
3221
+ var _molding$molding;
3222
+ var flag = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
3223
+ var point = [];
3224
+ var data = molding === null || molding === void 0 || (_molding$molding = molding.molding) === null || _molding$molding === void 0 ? void 0 : _molding$molding.data;
3225
+ if (isEmpty(data)) return;
3226
+ var paths = data.paths,
3227
+ svg_width = data.svg_width,
3228
+ svg_height = data.svg_height;
3229
+ for (var i = 0; i < paths.length; i++) {
3230
+ var path = paths[i];
3231
+ for (var j = 0, jl = path.subPaths.length; j < jl; j++) {
3232
+ var subPath = new Three.Path();
3233
+ if (path.subPaths[j].hasOwnProperty('metadata')) {
3234
+ subPath.fromJSON(path.subPaths[j]);
3235
+ } else {
3236
+ subPath = path.subPaths[j];
3237
+ }
3238
+ point = subPath.getPoints();
3239
+ }
3240
+ }
3241
+ _addMGMesh(molding, planData, layer, point, svg_width, svg_height, flag);
3242
+ }
3243
+ var isBaseCabinet = function isBaseCabinet(item) {
3244
+ return item.layoutpos === BASE_CABINET_LAYOUTPOS;
3245
+ };
3246
+
3247
+ /**
3248
+ * @param data - Molding SVG Points
3249
+ */
3250
+
3251
+ // function assignUVs
3252
+ function _addMGMesh(molding, planData, layer, data, svg_width, svg_height, flag) {
3253
+ var child = molding.molding;
3254
+ var material = getDoorStyleMaterial(molding.items, planData, layer, child.name);
3255
+ if (!material) return;
3256
+ material = new Three.MeshStandardMaterial(material);
3257
+ // let texture = loadTexture(material.map.image.src);
3258
+ // var material1 = new Three.MeshLambertMaterial( { map:texture } );
3259
+ material.side = parseInt(Three.DoubleSide);
3260
+ // let layoutType = molding.items[0].layoutpos;
3261
+ // let visible = molding.items[0];
3262
+ molding.pointGroups.forEach(function (pointGroup) {
3263
+ var _child$width_unit, _child$height_unit, _child$length_unit, _geometry2;
3264
+ var geometry = new Three.BufferGeometry();
3265
+ var length = data.length; //point array
3266
+ var widthUnit = child.width_unit === 'inch' ? 'in' : (_child$width_unit = child.width_unit) !== null && _child$width_unit !== void 0 ? _child$width_unit : 'in';
3267
+ var heightUnit = child.height_unit === 'inch' ? 'in' : (_child$height_unit = child.height_unit) !== null && _child$height_unit !== void 0 ? _child$height_unit : 'in';
3268
+ var lengthUnit = child.length_unit === 'inch' ? 'in' : (_child$length_unit = child.length_unit) !== null && _child$length_unit !== void 0 ? _child$length_unit : 'in';
3269
+ child.height = convert(child.height).from(heightUnit).to('cm');
3270
+ child.height_unit = 'cm';
3271
+ child.width = convert(child.width).from(widthUnit).to('cm');
3272
+ child.width_unit = 'cm';
3273
+ child.length = convert(child.length).from(lengthUnit).to('cm');
3274
+ child.length_unit = 'cm';
3275
+ geometry.needsUpdate = true;
3276
+ geometry = moldingVertices(pointGroup, geometry, data, child, svg_width, svg_height, molding.pointGroups.length);
3277
+ // If we failed to generate positions (bad SVG/model data), skip this molding group.
3278
+ if (!((_geometry2 = geometry) !== null && _geometry2 !== void 0 && (_geometry2 = _geometry2.attributes) !== null && _geometry2 !== void 0 && _geometry2.position) || geometry.attributes.position.count < 3) {
3279
+ return;
3280
+ }
3281
+ var total = geometry.attributes.position.count;
3282
+ var len = geometry.attributes.position.count / length;
3283
+ if (!GeometryUtils.samePoints(pointGroup[0], pointGroup[pointGroup.length - 1])) {
3284
+ len--;
3285
+ }
3286
+ for (var i = 0; i < len; i++) {
3287
+ for (var j = i * length; j < (i + 1) * length - 1; j++) {
3288
+ var f_a1 = j;
3289
+ var f_b1 = (j + length) % total;
3290
+ var f_c1 = (j + length + 1) % total;
3291
+ var f_a2 = j;
3292
+ var f_b2 = j + 1;
3293
+ var f_c2 = f_c1;
3294
+ var indices = [];
3295
+ if (geometry.index !== null) {
3296
+ indices = Array.from(geometry.index.array);
3297
+ }
3298
+ indices.push(f_a1, f_b1, f_c1, f_c2, f_b2, f_a2);
3299
+ geometry.setIndex(indices);
3300
+ }
3301
+ }
3302
+
3303
+ // handle molding texture
3304
+ // (0, e[i]) ------------- (1, e[i])
3305
+ // ----------- --- -----------
3306
+ // ----------- --- -----------
3307
+ // ----------- --- -----------
3308
+ // ----------- --- -----------
3309
+ // (0, e[i+1]) ------------- (1, e[i+1])
3310
+ geometry = geometry.toNonIndexed();
3311
+ var sumDistance = 0;
3312
+ var sumDistanceArray = [0];
3313
+ var finalDistance = 0;
3314
+ var uvs_element_array = [];
3315
+ for (var _i2 = 0; _i2 < data.length - 1; _i2++) {
3316
+ var v1 = {
3317
+ x: data[_i2].x,
3318
+ y: data[_i2].y
3319
+ };
3320
+ var v2 = {
3321
+ x: data[_i2 + 1].x,
3322
+ y: data[_i2 + 1].y
3323
+ };
3324
+ var posDistance = verticesDistance(v1, v2);
3325
+ sumDistance += posDistance;
3326
+ if (_i2 === data.length - 2) finalDistance = sumDistance;
3327
+ sumDistanceArray.push(sumDistance);
3328
+ }
3329
+ for (var _i3 = 0; _i3 < sumDistanceArray.length; _i3++) {
3330
+ uvs_element_array.push(sumDistanceArray[_i3] / finalDistance);
3331
+ }
3332
+ var uvs = [];
3333
+ var uvs_item = [];
3334
+ for (var _i4 = 0; _i4 < uvs_element_array.length - 1; _i4++) {
3335
+ uvs_item = [0, uvs_element_array[_i4], 1, uvs_element_array[_i4], 1, uvs_element_array[_i4 + 1], 1, uvs_element_array[_i4 + 1], 0, uvs_element_array[_i4 + 1], 0, uvs_element_array[_i4]];
3336
+ uvs.push.apply(uvs, _toConsumableArray(uvs_item));
3337
+ }
3338
+ var all_uvs = [];
3339
+ for (var _i5 = 0; _i5 < pointGroup.length; _i5++) {
3340
+ all_uvs.push.apply(all_uvs, uvs);
3341
+ }
3342
+ geometry.setAttribute('uv', new Three.BufferAttribute(new Float32Array(all_uvs), 2));
3343
+ geometry.computeVertexNormals();
3344
+ var fbm3d = new Three.Mesh(geometry, material);
3345
+ fbm3d.position.x = molding.pos.x;
3346
+ fbm3d.position.z = -molding.pos.y;
3347
+ fbm3d.position.y = molding.pos.z;
3348
+ planData.plan.add(fbm3d);
3349
+ fbm3d.name = child.name + molding.id + 'molding';
3350
+ molding.meshes.push(fbm3d);
3351
+ fbm3d.visible = true;
3352
+ fbm3d.castShadow = true;
3353
+ });
3354
+ }
3355
+ function deleteCTMesh(countertop, planData, layer) {
3356
+ log('--deleteCTMesh', countertop);
3357
+ if (countertop.items.length == 1) {
3358
+ showItemCT(countertop.items[0], countertop, false, planData, layer);
3359
+ } else {
3360
+ var ct3d = countertop.ct3d;
3361
+ if (ct3d) {
3362
+ planData.plan.remove(ct3d);
3363
+ disposeObject(ct3d);
3364
+ }
3365
+ }
3366
+ }
3367
+ export function deleteMGMesh(molding, planData) {
3368
+ var mode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
3369
+ // mode is 3D or elevation
3370
+ molding.meshes.forEach(function (mesh) {
3371
+ if (isElevationView(mode)) {
3372
+ var _planData$plan$childr;
3373
+ // when elevation mode, remove obj same as selected global molding_name in platnData.plan
3374
+ (_planData$plan$childr = planData.plan.children) === null || _planData$plan$childr === void 0 || _planData$plan$childr.forEach(function (obj) {
3375
+ var parent = obj.parent;
3376
+ if (obj.name.match(mesh.name)) parent.remove(obj);
3377
+ });
3378
+ } else {
3379
+ // when 3D mode
3380
+ planData.plan.remove(mesh);
3381
+ disposeObject(mesh);
3382
+ }
3383
+ });
3384
+ molding.meshes = [];
3385
+ }
3386
+ function log() {
3387
+ // console.log(...arguments);
3388
+ }
3389
+ function addCountertop(CTArray, addItem, planData, layer) {
3390
+ log('addCountertop', _toConsumableArray(CTArray), addItem.id);
3391
+ var tmp = planData;
3392
+ tmp = tmp && tmp.catalog.getElement(addItem.type);
3393
+ if (!tmp) tmp = planData.catalog.getElement(returnReplaceableDeepSearchType(addItem.type));
3394
+ var long_name = tmp && tmp.long_name;
3395
+ if (long_name.includes('Sink ')) return;
3396
+ var newCT = createCTFromItem(addItem, planData.sceneGraph.unit, planData.catalog);
3397
+ var oldCT = null;
3398
+ var extCT = false;
3399
+ var extCTIndex = -1;
3400
+ var tryMergeCT = function tryMergeCT() {
3401
+ extCTIndex = CTArray.findIndex(function (el) {
3402
+ extCT = tryAdjacent(newCT, el);
3403
+ return extCT != false;
3404
+ });
3405
+ return extCTIndex >= 0;
3406
+ };
3407
+ while (tryMergeCT()) {
3408
+ oldCT = CTArray.splice(extCTIndex, 1)[0];
3409
+ deleteCTMesh(newCT, planData, layer);
3410
+ deleteCTMesh(oldCT, planData, layer);
3411
+ newCT = extCT;
3412
+ }
3413
+ addCTMesh(newCT, planData, layer);
3414
+ CTArray.push(newCT);
3415
+ }
3416
+ export function deleteCountertop(CTArray, delItem, planData, layer) {
3417
+ if (delItem == undefined) {
3418
+ return;
3419
+ }
3420
+ log('deleteCountertop', _toConsumableArray(CTArray), delItem.id);
3421
+ var delCT = null;
3422
+ var delItemIndex = -1;
3423
+ var delCTIndex = CTArray.findIndex(function (el) {
3424
+ delItemIndex = el.items.findIndex(function (el) {
3425
+ return el.id == delItem.id;
3426
+ });
3427
+ return delItemIndex >= 0;
3428
+ });
3429
+ if (delCTIndex < 0) return;
3430
+ delCT = CTArray.splice(delCTIndex, 1)[0];
3431
+ if (delCT.items.length > 1) {
3432
+ deleteCTMesh(delCT, planData, layer);
3433
+ var ct1 = delCT.items.slice(0, delItemIndex);
3434
+ var ct2 = delCT.items.slice(delItemIndex + 1);
3435
+ [ct1, ct2].forEach(function (cts) {
3436
+ if (cts.length == 0) return;
3437
+ var newCT = createCTFromItems(cts, planData.sceneGraph.unit, planData.catalog);
3438
+ CTArray.push(newCT);
3439
+ addCTMesh(newCT, planData, layer);
3440
+ });
3441
+ }
3442
+ }
3443
+ export function deleteAllMolding(MGArray, delItem, planData, oldSceneLayer, newSceneLayer) {
3444
+ var tempMGArray = _toConsumableArray(MGArray);
3445
+ if (isEmpty(delItem)) {
3446
+ return tempMGArray;
3447
+ }
3448
+
3449
+ // remove the MGs which includes delItem
3450
+ tempMGArray = tempMGArray.filter(function (mg) {
3451
+ if (mg.items.some(function (it) {
3452
+ return it.id === delItem.id;
3453
+ })) {
3454
+ deleteMGMesh(mg, planData, null);
3455
+ return false;
3456
+ } else return true;
3457
+ });
3458
+ if (newSceneLayer !== null) {
3459
+ // find the snapped items with delItem
3460
+ var snappedItems = [];
3461
+ oldSceneLayer.items.toArray().forEach(function (oItem) {
3462
+ if (oItem.category === 'cabinet' && oItem.id !== delItem.id && MoldingUtils.isItemSnappedItem(delItem, oItem)) {
3463
+ snappedItems.push(oItem);
3464
+ }
3465
+ });
3466
+
3467
+ // update molding group array with snapped items in the new scene layer
3468
+ for (var i = 0; i < snappedItems.length; i++) {
3469
+ tempMGArray = updateMoldingGroupArray(tempMGArray, snappedItems[i], planData, newSceneLayer, null, null, 0);
3470
+ }
3471
+ }
3472
+ return tempMGArray;
3473
+ }
3474
+ export function addMolding(MGArray, addItem, planData, layer, itemActions, mode) {
3475
+ if (addItem.selected && [MODE_DRAGGING_ITEM_3D, MODE_ROTATING_ITEM_3D].includes(mode)) return false;
3476
+
3477
+ // If the item is not available for current doorStyle
3478
+ if (isWarningCabinet(addItem))
3479
+ // Do not add molding to that item
3480
+ return MGArray;
3481
+
3482
+ // if (
3483
+ // !(
3484
+ // (addItem.layoutpos === BASE_CABINET_LAYOUTPOS &&
3485
+ // !GeometryUtils.isSnappedLine(
3486
+ // MoldingUtils.getItemRect(addItem),
3487
+ // GeometryUtils.buildRectFromLines(
3488
+ // layer,
3489
+ // GeometryUtils.getAllLines(layer)
3490
+ // )
3491
+ // )) ||
3492
+ // ((addItem.layoutpos === WALL_CABINET_LAYOUTPOS ||
3493
+ // addItem.layoutpos === TALL_CABINET_LAYOUTPOS) &&
3494
+ // GeometryUtils.isSnappedLine(
3495
+ // MoldingUtils.getItemRect(addItem),
3496
+ // GeometryUtils.buildRectFromLines(
3497
+ // layer,
3498
+ // GeometryUtils.getAllLines(layer)
3499
+ // )
3500
+ // ))
3501
+ // )
3502
+ // )
3503
+ // return false;
3504
+
3505
+ // update the molding group array.
3506
+ var temp_MGArray = updateMoldingGroupArray(MGArray, addItem, planData, layer, itemActions, mode, 0);
3507
+ temp_MGArray.forEach(function (mg) {
3508
+ var moldingMesh = mg.meshes[0];
3509
+ if (isElevationView(mode)) {
3510
+ if (!isEmpty(moldingMesh)) {
3511
+ replaceMeshesWithLineSegments(moldingMesh);
3512
+ }
3513
+ }
3514
+ });
3515
+ return temp_MGArray;
3516
+ }
3517
+ export function updateMoldingGroupArray(MGArray, selItem, planData, layer) {
3518
+ var itemActions = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
3519
+ var mode = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;
3520
+ var cnt = arguments.length > 6 ? arguments[6] : undefined;
3521
+ try {
3522
+ cnt++;
3523
+ if (cnt > 500) {
3524
+ console.log('updateMoldingGroupArray has limited!');
3525
+ return MGArray;
3526
+ }
3527
+ var temp_MGArray = _toConsumableArray(MGArray);
3528
+ if (isEmpty(selItem)) return temp_MGArray;
3529
+ var isEnableMolding = MoldingUtils.isEnableItemForMolding(layer, selItem);
3530
+ // Make a items group with selItem to create the new MG(molding group) array of selItem
3531
+ var itemsForGroup = [selItem];
3532
+ var i = 0;
3533
+ while (i < itemsForGroup.length) {
3534
+ layer.items.toArray().forEach(function (curItem) {
3535
+ if (!itemsForGroup.some(function (it) {
3536
+ return it.id === curItem.id;
3537
+ }) && curItem.category === 'cabinet' && MoldingUtils.isSameMoldingLayoutpos(curItem, itemsForGroup[i]) && MoldingUtils.isItemSnappedItem(itemsForGroup[i], curItem)) {
3538
+ itemsForGroup.push(curItem);
3539
+ }
3540
+ });
3541
+ i++;
3542
+ }
3543
+
3544
+ // Create the new MG(molding group) array of selItem
3545
+ var new_MGArray = MoldingUtils.getAllMoldingGroups(layer, itemsForGroup);
3546
+
3547
+ // get molding settings of update molding from adjoined item's molding
3548
+ var changeMoldings = [];
3549
+ new_MGArray.forEach(function (mg) {
3550
+ if (mg.items.some(function (it) {
3551
+ return it.id === selItem.id;
3552
+ }) && mg.items.length > 1) {
3553
+ var destItem = mg.items.find(function (it) {
3554
+ return it.id !== selItem.id;
3555
+ });
3556
+ var destMolding = destItem.molding.find(function (md) {
3557
+ return md.location_type === mg.location_type;
3558
+ });
3559
+
3560
+ // if current item has not destination molding then set it to the current molding
3561
+ if (!isEmpty(destMolding) && !selItem.molding.some(function (md) {
3562
+ return md.location_type === destMolding.location_type;
3563
+ })) {
3564
+ // only update with the same height cabinet or update the bottom molding setting
3565
+ // itemActions.setMolding(destMoldings[i], false);
3566
+ changeMoldings.push(destMolding);
3567
+ } else if (isEmpty(destMolding) && selItem.molding.some(function (md) {
3568
+ return md.location_type === mg.location_type;
3569
+ })) {
3570
+ // if current item has more molding than adjoined then remove theses moldings
3571
+ // itemActions.setMolding(selItem.molding[i], false);
3572
+ changeMoldings.push(selItem.molding.find(function (md) {
3573
+ return md.location_type === mg.location_type;
3574
+ }));
3575
+ }
3576
+ }
3577
+ });
3578
+ var regenMGItemList = [];
3579
+ // An old MG and a new MG include a same item && The location_type of Two MGs are same
3580
+ // Then replace the old MG with the new MG
3581
+ temp_MGArray = temp_MGArray.filter(function (oldMG) {
3582
+ var filteredNewMGList = new_MGArray.filter(function (mg) {
3583
+ return mg.location_type === oldMG.location_type;
3584
+ });
3585
+ if (isEmpty(filteredNewMGList)) {
3586
+ return true;
3587
+ }
3588
+ var _loop4 = function _loop4() {
3589
+ var newMG = filteredNewMGList[k];
3590
+ if (oldMG.items.some(function (it) {
3591
+ return it.id === selItem.id;
3592
+ })) {
3593
+ // if current action is a seprating item from group, then have to regenerate the MGs of old snapped items
3594
+ if (oldMG.items.filter(function (oIt) {
3595
+ return !newMG.items.some(function (nIt) {
3596
+ return nIt.id === oIt.id;
3597
+ });
3598
+ }).length > 0) {
3599
+ oldMG.items.forEach(function (oIt) {
3600
+ if (oIt.id !== selItem.id && !regenMGItemList.some(function (rIt) {
3601
+ return rIt.id === oIt.id;
3602
+ })) regenMGItemList.push(oIt);
3603
+ });
3604
+ }
3605
+ }
3606
+ // remove the old MG meshes
3607
+ for (var _i6 = 0; _i6 < oldMG.items.length; _i6++) {
3608
+ var oItem = oldMG.items[_i6];
3609
+ for (var j = 0; j < newMG.items.length; j++) {
3610
+ var nItem = newMG.items[j];
3611
+ if (oItem.id === nItem.id) {
3612
+ deleteMGMesh(oldMG, planData, mode);
3613
+ // if (oldMG.items.length > 1) {
3614
+ // // separating item from group
3615
+ // oldMG.items.splice(i, 1);
3616
+ // // update the old molding group info
3617
+ // const mIdx = oldMG.items[0].molding.findIndex(
3618
+ // m => m.location_type == oldMG.location_type
3619
+ // );
3620
+ // if (mIdx >= 0) {
3621
+ // let molding = oldMG.items[0].molding[mIdx];
3622
+ // oldMG = MoldingUtils.createMonldingGroup(
3623
+ // oldMG,
3624
+ // layer,
3625
+ // molding,
3626
+ // planData.catalog
3627
+ // );
3628
+ // addMGMesh(oldMG, planData, layer);
3629
+ // }
3630
+ // return true;
3631
+ // }
3632
+ return {
3633
+ v: false
3634
+ };
3635
+ }
3636
+ }
3637
+ }
3638
+ },
3639
+ _ret;
3640
+ for (var k = 0; k < filteredNewMGList.length; k++) {
3641
+ _ret = _loop4();
3642
+ if (_ret) return _ret.v;
3643
+ }
3644
+ return true;
3645
+ });
3646
+ if (changeMoldings.length === 0 && isEnableMolding) {
3647
+ // refresh mesh of the updating molding groups
3648
+ new_MGArray.forEach(function (mg, index) {
3649
+ var _mg$items$;
3650
+ if ((_mg$items$ = mg.items[0]) !== null && _mg$items$ !== void 0 && (_mg$items$ = _mg$items$.molding) !== null && _mg$items$ !== void 0 && _mg$items$.some(function (mol) {
3651
+ var _mol$toJS;
3652
+ return isImmutable(mol) ? (mol === null || mol === void 0 || (_mol$toJS = mol.toJS()) === null || _mol$toJS === void 0 ? void 0 : _mol$toJS.location_type) === mg.location_type : (mol === null || mol === void 0 ? void 0 : mol.location_type) === mg.location_type;
3653
+ })) {
3654
+ var _mg$items$2, _mg$items$3, _mg$items$4;
3655
+ var molding = isImmutable((_mg$items$2 = mg.items[0]) === null || _mg$items$2 === void 0 ? void 0 : _mg$items$2.molding) ? (_mg$items$3 = mg.items[0]) === null || _mg$items$3 === void 0 || (_mg$items$3 = _mg$items$3.molding) === null || _mg$items$3 === void 0 ? void 0 : _mg$items$3.filter(function (mol) {
3656
+ var _mol$toJS2;
3657
+ return isImmutable(mol) ? (mol === null || mol === void 0 || (_mol$toJS2 = mol.toJS()) === null || _mol$toJS2 === void 0 ? void 0 : _mol$toJS2.location_type) === mg.location_type : (mol === null || mol === void 0 ? void 0 : mol.location_type) === mg.location_type;
3658
+ }).toJS()[0] : (_mg$items$4 = mg.items[0]) === null || _mg$items$4 === void 0 || (_mg$items$4 = _mg$items$4.molding) === null || _mg$items$4 === void 0 ? void 0 : _mg$items$4.filter(function (mol) {
3659
+ return (mol === null || mol === void 0 ? void 0 : mol.location_type) === mg.location_type;
3660
+ })[0];
3661
+ if (mg.molding === null || mg.molding.itemID !== molding.itemID || mg.lines === null || mg.points === null) {
3662
+ var _mg$molding;
3663
+ if (mg.molding !== null && ((_mg$molding = mg.molding) === null || _mg$molding === void 0 ? void 0 : _mg$molding.itemID) !== molding.itemID) {
3664
+ deleteMGMesh(mg, planData, mode);
3665
+ }
3666
+ mg = MoldingUtils.createMonldingGroup(mg, layer, molding, planData.catalog);
3667
+ }
3668
+ if (!mg.meshes.length) {
3669
+ addMGMesh(mg, planData, layer);
3670
+ }
3671
+ } else {
3672
+ deleteMGMesh(mg, planData, mode);
3673
+ }
3674
+ });
3675
+ }
3676
+ new_MGArray.forEach(function (mg) {
3677
+ return temp_MGArray.push(mg);
3678
+ });
3679
+ regenMGItemList.forEach(function (it) {
3680
+ temp_MGArray = updateMoldingGroupArray(temp_MGArray, it, planData, layer, itemActions, mode, cnt);
3681
+ });
3682
+ if (changeMoldings.length > 0 && itemActions !== null) {
3683
+ setTimeout(function () {
3684
+ changeMoldings.forEach(function (chMolding) {
3685
+ itemActions.setMolding(chMolding, false);
3686
+ });
3687
+ }, 200);
3688
+ }
3689
+ return temp_MGArray;
3690
+ } catch (e) {
3691
+ console.log('updateMoldingGroupArray catched :', e);
3692
+ return MGArray;
3693
+ }
3694
+ }
3695
+ export function removeSelItemMesh(MGArray, selItem, planData, mode) {
3696
+ if (selItem) {
3697
+ if (!selItem.selected) {
3698
+ return;
3699
+ }
3700
+ MGArray.forEach(function (mg) {
3701
+ if (mg.items.some(function (it) {
3702
+ return it.id === selItem.id;
3703
+ })) deleteMGMesh(mg, planData, mode);
3704
+ });
3705
+ }
3706
+ }
3707
+
3708
+ /**
3709
+ * Flip door handle
3710
+ * @param item Scene state item ( redux )
3711
+ * @param item3D Mesh
3712
+ * @param {Boolean} flip Determines handle position.
3713
+ * @note When `flip` is set
3714
+ *
3715
+ * `true`
3716
+ * * Left side door - use left handle (LL)
3717
+ * * Right side door - use right handle (RR)
3718
+ *
3719
+ * `false`
3720
+ * * Left side door - use right handle (LR)
3721
+ * * Right side door - use left handle (RL)
3722
+ *
3723
+ * And one-door-cabinet is the same case with the left door of two-door-cabinet
3724
+ */
3725
+ export function updateDoorHandleMesh(_, item3D, flip) {
3726
+ if (!item3D) {
3727
+ console.error('Item mesh is undefined.');
3728
+ return;
3729
+ }
3730
+
3731
+ /**
3732
+ * Mesh whose name pass this regexp is a place holder for a door
3733
+ * which is the parent or grand parent of a door mesh and its handles
3734
+ */
3735
+ var doorReg = /ph_.*[^(drawer)]_door(?:_(L|R))?(?:_[1-9])?$/;
3736
+ var doorHandleReg = /ph_.*_door_.*_handle_(L|R)?(_[1-9])?/;
3737
+ item3D.traverse(function (child) {
3738
+ /**
3739
+ * Hold the name of the place holder for door and its position
3740
+ * @type {[string,"L"|"R"|undefined]}
3741
+ */
3742
+ var doorRegResult = doorReg.exec(child.name);
3743
+ if (doorRegResult) {
3744
+ // `child` is place holder for door mesh, and also grand parent of on[0]e
3745
+ var phDoor = child.children[0];
3746
+ if (!phDoor) {
3747
+ return console.error('Group is no valid.');
3748
+ }
3749
+ var doorHandle = null;
3750
+ var phRight = null;
3751
+ var phLeft = null;
3752
+
3753
+ // Find door_handle, ph_left, ph_right 3D item
3754
+ phDoor.traverse(function (childOfDoor) {
3755
+ /**
3756
+ * @type {[string, "L"|"R"]}
3757
+ */
3758
+ var result = doorHandleReg.exec(childOfDoor.name);
3759
+ if (result !== null) {
3760
+ // `childOfDoor` is place holder for door handle
3761
+
3762
+ switch (result[1]) {
3763
+ case 'L':
3764
+ phLeft = childOfDoor;
3765
+ break;
3766
+ case 'R':
3767
+ phRight = childOfDoor;
3768
+ break;
3769
+ default:
3770
+ console.error('Place holder type should be L or R.');
3771
+ return;
3772
+ }
3773
+ if (childOfDoor.children.length !== 0) {
3774
+ // It has a door handle
3775
+ doorHandle = childOfDoor.children[0];
3776
+ }
3777
+ }
3778
+ });
3779
+
3780
+ // Change door handle position
3781
+ if (doorHandle && phLeft && phRight) {
3782
+ // Remove handles for re-addition
3783
+ if (phLeft.children.length) {
3784
+ phLeft.remove(doorHandle);
3785
+ }
3786
+ if (phRight.children.length) {
3787
+ phRight.remove(doorHandle);
3788
+ }
3789
+ switch (doorRegResult[1]) {
3790
+ case undefined: // Single door cabinet
3791
+ case 'R':
3792
+ // Right side door
3793
+ (flip ? phRight : phLeft).add(doorHandle);
3794
+ break;
3795
+ case 'L':
3796
+ // Left side door
3797
+ (flip ? phLeft : phRight).add(doorHandle);
3798
+ break;
3799
+ }
3800
+ } else {
3801
+ console.error('door_handle or ph_left or ph_right is null.');
3802
+ }
3803
+ }
3804
+ });
3805
+ }
3806
+ export function addWarningBox(itemId, altitude, planData) {
3807
+ deleteSpecifiedMeshObjects('WarningBox' + itemId);
3808
+ var item3D = planData.sceneGraph.layers[planData.sceneData.selectedLayer].items[itemId];
3809
+ if (item3D == undefined) return;
3810
+ var altitudeLength = altitude;
3811
+ var sBounding = item3D.children[0].userData;
3812
+ var width = sBounding.max.x - sBounding.min.x;
3813
+ var height = sBounding.max.y - sBounding.min.y;
3814
+ var depth = sBounding.max.z - sBounding.min.z;
3815
+ var warnBoxGeom = new Three.BoxGeometry(width, height, depth);
3816
+ var warnBoxObj = new Three.Mesh(warnBoxGeom, new Three.MeshBasicMaterial({
3817
+ color: 0xff2200,
3818
+ opacity: 0.8,
3819
+ transparent: true,
3820
+ blending: Three.MultiplyBlending
3821
+ }));
3822
+ var box = new Three.BoxHelper(warnBoxObj, 0x000000);
3823
+ box.material.linewidth = 2;
3824
+ box.material.depthTest = false;
3825
+ box.renderOrder = 200;
3826
+ warnBoxObj.add(box);
3827
+ warnBoxObj.position.set(item3D.position.x, altitudeLength + item3D.position.y + height / 2, item3D.position.z);
3828
+ warnBoxObj.rotation.set(item3D.rotation.x, item3D.rotation.y, item3D.rotation.z);
3829
+ warnBoxObj.name = 'WarningBox' + itemId;
3830
+ // planData.plan.add(warnBoxObj);
3831
+ }
3832
+ export function checkCabinetOverlap(itemPos, itemRect, holeItems, planData) {
3833
+ if (holeItems.length) {
3834
+ var depth = itemRect.size.depth;
3835
+ var i;
3836
+ for (i = 0; i < holeItems.length; i++) {
3837
+ var hole = holeItems[i];
3838
+ var holeAlti = hole.altitude;
3839
+ if (holeAlti >= depth) continue;
3840
+ if (Math.abs(Math.sin(itemRect.rotRad)) === 1) {
3841
+ if (itemPos.y + itemRect.size.width / 2 >= hole.y - hole.width / 2 && itemPos.y - itemRect.size.width / 2 <= hole.y + hole.width / 2 && (itemRect.rotRad == 0 || itemRect.rotRad == -Math.PI / 2 ? itemPos.x <= hole.x && itemPos.x + itemRect.size.height >= hole.x : itemPos.x >= hole.x && itemPos.x - itemRect.size.height <= hole.x)) break;
3842
+ } else {
3843
+ if (itemPos.x + itemRect.size.width / 2 >= hole.x - hole.width / 2 && itemPos.x - itemRect.size.width / 2 <= hole.x + hole.width / 2 && (itemRect.rotRad == 0 || itemRect.rotRad == -Math.PI / 2 ? itemPos.y <= hole.y && itemPos.y + itemRect.size.height >= hole.y : itemPos.y >= hole.y && itemPos.y - itemRect.size.height <= hole.y)) break;
3844
+ }
3845
+ }
3846
+ if (i != holeItems.length) {
3847
+ var altitude = itemRect.itemInfo.properties.get('altitude').get('_length');
3848
+ var altitudeUnit = itemRect.itemInfo.properties.get('altitude').get('_unit') || 'cm';
3849
+ altitude = convert(altitude).from(altitudeUnit).to('cm');
3850
+ addWarningBox(itemRect.itemInfo.id, altitude, planData);
3851
+ }
3852
+ }
3853
+ }