kitchen-simulator 5.0.0-test.7 → 5.0.0-test.71

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 (606) hide show
  1. package/README.md +1 -1
  2. package/package.json +22 -63
  3. package/src/KitchenConfiguratorApp.jsx +5 -5
  4. package/src/_KitchenConfigurator.jsx +578 -0
  5. package/src/actions/export.js +2 -5
  6. package/src/assets/Window.hdr +2100 -0
  7. package/src/assets/brown_photostudio_02_1k.hdr +0 -0
  8. package/src/assets/fonts/Rene Bieder Milliard Black Italic.woff +0 -0
  9. package/src/assets/fonts/Rene Bieder Milliard Black.woff +0 -0
  10. package/src/assets/fonts/Rene Bieder Milliard Bold Italic.woff +0 -0
  11. package/src/assets/fonts/Rene Bieder Milliard Bold.woff +0 -0
  12. package/src/assets/fonts/Rene Bieder Milliard Book Italic.woff +0 -0
  13. package/src/assets/fonts/Rene Bieder Milliard Book.woff +0 -0
  14. package/src/assets/fonts/Rene Bieder Milliard ExtraBold Italic.woff +0 -0
  15. package/src/assets/fonts/Rene Bieder Milliard ExtraBold.woff +0 -0
  16. package/src/assets/fonts/Rene Bieder Milliard ExtraLight Italic.woff +0 -0
  17. package/src/assets/fonts/Rene Bieder Milliard ExtraLight.woff +0 -0
  18. package/src/assets/fonts/Rene Bieder Milliard Hairline Italic.woff +0 -0
  19. package/src/assets/fonts/Rene Bieder Milliard Hairline.woff +0 -0
  20. package/src/assets/fonts/Rene Bieder Milliard Heavy Italic.woff +0 -0
  21. package/src/assets/fonts/Rene Bieder Milliard Heavy.woff +0 -0
  22. package/src/assets/fonts/Rene Bieder Milliard Light Italic.woff +0 -0
  23. package/src/assets/fonts/Rene Bieder Milliard Light.woff +0 -0
  24. package/src/assets/fonts/Rene Bieder Milliard Medium Italic.woff +0 -0
  25. package/src/assets/fonts/Rene Bieder Milliard Medium.woff +0 -0
  26. package/src/assets/fonts/Rene Bieder Milliard SemiBold Italic.woff +0 -0
  27. package/src/assets/fonts/Rene Bieder Milliard SemiBold.woff +0 -0
  28. package/src/assets/fonts/Rene Bieder Milliard Thin Italic.woff +0 -0
  29. package/src/assets/fonts/Rene Bieder Milliard Thin.woff +0 -0
  30. package/src/assets/fonts/style.css +177 -0
  31. package/src/assets/gltf/door_closet.bin +0 -0
  32. package/src/assets/gltf/door_closet.fbx +0 -0
  33. package/src/assets/gltf/door_closet.gltf +1 -0
  34. package/src/assets/gltf/door_exterior.bin +0 -0
  35. package/src/assets/gltf/door_exterior.fbx +0 -0
  36. package/src/assets/gltf/door_exterior.gltf +1 -0
  37. package/src/assets/gltf/door_interior.bin +0 -0
  38. package/src/assets/gltf/door_interior.fbx +0 -0
  39. package/src/assets/gltf/door_interior.gltf +1 -0
  40. package/src/assets/gltf/door_sliding.bin +0 -0
  41. package/src/assets/gltf/door_sliding.fbx +0 -0
  42. package/src/assets/gltf/door_sliding.gltf +1 -0
  43. package/src/assets/gltf/doorway_framed.bin +0 -0
  44. package/src/assets/gltf/doorway_framed.fbx +0 -0
  45. package/src/assets/gltf/doorway_framed.gltf +1 -0
  46. package/src/assets/gltf/window_clear.bin +0 -0
  47. package/src/assets/gltf/window_clear.fbx +0 -0
  48. package/src/assets/gltf/window_clear.gltf +1 -0
  49. package/src/assets/gltf/window_cross.bin +0 -0
  50. package/src/assets/gltf/window_cross.fbx +0 -0
  51. package/src/assets/gltf/window_cross.gltf +1 -0
  52. package/src/assets/gltf/window_double_hung.bin +0 -0
  53. package/src/assets/gltf/window_double_hung.fbx +0 -0
  54. package/src/assets/gltf/window_double_hung.gltf +1 -0
  55. package/src/assets/gltf/window_vertical.bin +0 -0
  56. package/src/assets/gltf/window_vertical.fbx +0 -0
  57. package/src/assets/gltf/window_vertical.gltf +1 -0
  58. package/src/assets/img/1.jpg +0 -0
  59. package/src/assets/img/TKC_thumbnail.png +0 -0
  60. package/src/assets/img/Toggle.png +0 -0
  61. package/src/assets/img/loading/loading.gif +0 -0
  62. package/src/assets/img/loading/loading_1.svg +11 -0
  63. package/src/assets/img/loading_large.gif +0 -0
  64. package/src/assets/img/png/door/closet.png +0 -0
  65. package/src/assets/img/png/door/doorwaysframed.png +0 -0
  66. package/src/assets/img/png/door/doorwaysframeles.png +0 -0
  67. package/src/assets/img/png/door/doorwaysframeless.png +0 -0
  68. package/src/assets/img/png/door/exterior.png +0 -0
  69. package/src/assets/img/png/door/interior.png +0 -0
  70. package/src/assets/img/png/door/sliding.png +0 -0
  71. package/src/assets/img/png/helper/outcome.png +0 -0
  72. package/src/assets/img/png/helper/video_preview_3d.png +0 -0
  73. package/src/assets/img/png/helper/video_preview_start.png +0 -0
  74. package/src/assets/img/project_img.png +0 -0
  75. package/src/assets/img/rta/rta_logo_box_blue.jpg +0 -0
  76. package/src/assets/img/rta/rta_logo_box_blue_ico.jpg +0 -0
  77. package/src/assets/img/rta/rta_logo_box_blue_ico.svg +55 -0
  78. package/src/assets/img/rta/rta_logo_box_darkGray.jpg +0 -0
  79. package/src/assets/img/rta/rta_logo_box_lightblue.png +0 -0
  80. package/src/assets/img/rta/rta_logo_box_lightmaroon.png +0 -0
  81. package/src/assets/img/rta/rta_logo_box_maroon.png +0 -0
  82. package/src/assets/img/rta/rta_logo_box_white.png +0 -0
  83. package/src/assets/img/rta_menu.png +0 -0
  84. package/src/assets/img/step2.jpg +0 -0
  85. package/src/assets/img/step3.jpg +0 -0
  86. package/src/assets/img/step4.jpg +0 -0
  87. package/src/assets/img/step5.jpg +0 -0
  88. package/src/assets/img/step6.jpg +0 -0
  89. package/src/assets/img/step7.jpg +0 -0
  90. package/src/assets/img/step8.jpg +0 -0
  91. package/src/assets/img/svg/2d_delete_object.svg +33 -0
  92. package/src/assets/img/svg/2d_delete_object1.svg +33 -0
  93. package/src/assets/img/svg/2d_lock_object.svg +33 -0
  94. package/src/assets/img/svg/3d_item_move.svg +106 -0
  95. package/src/assets/img/svg/3d_item_rotation.svg +76 -0
  96. package/src/assets/img/svg/3d_item_warning_edit.svg +77 -0
  97. package/src/assets/img/svg/3d_item_warning_info.svg +81 -0
  98. package/src/assets/img/svg/accessories.svg +4 -0
  99. package/src/assets/img/svg/angle_icon.svg +39 -0
  100. package/src/assets/img/svg/blank_div.svg +14 -0
  101. package/src/assets/img/svg/bottombar/2d3d_button.svg +3 -0
  102. package/src/assets/img/svg/bottombar/2d3d_button_active.svg +3 -0
  103. package/src/assets/img/svg/bottombar/2d3d_toggle.svg +4 -0
  104. package/src/assets/img/svg/bottombar/2d3d_toggle_active.svg +4 -0
  105. package/src/assets/img/svg/bottombar/arrow-down.svg +3 -0
  106. package/src/assets/img/svg/bottombar/arrow-left.svg +3 -0
  107. package/src/assets/img/svg/bottombar/arrow-minus.svg +3 -0
  108. package/src/assets/img/svg/bottombar/arrow-plus.svg +11 -0
  109. package/src/assets/img/svg/bottombar/arrow-right.svg +3 -0
  110. package/src/assets/img/svg/bottombar/arrow-up.svg +3 -0
  111. package/src/assets/img/svg/bottombar/collapse.svg +3 -0
  112. package/src/assets/img/svg/bottombar/elevation-back.svg +6 -0
  113. package/src/assets/img/svg/bottombar/elevation-front.svg +6 -0
  114. package/src/assets/img/svg/bottombar/elevation-left.svg +6 -0
  115. package/src/assets/img/svg/bottombar/elevation-right.svg +7 -0
  116. package/src/assets/img/svg/bottombar/elevation.svg +6 -0
  117. package/src/assets/img/svg/bottombar/expand.svg +3 -0
  118. package/src/assets/img/svg/bottombar/help.svg +72 -0
  119. package/src/assets/img/svg/bottombar/incm_toggle.svg +39 -0
  120. package/src/assets/img/svg/bottombar/pan_1.svg +57 -0
  121. package/src/assets/img/svg/bottombar/pan_2.svg +27 -0
  122. package/src/assets/img/svg/bottombar/pan_3.svg +27 -0
  123. package/src/assets/img/svg/bottombar/pan_4.svg +27 -0
  124. package/src/assets/img/svg/bottombar/pan_5.svg +27 -0
  125. package/src/assets/img/svg/bottombar/settings.svg +23 -0
  126. package/src/assets/img/svg/bottombar/spin-down.svg +76 -0
  127. package/src/assets/img/svg/bottombar/spin-left.svg +75 -0
  128. package/src/assets/img/svg/bottombar/spin-right.svg +75 -0
  129. package/src/assets/img/svg/bottombar/spin-up.svg +76 -0
  130. package/src/assets/img/svg/bottombar/spin_1.svg +48 -0
  131. package/src/assets/img/svg/bottombar/spin_2.svg +31 -0
  132. package/src/assets/img/svg/bottombar/spin_3.svg +31 -0
  133. package/src/assets/img/svg/bottombar/spin_4.svg +31 -0
  134. package/src/assets/img/svg/bottombar/spin_5.svg +31 -0
  135. package/src/assets/img/svg/bottombar/zoomin.svg +29 -0
  136. package/src/assets/img/svg/bottombar/zoomout.svg +26 -0
  137. package/src/assets/img/svg/check.svg +10 -0
  138. package/src/assets/img/svg/close.svg +11 -0
  139. package/src/assets/img/svg/color/Black.svg +3 -0
  140. package/src/assets/img/svg/color/Blue.svg +3 -0
  141. package/src/assets/img/svg/color/Brown.svg +9 -0
  142. package/src/assets/img/svg/color/Cream.svg +3 -0
  143. package/src/assets/img/svg/color/Dark.svg +9 -0
  144. package/src/assets/img/svg/color/Gray.svg +3 -0
  145. package/src/assets/img/svg/color/Green.svg +3 -0
  146. package/src/assets/img/svg/color/Light.svg +9 -0
  147. package/src/assets/img/svg/color/Medium.svg +9 -0
  148. package/src/assets/img/svg/color/Unfinished.svg +9 -0
  149. package/src/assets/img/svg/color/White.svg +3 -0
  150. package/src/assets/img/svg/color/White.svg.bak +3 -0
  151. package/src/assets/img/svg/color/stone2.jpg +0 -0
  152. package/src/assets/img/svg/color/wood2.jpg +0 -0
  153. package/src/assets/img/svg/copy.svg +11 -0
  154. package/src/assets/img/svg/delete.svg +3 -0
  155. package/src/assets/img/svg/detail.svg +77 -0
  156. package/src/assets/img/svg/door/Closet.svg +11 -0
  157. package/src/assets/img/svg/door/Exterior.svg +5 -0
  158. package/src/assets/img/svg/door/Framed_dorway.svg +5 -0
  159. package/src/assets/img/svg/door/Frameless_dorway.svg +5 -0
  160. package/src/assets/img/svg/door/Interior.svg +7 -0
  161. package/src/assets/img/svg/door/Sliding.svg +5 -0
  162. package/src/assets/img/svg/doors_closet.svg +47 -0
  163. package/src/assets/img/svg/doors_exterior.svg +25 -0
  164. package/src/assets/img/svg/doors_interior.svg +29 -0
  165. package/src/assets/img/svg/doors_patio.svg +26 -0
  166. package/src/assets/img/svg/duplicate.svg +11 -0
  167. package/src/assets/img/svg/duplicate_object_left.svg +32 -0
  168. package/src/assets/img/svg/duplicate_object_right.svg +32 -0
  169. package/src/assets/img/svg/filtersActive.svg +19 -0
  170. package/src/assets/img/svg/firstsetting/L.svg +3 -0
  171. package/src/assets/img/svg/firstsetting/L2.svg +3 -0
  172. package/src/assets/img/svg/firstsetting/Open.svg +3 -0
  173. package/src/assets/img/svg/firstsetting/Square.svg +3 -0
  174. package/src/assets/img/svg/firstsetting/bar-active.svg +9 -0
  175. package/src/assets/img/svg/firstsetting/bar-normal.svg +3 -0
  176. package/src/assets/img/svg/firstsetting/bullet-current.svg +3 -0
  177. package/src/assets/img/svg/firstsetting/bullet-done.svg +3 -0
  178. package/src/assets/img/svg/firstsetting/bullet-not-done.svg +3 -0
  179. package/src/assets/img/svg/firstsetting/check-active.svg +3 -0
  180. package/src/assets/img/svg/firstsetting/check-normal.svg +3 -0
  181. package/src/assets/img/svg/firstsetting/pencil.svg +11 -0
  182. package/src/assets/img/svg/green_checkmark.svg +27 -0
  183. package/src/assets/img/svg/headerbar/assist.svg +3 -0
  184. package/src/assets/img/svg/headerbar/cart.svg +3 -0
  185. package/src/assets/img/svg/headerbar/check.svg +10 -0
  186. package/src/assets/img/svg/headerbar/consult_designer.svg +45 -0
  187. package/src/assets/img/svg/headerbar/edit_name.svg +26 -0
  188. package/src/assets/img/svg/headerbar/file-dollar.svg +13 -0
  189. package/src/assets/img/svg/headerbar/hamburger_menu.svg +32 -0
  190. package/src/assets/img/svg/headerbar/plus.svg +11 -0
  191. package/src/assets/img/svg/headerbar/review_quote.svg +44 -0
  192. package/src/assets/img/svg/headerbar/ruler-measure.svg +11 -0
  193. package/src/assets/img/svg/headerbar/save.svg +3 -0
  194. package/src/assets/img/svg/headerbar/setting.svg +75 -0
  195. package/src/assets/img/svg/help/check.svg +10 -0
  196. package/src/assets/img/svg/help/search.svg +76 -0
  197. package/src/assets/img/svg/intro/1-start-with-floorplan-whole.svg +27 -0
  198. package/src/assets/img/svg/intro/1-start-with-floorplan.svg +26 -0
  199. package/src/assets/img/svg/intro/2-start-from-scratch-whole.svg +28 -0
  200. package/src/assets/img/svg/intro/2-start-from-scratch.svg +27 -0
  201. package/src/assets/img/svg/intro/3-retrieve-project-whole.svg +19 -0
  202. package/src/assets/img/svg/intro/3-retrieve-project.svg +18 -0
  203. package/src/assets/img/svg/invert.svg +127 -0
  204. package/src/assets/img/svg/lefttoolbar/appliance-active.svg +13 -0
  205. package/src/assets/img/svg/lefttoolbar/appliance.svg +13 -0
  206. package/src/assets/img/svg/lefttoolbar/cabinet-active.svg +10 -0
  207. package/src/assets/img/svg/lefttoolbar/cabinet-category.svg +3 -0
  208. package/src/assets/img/svg/lefttoolbar/cabinet-one.svg +3 -0
  209. package/src/assets/img/svg/lefttoolbar/cabinet.svg +10 -0
  210. package/src/assets/img/svg/lefttoolbar/disigner_assistance.svg +89 -0
  211. package/src/assets/img/svg/lefttoolbar/door-style-active.svg +20 -0
  212. package/src/assets/img/svg/lefttoolbar/door-style.svg +20 -0
  213. package/src/assets/img/svg/lefttoolbar/door.svg +12 -0
  214. package/src/assets/img/svg/lefttoolbar/error_icon.svg +81 -0
  215. package/src/assets/img/svg/lefttoolbar/finishing-active.svg +13 -0
  216. package/src/assets/img/svg/lefttoolbar/finishing.svg +13 -0
  217. package/src/assets/img/svg/lefttoolbar/reviewforquote-active.svg +86 -0
  218. package/src/assets/img/svg/lefttoolbar/reviewforquote.svg +12 -0
  219. package/src/assets/img/svg/lefttoolbar/room-shape-L.svg +3 -0
  220. package/src/assets/img/svg/lefttoolbar/room-shape-active.svg +18 -0
  221. package/src/assets/img/svg/lefttoolbar/room-shape-custom.svg +12 -0
  222. package/src/assets/img/svg/lefttoolbar/room-shape-irregular.svg +3 -0
  223. package/src/assets/img/svg/lefttoolbar/room-shape-open.svg +3 -0
  224. package/src/assets/img/svg/lefttoolbar/room-shape-square.svg +3 -0
  225. package/src/assets/img/svg/lefttoolbar/room-shape.svg +18 -0
  226. package/src/assets/img/svg/lefttoolbar/search.svg +76 -0
  227. package/src/assets/img/svg/lefttoolbar/view_more.svg +86 -0
  228. package/src/assets/img/svg/lefttoolbar/warning_icon.svg +81 -0
  229. package/src/assets/img/svg/lefttoolbar/window.svg +12 -0
  230. package/src/assets/img/svg/menubar/login.svg +84 -0
  231. package/src/assets/img/svg/menubar/my_projects.svg +85 -0
  232. package/src/assets/img/svg/menubar/new_project.svg +110 -0
  233. package/src/assets/img/svg/menubar/save_project.svg +84 -0
  234. package/src/assets/img/svg/options.svg +3 -0
  235. package/src/assets/img/svg/positioning.svg +3 -0
  236. package/src/assets/img/svg/rotate.png +0 -0
  237. package/src/assets/img/svg/rotate.svg +17 -0
  238. package/src/assets/img/svg/rotate_object_clockwise.svg +26 -0
  239. package/src/assets/img/svg/rotate_object_counterclockwise.svg +26 -0
  240. package/src/assets/img/svg/toggleFilters.svg +19 -0
  241. package/src/assets/img/svg/toolbar/add_appliances_active.svg +64 -0
  242. package/src/assets/img/svg/toolbar/add_appliances_inactive.svg +52 -0
  243. package/src/assets/img/svg/toolbar/add_button.svg +36 -0
  244. package/src/assets/img/svg/toolbar/add_cabinets_active.svg +59 -0
  245. package/src/assets/img/svg/toolbar/add_cabinets_inactive.svg +49 -0
  246. package/src/assets/img/svg/toolbar/add_items_doors.svg +25 -0
  247. package/src/assets/img/svg/toolbar/add_items_doorways.svg +24 -0
  248. package/src/assets/img/svg/toolbar/add_items_refrigerator.svg +32 -0
  249. package/src/assets/img/svg/toolbar/add_items_windows.svg +28 -0
  250. package/src/assets/img/svg/toolbar/apply_button.svg +38 -0
  251. package/src/assets/img/svg/toolbar/arrow-plus.svg +11 -0
  252. package/src/assets/img/svg/toolbar/backsplash.svg +8 -0
  253. package/src/assets/img/svg/toolbar/cancel_button.svg +37 -0
  254. package/src/assets/img/svg/toolbar/consult_a_designer_button.svg +47 -0
  255. package/src/assets/img/svg/toolbar/countertop.svg +7 -0
  256. package/src/assets/img/svg/toolbar/dcm.png +0 -0
  257. package/src/assets/img/svg/toolbar/dcm_off.svg +12 -0
  258. package/src/assets/img/svg/toolbar/dcm_on.svg +474 -0
  259. package/src/assets/img/svg/toolbar/delete_button.svg +37 -0
  260. package/src/assets/img/svg/toolbar/download.svg +77 -0
  261. package/src/assets/img/svg/toolbar/draw_custom_floor.svg +31 -0
  262. package/src/assets/img/svg/toolbar/edit_button.svg +75 -0
  263. package/src/assets/img/svg/toolbar/email_quote_button.svg +44 -0
  264. package/src/assets/img/svg/toolbar/fbm.png +0 -0
  265. package/src/assets/img/svg/toolbar/finishing_touches_active.svg +54 -0
  266. package/src/assets/img/svg/toolbar/finishing_touches_inactive.svg +42 -0
  267. package/src/assets/img/svg/toolbar/floorstyle.svg +9 -0
  268. package/src/assets/img/svg/toolbar/fmb.png +0 -0
  269. package/src/assets/img/svg/toolbar/fmb_off.svg +12 -0
  270. package/src/assets/img/svg/toolbar/fmb_on.svg +489 -0
  271. package/src/assets/img/svg/toolbar/furnishings_icon.svg +6 -0
  272. package/src/assets/img/svg/toolbar/get_started_button.svg +41 -0
  273. package/src/assets/img/svg/toolbar/handles.svg +5 -0
  274. package/src/assets/img/svg/toolbar/lighting.svg +7 -0
  275. package/src/assets/img/svg/toolbar/lrm.png +0 -0
  276. package/src/assets/img/svg/toolbar/lrm_off.svg +12 -0
  277. package/src/assets/img/svg/toolbar/lrm_on.svg +470 -0
  278. package/src/assets/img/svg/toolbar/make_floorplan_active.svg +66 -0
  279. package/src/assets/img/svg/toolbar/make_floorplan_inactive.svg +52 -0
  280. package/src/assets/img/svg/toolbar/predefined_room_l_shaped.svg +20 -0
  281. package/src/assets/img/svg/toolbar/predefined_room_layout.svg +20 -0
  282. package/src/assets/img/svg/toolbar/predefined_room_long_narrow.svg +20 -0
  283. package/src/assets/img/svg/toolbar/predefined_room_open_l_shape.svg +20 -0
  284. package/src/assets/img/svg/toolbar/predefined_room_open_pentagon.svg +20 -0
  285. package/src/assets/img/svg/toolbar/predefined_room_open_rectangle.svg +20 -0
  286. package/src/assets/img/svg/toolbar/predefined_room_open_rectangle_2.svg +20 -0
  287. package/src/assets/img/svg/toolbar/predefined_room_pentagon.svg +20 -0
  288. package/src/assets/img/svg/toolbar/predefined_room_rectangle.svg +20 -0
  289. package/src/assets/img/svg/toolbar/predefined_room_rectangle_with_alcove.svg +20 -0
  290. package/src/assets/img/svg/toolbar/redo_button.svg +75 -0
  291. package/src/assets/img/svg/toolbar/redo_button1.svg +75 -0
  292. package/src/assets/img/svg/toolbar/review_quote_active.svg +14 -0
  293. package/src/assets/img/svg/toolbar/review_quote_inactive.svg +44 -0
  294. package/src/assets/img/svg/toolbar/save_project_button.svg +44 -0
  295. package/src/assets/img/svg/toolbar/select_doorstyle_active.svg +67 -0
  296. package/src/assets/img/svg/toolbar/select_doorstyle_inactive.svg +57 -0
  297. package/src/assets/img/svg/toolbar/shopping-cart.svg +13 -0
  298. package/src/assets/img/svg/toolbar/style_change_button.svg +47 -0
  299. package/src/assets/img/svg/toolbar/take_picture.svg +75 -0
  300. package/src/assets/img/svg/toolbar/undo_button.svg +76 -0
  301. package/src/assets/img/svg/toolbar/undo_button1.svg +76 -0
  302. package/src/assets/img/svg/toolbar/use_button.svg +37 -0
  303. package/src/assets/img/svg/toolbar/wall_color_icon.svg +6 -0
  304. package/src/assets/img/svg/topbar/edit_active.svg +10 -0
  305. package/src/assets/img/svg/topbar/edit_inactive.svg +10 -0
  306. package/src/assets/img/svg/topbar/redo_active.svg +42 -0
  307. package/src/assets/img/svg/topbar/redo_inactive.svg +23 -0
  308. package/src/assets/img/svg/topbar/select_all_active.svg +50 -0
  309. package/src/assets/img/svg/topbar/select_all_inactive.svg +32 -0
  310. package/src/assets/img/svg/topbar/take_picture_active.svg +51 -0
  311. package/src/assets/img/svg/topbar/take_picture_inactive.svg +26 -0
  312. package/src/assets/img/svg/topbar/undo_active.svg +42 -0
  313. package/src/assets/img/svg/topbar/undo_inactive.svg +23 -0
  314. package/src/assets/img/svg/warning_info_2d.svg +81 -0
  315. package/src/assets/img/svg/window/Clear.svg +3 -0
  316. package/src/assets/img/svg/window/Cross.svg +5 -0
  317. package/src/assets/img/svg/window/Double_hung.svg +4 -0
  318. package/src/assets/img/svg/window/Vertical.svg +4 -0
  319. package/src/assets/img/svg/windows_clear.svg +23 -0
  320. package/src/assets/img/svg/windows_cross.svg +28 -0
  321. package/src/assets/img/svg/windows_double_hung.svg +24 -0
  322. package/src/assets/img/svg/windows_vertical.svg +24 -0
  323. package/src/assets/img/svg/wizardstep/Custom.svg +3 -0
  324. package/src/assets/img/svg/wizardstep/Dashed_line.svg +3 -0
  325. package/src/assets/img/svg/wizardstep/L.svg +3 -0
  326. package/src/assets/img/svg/wizardstep/L2.svg +3 -0
  327. package/src/assets/img/svg/wizardstep/Open.svg +3 -0
  328. package/src/assets/img/svg/wizardstep/Square.svg +3 -0
  329. package/src/assets/img/svg/wizardstep/bar-active.svg +9 -0
  330. package/src/assets/img/svg/wizardstep/bar-normal.svg +3 -0
  331. package/src/assets/img/svg/wizardstep/bullet-current.svg +3 -0
  332. package/src/assets/img/svg/wizardstep/bullet-done.svg +3 -0
  333. package/src/assets/img/svg/wizardstep/bullet-not-done.svg +3 -0
  334. package/src/assets/img/svg/wizardstep/check-active.svg +3 -0
  335. package/src/assets/img/svg/wizardstep/check-normal.svg +3 -0
  336. package/src/assets/img/svg/wizardstep/detail_view.svg +87 -0
  337. package/src/assets/img/svg/wizardstep/pencil.svg +11 -0
  338. package/src/assets/img/svg/wizardstep/tile_view.svg +95 -0
  339. package/src/assets/img/texture/glass.jpg +0 -0
  340. package/src/assets/img/texture/steel.jpg +0 -0
  341. package/src/assets/img/texture/white1px.jpg +0 -0
  342. package/src/assets/img/texture/wood.jpg +0 -0
  343. package/src/assets/model/DCM.bin +0 -0
  344. package/src/assets/model/DCM.fbx +0 -0
  345. package/src/assets/model/DCM.gltf +1 -0
  346. package/src/assets/model/FBM.bin +0 -0
  347. package/src/assets/model/FBM.fbx +0 -0
  348. package/src/assets/model/FBM.gltf +1 -0
  349. package/src/assets/model/LRM.bin +0 -0
  350. package/src/assets/model/LRM.fbx +0 -0
  351. package/src/assets/model/LRM.gltf +1 -0
  352. package/src/assets/rtastore_logo.png +0 -0
  353. package/src/catalog/areas/area/planner-element.jsx +1 -1
  354. package/src/catalog/factories/wall-factory-3d.js +11 -18
  355. package/src/catalog/holes/index.js +13 -0
  356. package/src/catalog/lines/wall/planner-element.jsx +1 -1
  357. package/src/catalog/mycatalog.js +26 -0
  358. package/src/catalog/properties/property-checkbox.jsx +64 -68
  359. package/src/catalog/properties/property-color.jsx +1 -1
  360. package/src/catalog/properties/property-enum.jsx +37 -40
  361. package/src/catalog/properties/property-hidden.jsx +1 -1
  362. package/src/catalog/properties/property-lenght-measure.jsx +2 -2
  363. package/src/catalog/properties/property-length-measure.jsx +37 -40
  364. package/src/catalog/properties/property-length-measure_hole.jsx +2 -2
  365. package/src/catalog/properties/property-number.jsx +1 -1
  366. package/src/catalog/properties/property-read-only.jsx +1 -1
  367. package/src/catalog/properties/property-string.jsx +1 -1
  368. package/src/catalog/properties/property-toggle.jsx +1 -1
  369. package/src/catalog/utils/exporter.js +1 -1
  370. package/src/catalog/utils/item-loader.jsx +1 -1
  371. package/src/class/item.js +1 -1
  372. package/src/components/content.jsx +1 -19
  373. package/src/components/export.js +2 -29
  374. package/src/components/style/button.jsx +1 -1
  375. package/src/components/style/export.js +24 -0
  376. package/src/components/style/form-number-input.jsx +3 -29
  377. package/src/components/style/form-select.jsx +2 -31
  378. package/src/components/style/form-text-input.jsx +20 -22
  379. package/src/components/viewer2d/area.jsx +2 -2
  380. package/src/components/viewer2d/grids/grid-horizontal-streak.jsx +2 -2
  381. package/src/components/viewer2d/grids/grid-streak.jsx +2 -2
  382. package/src/components/viewer2d/grids/grid-vertical-streak.jsx +2 -2
  383. package/src/components/viewer2d/grids/grids.jsx +1 -1
  384. package/src/components/viewer2d/group.jsx +1 -1
  385. package/src/components/viewer2d/item.jsx +3 -11
  386. package/src/components/viewer2d/layer.jsx +1 -1
  387. package/src/components/viewer2d/line.jsx +30 -33
  388. package/src/components/viewer2d/ruler.jsx +2 -3
  389. package/src/components/viewer2d/rulerDist.jsx +6 -6
  390. package/src/components/viewer2d/rulerX.jsx +1 -1
  391. package/src/components/viewer2d/rulerY.jsx +1 -1
  392. package/src/components/viewer2d/scene.jsx +1 -1
  393. package/src/components/viewer2d/snap.jsx +1 -1
  394. package/src/components/viewer2d/state.jsx +1 -1
  395. package/src/components/viewer2d/vertex.jsx +2 -2
  396. package/src/components/viewer2d/viewer2d.jsx +3 -3
  397. package/src/components/viewer3d/pointer-lock-navigation.js +1 -1
  398. package/src/components/viewer3d/ruler-utils/itemRect.jsx +91 -91
  399. package/src/components/viewer3d/ruler-utils/layer3D.jsx +528 -528
  400. package/src/components/viewer3d/ruler-utils/scene3D.jsx +85 -87
  401. package/src/components/viewer3d/scene-creator.js +1 -1
  402. package/src/components/viewer3d/viewer3d-first-person.js +2 -2
  403. package/src/components/viewer3d/{viewer3d.js → viewer3d.jsx} +3 -3
  404. package/src/constants.js +3 -0
  405. package/src/index.js +0 -2
  406. package/src/models.js +1 -1
  407. package/src/reducers/viewer2d-reducer.js +1 -1
  408. package/src/reducers/viewer3d-reducer.js +1 -1
  409. package/src/styles/export.js +7 -0
  410. package/src/styles/tabs.css +40 -0
  411. package/src/utils/geometry.js +2 -2
  412. package/src/utils/graph-inner-cycles.js +3 -3
  413. package/src/utils/helper.js +1 -1
  414. package/src/utils/history.js +1 -1
  415. package/src/utils/molding.js +973 -973
  416. package/src/utils/react-if.jsx +1 -1
  417. package/src/KitchenConfigurator.jsx +0 -1517
  418. package/src/actions/user-actions.js +0 -75
  419. package/src/components/atoms/Snackbar/index.jsx +0 -43
  420. package/src/components/atoms/radio-button/index.jsx +0 -20
  421. package/src/components/atoms/radio-button/styles.js +0 -56
  422. package/src/components/button/MainButton.jsx +0 -157
  423. package/src/components/button/ToggleMeasureButton.jsx +0 -65
  424. package/src/components/catalog-view/catalog-breadcrumb.jsx +0 -53
  425. package/src/components/catalog-view/catalog-item.jsx +0 -229
  426. package/src/components/catalog-view/catalog-list.jsx +0 -173
  427. package/src/components/catalog-view/catalog-page-item.jsx +0 -110
  428. package/src/components/catalog-view/catalog-turn-back-page-item.jsx +0 -80
  429. package/src/components/configurator/custom-configurator.jsx +0 -77
  430. package/src/components/configurator/project-configurator.jsx +0 -120
  431. package/src/components/firstsetting/button/styles.js +0 -223
  432. package/src/components/firstsetting/export.js +0 -9
  433. package/src/components/firstsetting/firstsetting-content-button.jsx +0 -198
  434. package/src/components/firstsetting/firstsetting-toggle-button.jsx +0 -101
  435. package/src/components/firstsetting/firstsetting.jsx +0 -814
  436. package/src/components/footerbar/button/ControlButton.jsx +0 -43
  437. package/src/components/footerbar/button/DirectionButton.jsx +0 -54
  438. package/src/components/footerbar/button/DirectionPanSpinButton.jsx +0 -36
  439. package/src/components/footerbar/button/ToggleButton.jsx +0 -58
  440. package/src/components/footerbar/button/ToggleConvertButton.jsx +0 -48
  441. package/src/components/footerbar/button/ToggleMeasureButton.jsx +0 -33
  442. package/src/components/footerbar/button/styles.js +0 -217
  443. package/src/components/footerbar/export.js +0 -9
  444. package/src/components/footerbar/footer-content-button.jsx +0 -198
  445. package/src/components/footerbar/footer-toggle-button.jsx +0 -101
  446. package/src/components/footerbar/footerbar.jsx +0 -1103
  447. package/src/components/footerbar/styles.js +0 -263
  448. package/src/components/header/button/MenuButton.jsx +0 -46
  449. package/src/components/header/button/SaveButton.jsx +0 -54
  450. package/src/components/header/button/styles.js +0 -181
  451. package/src/components/header/export.js +0 -5
  452. package/src/components/header/header.jsx +0 -631
  453. package/src/components/header/header.style.css +0 -47
  454. package/src/components/header/styles.js +0 -320
  455. package/src/components/login/Login.js +0 -77
  456. package/src/components/login/LoginForm/index.js +0 -108
  457. package/src/components/login/Register.js +0 -83
  458. package/src/components/login/RegisterForm/index.js +0 -171
  459. package/src/components/login/jwtService.js +0 -201
  460. package/src/components/login/style.css +0 -158
  461. package/src/components/login/style.scss +0 -260
  462. package/src/components/molecules/slider/index.jsx +0 -15
  463. package/src/components/molecules/slider/styles.js +0 -0
  464. package/src/components/molecules/slider/styles.scss +0 -3
  465. package/src/components/myprojects/export.js +0 -5
  466. package/src/components/myprojects/index.jsx +0 -445
  467. package/src/components/myprojects/styles.js +0 -241
  468. package/src/components/sidebar/custom-accordion.jsx +0 -48
  469. package/src/components/sidebar/export.js +0 -15
  470. package/src/components/sidebar/panel-element-editor/attributes-editor/attributes-editor.jsx +0 -73
  471. package/src/components/sidebar/panel-element-editor/attributes-editor/confirm-popup.jsx +0 -101
  472. package/src/components/sidebar/panel-element-editor/attributes-editor/hole-attributes-editor.jsx +0 -149
  473. package/src/components/sidebar/panel-element-editor/attributes-editor/item-attributes-editor.jsx +0 -316
  474. package/src/components/sidebar/panel-element-editor/attributes-editor/line-attributes-editor.jsx +0 -108
  475. package/src/components/sidebar/panel-element-editor/element-editor.jsx +0 -1070
  476. package/src/components/sidebar/panel-element-editor/multi-elements-editor.jsx +0 -0
  477. package/src/components/sidebar/panel-element-editor/panel-element-editor.jsx +0 -104
  478. package/src/components/sidebar/panel-element-editor/panel-multi-elements-editor.jsx +0 -155
  479. package/src/components/sidebar/panel-group-editor.jsx +0 -272
  480. package/src/components/sidebar/panel-groups.jsx +0 -310
  481. package/src/components/sidebar/panel-guides.jsx +0 -192
  482. package/src/components/sidebar/panel-layer-elements.jsx +0 -298
  483. package/src/components/sidebar/panel-layers.jsx +0 -381
  484. package/src/components/sidebar/panel.jsx +0 -71
  485. package/src/components/sidebar/sidebar.jsx +0 -106
  486. package/src/components/sidebar/toolbar-panel.jsx +0 -139
  487. package/src/components/sign/export.js +0 -7
  488. package/src/components/sign/main/index.jsx +0 -523
  489. package/src/components/sign/main/styles.js +0 -163
  490. package/src/components/style/cancel-button.jsx +0 -20
  491. package/src/components/style/content-container.jsx +0 -29
  492. package/src/components/style/content-title.jsx +0 -20
  493. package/src/components/style/delete-button.jsx +0 -23
  494. package/src/components/style/export.jsx +0 -48
  495. package/src/components/style/form-block.jsx +0 -13
  496. package/src/components/style/form-number-input_2.jsx +0 -191
  497. package/src/components/style/form-slider.jsx +0 -36
  498. package/src/components/style/form-submit-button.jsx +0 -23
  499. package/src/components/toolbar/button/ControlButton.jsx +0 -41
  500. package/src/components/toolbar/button/DirectionButton.jsx +0 -34
  501. package/src/components/toolbar/button/RightButton.jsx +0 -103
  502. package/src/components/toolbar/button/ToggleButton.jsx +0 -41
  503. package/src/components/toolbar/button/index.jsx +0 -55
  504. package/src/components/toolbar/button/styles.js +0 -127
  505. package/src/components/toolbar/components/DoorStyleMenu.jsx +0 -103
  506. package/src/components/toolbar/components/Pricing.jsx +0 -126
  507. package/src/components/toolbar/components/ReviewForQuote.jsx +0 -635
  508. package/src/components/toolbar/export.js +0 -21
  509. package/src/components/toolbar/main/Alert.js +0 -122
  510. package/src/components/toolbar/main/TakePictureModal.jsx +0 -104
  511. package/src/components/toolbar/main/confirm-popup.jsx +0 -99
  512. package/src/components/toolbar/main/index.jsx +0 -5627
  513. package/src/components/toolbar/main/lShaped.json +0 -311
  514. package/src/components/toolbar/main/longNarrow.json +0 -238
  515. package/src/components/toolbar/main/myComponents.js +0 -123
  516. package/src/components/toolbar/main/oRectangle.json +0 -220
  517. package/src/components/toolbar/main/rectangle.json +0 -238
  518. package/src/components/toolbar/main/style.css +0 -107
  519. package/src/components/toolbar/main/styles.js +0 -696
  520. package/src/components/toolbar/plugin-item.jsx +0 -123
  521. package/src/components/toolbar/popup/appliance/appliance-category/index.jsx +0 -73
  522. package/src/components/toolbar/popup/appliance/choose-appliance/index.jsx +0 -102
  523. package/src/components/toolbar/popup/appliance/index.jsx +0 -83
  524. package/src/components/toolbar/popup/autosaveprompt/index.jsx +0 -150
  525. package/src/components/toolbar/popup/autosaveprompt/styles.css +0 -64
  526. package/src/components/toolbar/popup/autosaveprompt/styles.js +0 -40
  527. package/src/components/toolbar/popup/cabinet/cabinet-category/index.jsx +0 -73
  528. package/src/components/toolbar/popup/cabinet/choose-product/index.jsx +0 -119
  529. package/src/components/toolbar/popup/cabinet/index.jsx +0 -85
  530. package/src/components/toolbar/popup/doorStyle/choose-style/index.jsx +0 -63
  531. package/src/components/toolbar/popup/doorStyle/index.jsx +0 -71
  532. package/src/components/toolbar/popup/doorStyle/style-category/index.jsx +0 -139
  533. package/src/components/toolbar/popup/downloadsummary/downloadSummaryContext.js +0 -2
  534. package/src/components/toolbar/popup/downloadsummary/downloadSummaryTemp.jsx +0 -157
  535. package/src/components/toolbar/popup/downloadsummary/index.jsx +0 -643
  536. package/src/components/toolbar/popup/downloadsummary/show2D/show2DView.jsx +0 -51
  537. package/src/components/toolbar/popup/downloadsummary/show2D/viewer2DDownLoad.jsx +0 -175
  538. package/src/components/toolbar/popup/downloadsummary/show3D/show3DView.jsx +0 -283
  539. package/src/components/toolbar/popup/downloadsummary/show3D/viewer3DDownLoad.jsx +0 -2257
  540. package/src/components/toolbar/popup/downloadsummary/showCabinetInfo.js +0 -93
  541. package/src/components/toolbar/popup/downloadsummary/showElevation/showElevationView.jsx +0 -132
  542. package/src/components/toolbar/popup/downloadsummary/showElevation/viewer3DElevationDownload.jsx +0 -2198
  543. package/src/components/toolbar/popup/downloadsummary/showElevation/viewerElevationDownload.jsx +0 -152
  544. package/src/components/toolbar/popup/downloadsummary/showWarranty.jsx +0 -149
  545. package/src/components/toolbar/popup/downloadsummary/styles.css +0 -177
  546. package/src/components/toolbar/popup/downloadsummary/styles.js +0 -453
  547. package/src/components/toolbar/popup/finishingtouch/category/index.jsx +0 -34
  548. package/src/components/toolbar/popup/finishingtouch/index.jsx +0 -58
  549. package/src/components/toolbar/popup/finishingtouch/material-edit.jsx +0 -112
  550. package/src/components/toolbar/popup/finishingtouch/product/index.jsx +0 -116
  551. package/src/components/toolbar/popup/floorplan/choose-floor/confirm-popup.jsx +0 -101
  552. package/src/components/toolbar/popup/floorplan/choose-floor/index.jsx +0 -254
  553. package/src/components/toolbar/popup/floorplan/choose-floor/lShaped.json +0 -311
  554. package/src/components/toolbar/popup/floorplan/choose-floor/longNarrow.json +0 -238
  555. package/src/components/toolbar/popup/floorplan/choose-floor/oRectangle.json +0 -220
  556. package/src/components/toolbar/popup/floorplan/choose-floor/rectangle.json +0 -238
  557. package/src/components/toolbar/popup/floorplan/choose-floor/styles.js +0 -86
  558. package/src/components/toolbar/popup/floorplan/floor-category/index.jsx +0 -109
  559. package/src/components/toolbar/popup/floorplan/index.jsx +0 -60
  560. package/src/components/toolbar/popup/index.jsx +0 -241
  561. package/src/components/toolbar/popup/newproject/index.jsx +0 -59
  562. package/src/components/toolbar/popup/newproject/styles.css +0 -64
  563. package/src/components/toolbar/popup/newproject/styles.js +0 -41
  564. package/src/components/toolbar/popup/product/appliance.jsx +0 -54
  565. package/src/components/toolbar/popup/product/cabinetproduct.jsx +0 -15
  566. package/src/components/toolbar/popup/product/doorstyle.jsx +0 -58
  567. package/src/components/toolbar/popup/product/doorstyleproduct.jsx +0 -47
  568. package/src/components/toolbar/popup/product/floor.jsx +0 -36
  569. package/src/components/toolbar/popup/product/floorproduct.jsx +0 -42
  570. package/src/components/toolbar/popup/product/index.jsx +0 -36
  571. package/src/components/toolbar/popup/product/primary.jsx +0 -77
  572. package/src/components/toolbar/popup/product/productline.jsx +0 -93
  573. package/src/components/toolbar/popup/product/reviewItem.jsx +0 -427
  574. package/src/components/toolbar/popup/product/reviewMolding.jsx +0 -310
  575. package/src/components/toolbar/popup/product/style.css +0 -54
  576. package/src/components/toolbar/popup/product/styles.js +0 -260
  577. package/src/components/toolbar/popup/savedesign/FullPictureForm.jsx +0 -146
  578. package/src/components/toolbar/popup/savedesign/index.jsx +0 -495
  579. package/src/components/toolbar/popup/savedesign/savedesign.style.css +0 -16
  580. package/src/components/toolbar/popup/savedesign/styles.js +0 -151
  581. package/src/components/toolbar/popup/setDoorStyleOption/index.jsx +0 -87
  582. package/src/components/toolbar/popup/styles.js +0 -909
  583. package/src/components/toolbar/popup/submitforquote/AddToCartOptions.jsx +0 -192
  584. package/src/components/toolbar/popup/submitforquote/CustomerRequestsForm.jsx +0 -96
  585. package/src/components/toolbar/popup/submitforquote/SkipDesignerReview.jsx +0 -54
  586. package/src/components/toolbar/popup/submitforquote/StepDots.jsx +0 -25
  587. package/src/components/toolbar/popup/submitforquote/cart-choice.jsx +0 -116
  588. package/src/components/toolbar/popup/submitforquote/doorstyle-menus.js +0 -38
  589. package/src/components/toolbar/popup/submitforquote/index.jsx +0 -698
  590. package/src/components/toolbar/popup/submitforquote/styles.css +0 -105
  591. package/src/components/toolbar/popup/submitforquote/styles.js +0 -294
  592. package/src/components/toolbar/popup/submitprompt/index.jsx +0 -89
  593. package/src/components/toolbar/popup/submitprompt/styles.css +0 -64
  594. package/src/components/toolbar/popup/submitprompt/styles.js +0 -42
  595. package/src/components/toolbar/toolbar-button.jsx +0 -90
  596. package/src/components/toolbar/toolbar-load-button.jsx +0 -36
  597. package/src/components/toolbar/toolbar-save-button.jsx +0 -32
  598. package/src/components/tutorial-view/Modal.jsx +0 -584
  599. package/src/components/tutorial-view/style.css +0 -111
  600. package/src/components/tutorial-view/styles.js +0 -65
  601. package/src/components/wizardstep/button/styles.js +0 -677
  602. package/src/components/wizardstep/export.js +0 -5
  603. package/src/components/wizardstep/index.jsx +0 -1372
  604. package/src/components/wizardstep/styles.js +0 -688
  605. package/src/components/wizardstep/wizardstep-content-button.jsx +0 -198
  606. package/src/components/wizardstep/wizardstep-toggle-button.jsx +0 -101
@@ -1,2198 +0,0 @@
1
- 'use strict';
2
-
3
- import React from 'react';
4
- import PropTypes from 'prop-types';
5
- import ReactDOM from 'react-dom';
6
- import * as Three from 'three';
7
- import {
8
- parseData,
9
- updateScene,
10
- deleteSpecifiedMeshObjects,
11
- createBacksplash,
12
- checkCabinetOverlap
13
- } from '../../../../viewer3d/scene-creator';
14
- import { disposeScene } from '../../../../viewer3d/three-memory-cleaner';
15
- import { disposeObject } from '../../../../viewer3d/three-memory-cleaner';
16
- import diff from 'immutablediff';
17
- import * as SharedStyle from '../../../../../shared-style';
18
- import {
19
- MODE_DRAWING_ITEM_3D,
20
- UNIT_CENTIMETER,
21
- SECONDARY_PURPLE_COLOR,
22
- ARRAY_ELEVATION_VIEW_MODES,
23
- MODE_FRONT_ELEVATION_VIEW,
24
- MODE_RIGHT_ELEVATION_VIEW,
25
- MODE_LEFT_ELEVATION_VIEW,
26
- MODE_BACK_ELEVATION_VIEW,
27
- BASE_CABINET_LAYOUTPOS,
28
- WALL_CABINET_LAYOUTPOS,
29
- TALL_CABINET_LAYOUTPOS
30
- } from '../../../../../constants';
31
- import { isUndefined } from 'util';
32
- import { verticesDistance } from '../../../../../utils/geometry';
33
- import convert from 'convert-units';
34
- import { GeometryUtils } from '../../../../../utils/export';
35
- import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader';
36
- import CameraControls from 'camera-controls';
37
- CameraControls.install({ THREE: Three });
38
- import { returnReplaceableDeepSearchType } from '../../../../viewer2d/utils';
39
- import { vectorIntersectWithMesh } from '../../../../../utils/objects-utils';
40
- import { almostEqual } from '../../../../../utils/geometry';
41
-
42
- export default class Viewer3DElevationDownload extends React.Component {
43
- constructor(props) {
44
- super(props);
45
- this.state = {
46
- isLoading: false,
47
- showflag: true,
48
- toolObj: null,
49
- angleObj: null,
50
- waitForRender: 0
51
- };
52
- this.lastMousePosition = {};
53
- this.width = props.width;
54
- this.height = props.height;
55
- this.renderingID = 0;
56
-
57
- let { mode } = props.state;
58
-
59
- if (!window.__elevationRendererDownload) {
60
- window.__elevationRendererDownload = {};
61
- }
62
-
63
- this.renderer =
64
- window.__threeRendererDownload ||
65
- window.__elevationRendererDownload[mode] ||
66
- new Three.WebGLRenderer({
67
- preserveDrawingBuffer: true,
68
- alpha: true,
69
- antialias: true
70
- });
71
-
72
- this.renderer.shadowMap.enabled = true;
73
- this.renderer.shadowMapSoft = true;
74
- if (mode == 'MODE_3D_VIEW') {
75
- window.__threeRendererDownload = this.renderer;
76
- } else {
77
- window.__elevationRendererDownload[mode] = this.renderer;
78
- }
79
-
80
- this.renderer.domElement.style.display = 'none';
81
- }
82
-
83
- componentDidMount(nextProps) {
84
- let scene3D, camera, pivot, cameraControls, clock;
85
-
86
- const actions = {
87
- areaActions: this.context.areaActions,
88
- holesActions: this.context.holesActions,
89
- itemsActions: this.context.itemsActions,
90
- sceneActions: this.context.sceneActions,
91
- linesActions: this.context.linesActions,
92
- projectActions: this.context.projectActions,
93
- catalog: this.context.catalog
94
- };
95
-
96
- const self = this;
97
- const { state } = this.props;
98
- const { mode, scene } = state;
99
-
100
- function setupLight(scene, inbBox) {
101
- if (ARRAY_ELEVATION_VIEW_MODES.includes(mode)) {
102
- const ambilight = new Three.AmbientLight('0xffffff', 3);
103
- scene.add(ambilight);
104
- } else {
105
- const shadowMapSize = 2048;
106
- const shadowCameraSize =
107
- Math.max(
108
- Math.abs(inbBox.min.x - inbBox.max.x),
109
- Math.abs(inbBox.min.y - inbBox.max.y),
110
- Math.abs(inbBox.min.z - inbBox.max.z)
111
- ) / 2;
112
- const shadowCameraFar = shadowCameraSize * 10;
113
- const bboxCenter = new Three.Vector3(
114
- (inbBox.min.x + inbBox.max.x) / 2,
115
- inbBox.min.y,
116
- (inbBox.min.z + inbBox.max.z) / 2
117
- );
118
-
119
- function addDirLight(inColor, inIntensity, inPosition) {
120
- const dirLight = new Three.DirectionalLight(inColor, inIntensity);
121
- dirLight.castShadow = true;
122
- dirLight.shadow.mapSize.x = shadowMapSize;
123
- dirLight.shadow.mapSize.y = shadowMapSize;
124
- dirLight.shadow.camera.near = 0;
125
- dirLight.shadow.camera.far = shadowCameraFar;
126
-
127
- dirLight.shadow.camera.top = shadowCameraSize * 1.5;
128
- dirLight.shadow.camera.bottom = -shadowCameraSize * 1.5;
129
- dirLight.shadow.camera.left = -shadowCameraSize * 1.5;
130
- dirLight.shadow.camera.right = shadowCameraSize * 1.5;
131
- dirLight.position.copy(inPosition);
132
-
133
- const targetObject = new Three.Object3D();
134
- targetObject.position.copy(bboxCenter);
135
- scene.add(targetObject);
136
-
137
- dirLight.target = targetObject;
138
- dirLight.target.updateMatrixWorld();
139
-
140
- scene.add(dirLight);
141
- }
142
-
143
- function addSpotLight(
144
- inColor,
145
- inIntensity,
146
- inPosition,
147
- inTarget,
148
- inDistance
149
- ) {
150
- const spotLight = new Three.SpotLight();
151
- spotLight.intensity = inIntensity;
152
- spotLight.color.setHex(inColor);
153
- spotLight.position.copy(inPosition);
154
- spotLight.angle = 1.3;
155
- spotLight.distance = inDistance;
156
- spotLight.penumbra = 1.8;
157
- spotLight.decay = 0.01;
158
-
159
- spotLight.castShadow = true;
160
- spotLight.shadow.intensity = 2;
161
- spotLight.shadow.mapSize.width = 4096;
162
- spotLight.shadow.mapSize.height = 4096;
163
-
164
- const targetObject = new Three.Object3D();
165
- targetObject.position.copy(
166
- new Three.Vector3(inTarget.x, 0, inTarget.z)
167
- );
168
- scene.add(targetObject);
169
-
170
- spotLight.target = targetObject;
171
- spotLight.target.updateMatrixWorld();
172
- scene.add(spotLight);
173
- }
174
-
175
- const dirLightPos = new Three.Vector3(
176
- inbBox.max.x,
177
- inbBox.max.y + 1.8 * Math.abs(inbBox.max.y - inbBox.min.y),
178
- inbBox.min.z - 0.5 * Math.abs(inbBox.max.z - inbBox.min.z)
179
- );
180
-
181
- addDirLight('white', 1.5, dirLightPos);
182
-
183
- const ceiling = scene3D.getObjectByName('ceil');
184
- if (ceiling) {
185
- const ceilBBox = new Three.Box3().setFromObject(ceiling);
186
-
187
- const spot1 = new Three.Vector3(
188
- ceilBBox.min.x + Math.abs(ceilBBox.min.x - ceilBBox.max.x) / 4,
189
- ceilBBox.max.y - 0.5,
190
- ceilBBox.min.z + Math.abs(ceilBBox.min.z - inbBox.max.z) / 4
191
- );
192
- const spot2 = new Three.Vector3(
193
- ceilBBox.min.x + Math.abs(ceilBBox.min.x - ceilBBox.max.x) / 4,
194
- ceilBBox.max.y - 0.5,
195
- ceilBBox.max.z - Math.abs(ceilBBox.min.z - ceilBBox.max.z) / 4
196
- );
197
-
198
- const spot3 = new Three.Vector3(
199
- ceilBBox.max.x - Math.abs(ceilBBox.min.x - ceilBBox.max.x) / 4,
200
- ceilBBox.max.y - 0.5,
201
- ceilBBox.min.z + Math.abs(ceilBBox.min.z - ceilBBox.max.z) / 4
202
- );
203
- const spot4 = new Three.Vector3(
204
- ceilBBox.max.x - Math.abs(ceilBBox.min.x - ceilBBox.max.x) / 4,
205
- ceilBBox.max.y - 0.5,
206
- ceilBBox.max.z - Math.abs(ceilBBox.min.z - ceilBBox.max.z) / 4
207
- );
208
-
209
- const spotlightDis = 1.5 * Math.abs(inbBox.min.y - inbBox.max.y);
210
-
211
- // check if spotlight is inside the room
212
- vectorIntersectWithMesh(spot1, scene3D.getObjectByName('floor')) &&
213
- addSpotLight('0xffffff', 0.8, spot1, spot1, spotlightDis);
214
- vectorIntersectWithMesh(spot2, scene3D.getObjectByName('floor')) &&
215
- addSpotLight('0xffffff', 0.8, spot2, spot2, spotlightDis);
216
- vectorIntersectWithMesh(spot3, scene3D.getObjectByName('floor')) &&
217
- addSpotLight('0xffffff', 0.8, spot3, spot3, spotlightDis);
218
- vectorIntersectWithMesh(spot4, scene3D.getObjectByName('floor')) &&
219
- addSpotLight('0xffffff', 0.8, spot4, spot4, spotlightDis);
220
- }
221
- }
222
- }
223
-
224
- // Load data
225
- this.setState({ isLoading: true, waitForRender: 0 });
226
- this.props.setIsLoading3D(true);
227
- const { promise, planData } = parseData(
228
- scene,
229
- actions,
230
- this.context.catalog,
231
- camera,
232
- this.renderer,
233
- state.mode
234
- );
235
-
236
- promise.then(() => {
237
- let objToRemove = [];
238
- planData.plan.traverse(obj => {
239
- if (obj.geometry === null) {
240
- objToRemove.push(obj);
241
- }
242
- });
243
- objToRemove.forEach(obj => {
244
- obj.removeFromParent();
245
- });
246
- const bbox = new Three.Box3().setFromObject(planData.plan);
247
- if (!ARRAY_ELEVATION_VIEW_MODES.includes(state.mode)) {
248
- //cameraControls.fitToBox(bbox, true);
249
- if (cameraControls) {
250
- const radius = 400; // Distance from target
251
- const angleInDegrees = 5;
252
- const angleInRadians = (angleInDegrees * Math.PI) / 180;
253
-
254
- // Calculate a position angleInDegrees to the right on the horizontal circle
255
- const eyeX = Math.sin(angleInRadians) * radius;
256
- const eyeZ = Math.cos(angleInRadians) * radius;
257
-
258
- cameraControls.setLookAt(eyeX, 0, eyeZ, 0, 0, 0); // Set camera with Y elevation
259
- }
260
- }
261
- setupLight(scene3D, planData.boundingBox);
262
-
263
- self.setState({ waitForRender: 1 });
264
- });
265
-
266
- const area = scene.getIn(['layers', scene.selectedLayer, 'areas']);
267
- const layer = scene.getIn(['layers', scene.selectedLayer]);
268
- const areas = [],
269
- lights = [];
270
-
271
- let snapBox = null;
272
-
273
- // Check for data
274
- let msg = '';
275
- scene.layers.forEach(layer => {
276
- if (layer.id === scene.selectedLayer || layer.visible) {
277
- layer.items.forEach(item => {
278
- if (item.doorStyle === null) {
279
- if (!msg.includes(item.name + "'s doorStyle is null."))
280
- msg += item.name + "'s doorStyle is null.\n";
281
- }
282
- });
283
- }
284
- });
285
- if (msg !== '') {
286
- confirm(msg);
287
- }
288
-
289
- init();
290
- render();
291
-
292
- area.forEach(data => {
293
- areas.push(data);
294
- });
295
- for (let i = 0; i < areas.length; i++) {
296
- let aVertices = [];
297
- let lines = [];
298
- let height = 100;
299
- areas[i].vertices.forEach(data => {
300
- aVertices.push(data);
301
- });
302
- layer.lines.forEach(data => {
303
- lines.push(data);
304
- });
305
- for (let i = 0; i < lines.length; i++) {
306
- let data = lines[i];
307
- let realVec = [];
308
- data.vertices.forEach(vec => {
309
- realVec.push(vec);
310
- });
311
- if (aVertices.includes(realVec[0]) && aVertices.includes(realVec[1])) {
312
- height = convert(layer.ceilHeight)
313
- .from(layer.unit)
314
- .to(UNIT_CENTIMETER);
315
- // height = data.properties.getIn(['height', 'length']);
316
- break;
317
- }
318
- }
319
- let vertices = [];
320
- areas[i].vertices.forEach(datas => {
321
- let vertex = scene.getIn([
322
- 'layers',
323
- scene.selectedLayer,
324
- 'vertices',
325
- datas
326
- ]);
327
- vertices.push(vertex);
328
- });
329
- vertices.push(vertices[0]);
330
- let fLen = vertices.length - 1;
331
- for (let i = 0; i < fLen; i++) {
332
- let sX = vertices[i].x;
333
- let sY = vertices[i].y;
334
- let eX = vertices[i + 1].x;
335
- let eY = vertices[i + 1].y;
336
- let len = Math.sqrt((eX - sX) * (eX - sX) + (eY - sY) * (eY - sY));
337
- for (let cLen = 200; cLen < len; cLen += 200) {
338
- let cX = sX + ((eX - sX) * cLen) / len;
339
- let cY = sY + ((eY - sY) * cLen) / len;
340
- let endLen = Math.sqrt((eX - cX) * (eX - cX) + (eY - cY) * (eY - cY));
341
- if (endLen <= 100) continue;
342
- let vec2 = new Three.Vector2(cX - sX, cY - sY);
343
- let angle = vec2.angle() + Math.PI / 2;
344
- cX = Math.cos(angle) * 30 + cX;
345
- cY = Math.sin(angle) * 30 + cY;
346
- let spotLight = new Three.SpotLight(0xeeeeee, 1.7);
347
- spotLight.angle = 0.76;
348
- spotLight.castShadow = true;
349
- spotLight.penumbra = 1;
350
- spotLight.decay = 1.7;
351
- spotLight.distance = height - 20;
352
- let target = new Three.Object3D();
353
- spotLight.target = target;
354
- lights.push({
355
- light: spotLight,
356
- target: target,
357
- x: cX,
358
- y: cY,
359
- height: height
360
- });
361
- }
362
- }
363
- }
364
- // //////////////////////////
365
-
366
- // OBJECT PICKING
367
- let toIntersect = [planData.plan];
368
- let mouse = new Three.Vector2();
369
- let gridPlane = planData.grid;
370
- let raycaster = new Three.Raycaster();
371
- let selectedObject = {};
372
- let currentObject = null;
373
- let isSelected = false;
374
- let bRotate = false;
375
- let bMove = false;
376
- let bMoveUP = false;
377
- /** Transformation matrix of grid */
378
- const gridMatrix = new Three.Matrix4();
379
- let rayDirection = new Three.Vector3();
380
- /** World position of grid plane */
381
- let gridPlanOrigin = new Three.Vector3();
382
- let Point = new Three.Vector2();
383
- let sPoint = new Three.Vector2();
384
-
385
- // SNAP FUNCTION VARIABLE
386
- let snapFlag = false;
387
- let snapAnimI = 0;
388
- let snapDelta = 6;
389
- let t_i = 0;
390
- let targetPoint = new Three.Vector3();
391
- let targetRot = 0;
392
- let targetUVec = new Three.Vector3();
393
- let targetCRotation = 0;
394
- let targetObj = null;
395
- let targetNumber = 0;
396
-
397
- let allItemRect;
398
- let allItemSnap;
399
- let allLines;
400
- let allLineRects;
401
- let allLineSnap;
402
- let allRect;
403
- let allArea;
404
-
405
- // end snap function variable///////////////////////
406
- let backsplashVisible = false;
407
- let holeItems = GeometryUtils.getHoleItems(layer);
408
-
409
- let removeSnapBox = () => {
410
- if (snapBox != null) {
411
- planData.plan.remove(snapBox);
412
- disposeObject(snapBox);
413
- snapBox = null;
414
- targetObj = null;
415
- snapFlag = false;
416
- }
417
- };
418
-
419
- const camToGrid = new Three.Vector3();
420
- let camPos = camera.position;
421
-
422
- const mapCursorPosition = (e, altitude) => {
423
- camToGrid.subVectors(gridPlanOrigin, camPos);
424
-
425
- let camD = camToGrid.y + (altitude ? altitude : 0);
426
- let rayD = rayDirection.y;
427
-
428
- const intersectPt = rayDirection.multiplyScalar(camD / rayD).add(camPos);
429
- intersectPt.y = gridPlanOrigin.y;
430
- intersectPt.applyMatrix4(gridMatrix);
431
-
432
- return { x: intersectPt.x, y: -intersectPt.z };
433
- };
434
-
435
- /* for Snap Functions*/
436
-
437
- let pointLineDistance = function (point, line) {
438
- // return distance from point to line and directional point of line
439
- let pX = point.x;
440
- let pY = point.y;
441
- let l1x = line[0].x;
442
- let l1y = line[0].y;
443
- let l2x = line[1].x;
444
- let l2y = line[1].y;
445
- let pLine = new Three.Vector2(l1x - pX, l1y - pY);
446
- let Line = new Three.Vector2(l1x - l2x, l1y - l2y);
447
- let pAngle = pLine.angle();
448
- let lAngle = Line.angle();
449
- let pDistance = pLine.length();
450
- let oDistance = Line.length();
451
- let directDistance = Math.sin(pAngle - lAngle) * pDistance;
452
- let lineDistance = Math.cos(pAngle - lAngle) * pDistance;
453
- let dX = l1x + ((l2x - l1x) * lineDistance) / oDistance;
454
- let dY = l1y + ((l2y - l1y) * lineDistance) / oDistance;
455
- let dPoint = { x: dX, y: dY };
456
- return { distance: directDistance, point: dPoint };
457
- };
458
- let getInterSect = function (shape1, shape2) {
459
- // return result of intersect of two shape
460
- let count = 0;
461
- for (let i = 0; i < shape1.length - 1; i++) {
462
- let sl1 = { x: shape1[i].x, y: shape1[i].y };
463
- let sl2 = { x: shape1[i + 1].x, y: shape1[i + 1].y };
464
- for (let j = 0; j < shape2.length - 1; j++) {
465
- let el1 = { x: shape2[j].x, y: shape2[j].y };
466
- let el2 = { x: shape2[j + 1].x, y: shape2[j + 1].y };
467
- let flag = GeometryUtils.getLineInterSect(
468
- sl1.x,
469
- sl1.y,
470
- sl2.x,
471
- sl2.y,
472
- el1.x,
473
- el1.y,
474
- el2.x,
475
- el2.y
476
- );
477
- if (flag) {
478
- count++;
479
- if (count > 1) return true;
480
- }
481
- }
482
- }
483
- return false;
484
- };
485
-
486
- this.getRectPoints = function (width, height, pos, rot) {
487
- // return 4 points from it's position, width, height, and rotation info
488
- let rX = width / 2;
489
- let rY = height / 2;
490
- let vertices = [];
491
- let cRot = rot;
492
- let pX = pos.x + Math.cos(cRot) * rX + Math.cos(cRot + Math.PI / 2) * rY;
493
- let pY = pos.y + Math.sin(cRot) * rX + Math.sin(cRot + Math.PI / 2) * rY;
494
- vertices.push({ x: Math.floor(pX + 0.5), y: Math.floor(pY + 0.5) });
495
- rX = -rX;
496
- pX = pos.x + Math.cos(cRot) * rX + Math.cos(cRot + Math.PI / 2) * rY;
497
- pY = pos.y + Math.sin(cRot) * rX + Math.sin(cRot + Math.PI / 2) * rY;
498
- vertices.push({ x: Math.floor(pX + 0.5), y: Math.floor(pY + 0.5) });
499
- rY = -rY;
500
- pX = pos.x + Math.cos(cRot) * rX + Math.cos(cRot + Math.PI / 2) * rY;
501
- pY = pos.y + Math.sin(cRot) * rX + Math.sin(cRot + Math.PI / 2) * rY;
502
- vertices.push({ x: Math.floor(pX + 0.5), y: Math.floor(pY + 0.5) });
503
- rX = -rX;
504
- pX = pos.x + Math.cos(cRot) * rX + Math.cos(cRot + Math.PI / 2) * rY;
505
- pY = pos.y + Math.sin(cRot) * rX + Math.sin(cRot + Math.PI / 2) * rY;
506
- vertices.push({ x: Math.floor(pX + 0.5), y: Math.floor(pY + 0.5) });
507
- vertices.push(vertices[0]);
508
- vertices.push(vertices[2]);
509
- return vertices;
510
- };
511
-
512
- const prepareSnap = layer => {
513
- allLines = GeometryUtils.getAllLines(layer);
514
- allLineRects = GeometryUtils.buildRectFromLines(layer, allLines);
515
- allItemRect = GeometryUtils.getAllItems(
516
- this.props.state.scene,
517
- actions.catalog,
518
- allLineRects
519
- );
520
- allItemSnap = GeometryUtils.getAllItemSnap(allItemRect);
521
- allLineSnap = GeometryUtils.getAllLineSnap(allLineRects, allItemRect.cur);
522
- allRect = allItemRect.others.concat(allLineRects);
523
- allItemSnap = GeometryUtils.validateSnaps(allItemSnap, allRect);
524
- allLineSnap = GeometryUtils.validateSnaps(allLineSnap, allRect);
525
- allArea = GeometryUtils.getAllArea(layer);
526
- };
527
-
528
- // prepareSnapSpec(layer);
529
- let lineRect = layer => {
530
- let areainfo = [];
531
- layer.areas.forEach(area => {
532
- let sz = area.vertices.size;
533
- for (var i = 0; i < sz; i++) {
534
- areainfo.push(area.vertices.get(i));
535
- }
536
- });
537
- let rect = [];
538
- areainfo.forEach(area => {
539
- let vert = layer.vertices.get(area);
540
- rect.push(vert.x, vert.y);
541
- });
542
- return rect;
543
- };
544
-
545
- this.collisionCheck = function (obj, pos, rot, tObj, item = null, catalog) {
546
- //collision check from one object to every other object excpet target object
547
- let layer = this.props.state.scene.getIn([
548
- 'layers',
549
- obj.userData.layerId
550
- ]);
551
- let layoutpos = 'utype';
552
- if (item !== null) {
553
- let catid = item.type;
554
- let cat = catalog.elements[catid];
555
- layoutpos = cat.info.layoutpos;
556
- }
557
- let oPos = new Three.Vector2(pos.clone().x, pos.clone().y);
558
- let sBounding = obj.children[0].userData;
559
- let width = sBounding.max.x - sBounding.min.x;
560
- let depth = sBounding.max.z - sBounding.min.z;
561
- let oVertices = this.getRectPoints(
562
- width,
563
- depth,
564
- oPos.clone(),
565
- ((rot % 360) / 180) * Math.PI
566
- );
567
- let datas = [];
568
- layer.items.forEach(data => {
569
- datas.push(data);
570
- });
571
- for (let i = 0; i < datas.length; i++) {
572
- let data = datas[i];
573
- if (data.id == obj.userData.itemId || data.id == tObj.userData.itemId)
574
- continue;
575
- let target =
576
- planData.sceneGraph.layers[obj.userData.layerId].items[data.id];
577
- if (target === undefined) {
578
- console.log(
579
- data.id +
580
- ' does not exist in viewer3d/viewer3d.js collisionCheck function'
581
- );
582
- return false;
583
- }
584
- let item = layer.items.getIn([data.id]);
585
- let ocatid = item.type;
586
- let ocat = catalog.elements[ocatid];
587
- let olayoutpos = ocat.info.layoutpos;
588
- if (
589
- !(
590
- (layoutpos === BASE_CABINET_LAYOUTPOS &&
591
- olayoutpos === WALL_CABINET_LAYOUTPOS) ||
592
- (layoutpos === WALL_CABINET_LAYOUTPOS &&
593
- olayoutpos === BASE_CABINET_LAYOUTPOS)
594
- )
595
- ) {
596
- let tRot = item.rotation;
597
- let tPos = new Three.Vector2(item.x, item.y);
598
- let tBounding = target.children[0].userData;
599
- let twidth = tBounding.max.x - tBounding.min.x;
600
- let tdepth = tBounding.max.z - tBounding.min.z;
601
- let tVertices = this.getRectPoints(
602
- twidth,
603
- tdepth,
604
- tPos.clone(),
605
- ((tRot % 360) / 180) * Math.PI
606
- );
607
- if (getInterSect(oVertices, tVertices)) {
608
- return false;
609
- }
610
- }
611
- }
612
- datas = [];
613
- layer.lines.forEach(data => {
614
- datas.push(data);
615
- });
616
- for (let i = 0; i < datas.length; i++) {
617
- let data = datas[i];
618
- if (data.id == obj.userData.itemId || data.id == tObj.userData.itemId)
619
- continue;
620
- let item = layer.lines.getIn([data.id]);
621
- // let llayoutpos = catalog.elements[item.type].info.layoutpos;
622
- let vertices = [];
623
- item.vertices.forEach(data => {
624
- let vertex = layer.vertices.get(data);
625
- vertices.push({ x: vertex.x, y: vertex.y });
626
- });
627
- let vec = new Three.Vector2(
628
- vertices[1].x - vertices[0].x,
629
- vertices[1].y - vertices[0].y
630
- );
631
- let tRot = vec.angle();
632
- let tPos = new Three.Vector2(
633
- (vertices[0].x + vertices[1].x) / 2,
634
- (vertices[0].y + vertices[1].y) / 2
635
- );
636
- let tdepth = item.properties.getIn(['thickness', 'length']);
637
- let twidth = Math.sqrt(vec.x * vec.x + vec.y * vec.y);
638
- let tVertices = this.getRectPoints(twidth, tdepth, tPos.clone(), tRot);
639
- if (getInterSect(oVertices, tVertices)) {
640
- return false;
641
- }
642
- }
643
- return true;
644
- };
645
-
646
- this.collisionHoleCheck = function (
647
- obj,
648
- pos,
649
- rot,
650
- tObj,
651
- item = null,
652
- catalog
653
- ) {
654
- let layer = this.props.state.scene.getIn([
655
- 'layers',
656
- obj.userData.layerId
657
- ]);
658
- let currentItem;
659
- if (item !== null) {
660
- let catid = item.type;
661
- let cat = catalog.elements[catid];
662
- currentItem = {
663
- selectedItem: item,
664
- cat
665
- };
666
- }
667
- let oPos = new Three.Vector2(pos.clone().x, pos.clone().y);
668
- let sBounding = obj.children[0].userData;
669
- let width = sBounding.max.x - sBounding.min.x;
670
- let depth = sBounding.max.z - sBounding.min.z;
671
- let oVertices = this.getRectPoints(
672
- width,
673
- depth,
674
- oPos.clone(),
675
- ((rot % 360) / 180) * Math.PI
676
- );
677
-
678
- let datas = [];
679
- layer.items.forEach(data => {
680
- datas.push(data);
681
- });
682
- for (let i = 0; i < datas.length; i++) {
683
- let data = datas[i];
684
- if (data.id == obj.userData.itemId || data.id == tObj.userData.itemId)
685
- continue;
686
- let target =
687
- planData.sceneGraph.layers[obj.userData.layerId].items[data.id];
688
- if (target === undefined) {
689
- console.log(
690
- data.id +
691
- ' does not exist in viewer3d/viewer3d.js collisionCheck function'
692
- );
693
- return false;
694
- }
695
- let item = layer.items.getIn([data.id]);
696
- let ocatid = item.type;
697
- let ocat = catalog.elements[ocatid];
698
- if (!ocat)
699
- ocat = catalog.elements[returnReplaceableDeepSearchType(ocatid)];
700
- let otherItem = {
701
- item,
702
- cat: ocat
703
- };
704
-
705
- if (
706
- GeometryUtils.needSnap(currentItem, otherItem) &&
707
- otherItem.cat.type != 'cabinet'
708
- ) {
709
- let tRot = item.rotation;
710
- let tPos = new Three.Vector2(item.x, item.y);
711
- let tBounding = target.children[0].userData;
712
- let twidth = tBounding.max.x - tBounding.min.x;
713
- let tdepth = tBounding.max.z - tBounding.min.z;
714
- let tVertices = this.getRectPoints(
715
- twidth,
716
- tdepth,
717
- tPos.clone(),
718
- ((tRot % 360) / 180) * Math.PI
719
- );
720
- if (getInterSect(oVertices, tVertices)) {
721
- return false;
722
- }
723
- }
724
- }
725
-
726
- let holes = [];
727
- layer.lines.forEach(line => {
728
- line.holes.forEach(holeID => {
729
- let hole = layer.holes.get(holeID);
730
- holes.push(hole);
731
- });
732
- });
733
- let i = 0;
734
- for (; i < holes.length; i++) {
735
- let tPos = new Three.Vector2(holes[i].x, holes[i].y);
736
- let twidth = holes[i].properties.getIn(['width', 'length']);
737
- let theight = holes[i].properties.getIn(['thickness', 'length']);
738
- let trot = holes[i].rotation;
739
- let tVertices = this.getRectPoints(twidth, theight, tPos.clone(), trot);
740
- if (getInterSect(oVertices, tVertices)) {
741
- return false;
742
- }
743
- }
744
- return true;
745
- };
746
-
747
- this.collisionSlide = function (
748
- item3D,
749
- originPos,
750
- layer,
751
- sVertices,
752
- tPos,
753
- item
754
- ) {
755
- let items = [];
756
-
757
- let cur_category = '';
758
- let catalog = actions.catalog;
759
- if (layer.selected.items.size > 0) {
760
- let selectedItem = layer.getIn(['items', layer.selected.items.get(0)]);
761
- let catid = selectedItem.type;
762
- let cat = catalog.elements[catid];
763
- if (cat === undefined || cat === null)
764
- cat = catalog.getIn(['elements', catid]);
765
- cur_category = cat.obj.category;
766
- }
767
-
768
- layer.items.forEach(data => {
769
- if (data.id == selectedObject.itemID) {
770
- return;
771
- }
772
-
773
- items.push(data.toJS());
774
- });
775
- let oPos = new Three.Vector2(originPos.x, -originPos.z);
776
-
777
- // sort from distance
778
- for (let i = 0; i < items.length - 1; i++) {
779
- for (let j = i + 1; j < items.length; j++) {
780
- if (
781
- verticesDistance(oPos, new Three.Vector2(items[i].x, items[i].y)) >
782
- verticesDistance(oPos, new Three.Vector2(items[j].x, items[j].y))
783
- ) {
784
- let exchange = items[j];
785
- items[j] = items[i];
786
- items[i] = exchange;
787
- }
788
- }
789
- }
790
- let i = 0;
791
-
792
- for (; i < items.length; i++) {
793
- if (!items[i]) return;
794
- let target =
795
- planData.sceneGraph.layers[selectedObject.layerID].items[items[i].id];
796
- if (target === undefined) {
797
- return false;
798
- }
799
- let targetData = layer.items.getIn([items[i].id]);
800
- let tRot = targetData.rotation;
801
- let tPos = new Three.Vector2(targetData.x, targetData.y);
802
- let tBounding = target.children[0].userData;
803
- let twidth = tBounding.max.x - tBounding.min.x;
804
- let tdepth = tBounding.max.z - tBounding.min.z;
805
- let tVertices = this.getRectPoints(
806
- twidth,
807
- tdepth,
808
- tPos.clone(),
809
- ((tRot % 360) / 180) * Math.PI
810
- );
811
- if (getInterSect(sVertices, tVertices)) {
812
- break;
813
- }
814
- }
815
- if (items.length == 0 || !items[i]) return;
816
- let target =
817
- planData.sceneGraph.layers[selectedObject.layerID].items[items[i].id];
818
- let targetData = layer.items.getIn([items[i].id]);
819
- let targetPos = new Three.Vector2(targetData.x, targetData.y);
820
- let tRot = targetData.rotation;
821
- let tBounding = target.children[0].userData;
822
- let twidth = tBounding.max.x - tBounding.min.x;
823
- let tdepth = tBounding.max.z - tBounding.min.z;
824
- let tVertices = this.getRectPoints(
825
- twidth,
826
- tdepth,
827
- targetPos.clone(),
828
- ((tRot % 360) / 180) * Math.PI
829
- );
830
- // ////////////////////////
831
- let vArray = [];
832
- let dteArray = [];
833
- let lineArray = [];
834
- let vdistanceArray = [];
835
- let cVecArray = [];
836
- let inFlag = false;
837
- for (let i = 0; i < 4; i++) {
838
- let v1 = tVertices[i];
839
- let v2 = tVertices[i + 1];
840
- let data = pointLineDistance({ x: tPos.x, y: tPos.y }, [
841
- { x: v1.x, y: v1.y },
842
- { x: v2.x, y: v2.y }
843
- ]);
844
- dteArray.push(data.distance);
845
- vArray.push(data.point);
846
- lineArray.push([v1, v2]);
847
- }
848
- // if tPos in target object
849
- let tPosDistance =
850
- Math.abs(pointLineDistance(tPos, lineArray[0]).distance) +
851
- Math.abs(pointLineDistance(tPos, lineArray[2]).distance);
852
- let realDistance = new Three.Vector2(
853
- lineArray[1][0].x - lineArray[1][1].x,
854
- lineArray[1][0].y - lineArray[1][1].y
855
- ).length();
856
- let tPosDistance1 =
857
- Math.abs(pointLineDistance(tPos, lineArray[1]).distance) +
858
- Math.abs(pointLineDistance(tPos, lineArray[3]).distance);
859
- let realDistance1 = new Three.Vector2(
860
- lineArray[0][0].x - lineArray[0][1].x,
861
- lineArray[0][0].y - lineArray[0][1].y
862
- ).length();
863
- if (
864
- Math.abs(Math.abs(tPosDistance) - Math.abs(realDistance)) < 0.01 &&
865
- Math.abs(Math.abs(tPosDistance1) - Math.abs(realDistance1)) < 0.01
866
- )
867
- inFlag = true;
868
- // ////////////////////
869
- let key = 0;
870
- // sort distance from origin point
871
- for (let j = 0; j < dteArray.length - 1; j++) {
872
- for (let k = j + 1; k < dteArray.length; k++) {
873
- if (Math.abs(dteArray[j]) > Math.abs(dteArray[k])) {
874
- let temp = dteArray[k];
875
- dteArray[j] = dteArray[k];
876
- dteArray[k] = temp;
877
- let temp1 = vArray[k];
878
- vArray[j] = vArray[k];
879
- vArray[k] = temp1;
880
- let temp2 = lineArray[k];
881
- lineArray[j] = lineArray[k];
882
- lineArray[k] = temp2;
883
- }
884
- }
885
- }
886
- // //////////////////////////////
887
- for (let i = 0; i < 4; i++) {
888
- let data = pointLineDistance(sVertices[i], lineArray[key]);
889
- vdistanceArray.push(data.distance);
890
- cVecArray.push({
891
- x: data.point.x - sVertices[i].x,
892
- y: data.point.y - sVertices[i].y
893
- });
894
- }
895
-
896
- for (let j = 0; j < vdistanceArray.length; j++) {
897
- let tX = tPos.x + cVecArray[j].x;
898
- let tY = tPos.y + cVecArray[j].y;
899
- if (
900
- this.collisionCheck(
901
- item3D,
902
- new Three.Vector2(tX, tY),
903
- item.rotation,
904
- {
905
- userData: { itemId: null }
906
- },
907
- item,
908
- this.context.catalog
909
- )
910
- ) {
911
- item3D.position.set(tX, originPos.y, -tY);
912
- sPoint.set(tX, tY);
913
- break;
914
- }
915
- }
916
- };
917
-
918
- this.snap = function (obj, layer) {
919
- // snap operation
920
- let target = obj.userData.target;
921
- for (; target.parent != null; ) {
922
- if (target.name == 'pivot') break;
923
- target = target.parent;
924
- }
925
- let source = obj.parent.parent.parent;
926
- if (target.userData.type == 'item') {
927
- let sRot = layer.getIn(['items', source.userData.itemId]).rotation;
928
- let tRot = layer.getIn(['items', target.userData.itemId])
929
- ? layer.getIn(['items', target.userData.itemId]).rotation
930
- : 0;
931
- let item = layer.getIn(['items', source.userData.itemId]);
932
- let layoutType = item.layoutpos;
933
- let altitudeLength = convert(
934
- item.properties.getIn(['altitude', '_length'])
935
- )
936
- .from('in')
937
- .to('cm');
938
- let sBounding = source.children[0].userData;
939
- let tBounding = target.children[0].userData;
940
- let tPos = target.position.clone();
941
- let width = sBounding.max.x - sBounding.min.x;
942
- let height = sBounding.max.y - sBounding.min.y;
943
- let depth = sBounding.max.z - sBounding.min.z;
944
- let snapBoxGeom = new Three.BoxGeometry(width, height, depth);
945
- let snapBoxObj = new Three.Mesh(
946
- snapBoxGeom,
947
- new Three.MeshBasicMaterial({
948
- // color: 0x2cde6b,
949
- // opacity: 0.7,
950
- transparent: true,
951
- blending: Three.MultiplyBlending
952
- })
953
- );
954
- let removeSnapBoxObj = () => {
955
- if (snapBoxObj) {
956
- planData.plan.remove(snapBoxObj);
957
- disposeObject(snapBoxObj);
958
- }
959
- snapFlag = false;
960
- };
961
- let box = new Three.BoxHelper(snapBoxObj, 0xffffff);
962
- box.material.linewidth = 2;
963
- box.material.depthTest = false;
964
- box.renderOrder = 200;
965
- snapBoxObj.add(box);
966
- snapBoxObj.position.set(
967
- source.position.x,
968
- layoutType === WALL_CABINET_LAYOUTPOS
969
- ? altitudeLength + source.position.y + height / 2
970
- : source.position.y + height / 2,
971
- source.position.z
972
- );
973
- snapBoxObj.rotation.set(
974
- source.rotation.x,
975
- source.rotation.y,
976
- source.rotation.z
977
- );
978
- snapBoxObj.name = 'TransformBox';
979
- planData.plan.add(snapBoxObj);
980
- let deltaX =
981
- (tBounding.max.x - tBounding.min.x) / 2 +
982
- (sBounding.max.x - sBounding.min.x) / 2;
983
- let deltaZ =
984
- (tBounding.max.z - tBounding.min.z) / 2 -
985
- (sBounding.max.z - sBounding.min.z) / 2;
986
- let sPos = snapBoxObj.position.clone();
987
- // avaliable snap place///////////////
988
- let tPoses = [];
989
- let pX =
990
- tPos.x +
991
- deltaX * Math.cos((tRot / 180) * Math.PI) +
992
- deltaZ * Math.sin((tRot / 180) * Math.PI);
993
- let pZ =
994
- tPos.z -
995
- deltaX * Math.sin((tRot / 180) * Math.PI) +
996
- deltaZ * Math.cos((tRot / 180) * Math.PI);
997
- tPoses.push(new Three.Vector3(pX, 0, pZ));
998
- deltaX = -deltaX;
999
- pX =
1000
- tPos.x +
1001
- deltaX * Math.cos((tRot / 180) * Math.PI) +
1002
- deltaZ * Math.sin((tRot / 180) * Math.PI);
1003
- pZ =
1004
- tPos.z -
1005
- deltaX * Math.sin((tRot / 180) * Math.PI) +
1006
- deltaZ * Math.cos((tRot / 180) * Math.PI);
1007
- tPoses.push(new Three.Vector3(pX, 0, pZ));
1008
- deltaX =
1009
- (tBounding.max.x - tBounding.min.x) / 2 -
1010
- (sBounding.max.x - sBounding.min.x) / 2;
1011
- deltaZ =
1012
- -(tBounding.max.z - tBounding.min.z) / 2 -
1013
- (sBounding.max.z - sBounding.min.z) / 2;
1014
- pX =
1015
- tPos.x +
1016
- deltaX * Math.cos((tRot / 180) * Math.PI) +
1017
- deltaZ * Math.sin((tRot / 180) * Math.PI);
1018
- pZ =
1019
- tPos.z -
1020
- deltaX * Math.sin((tRot / 180) * Math.PI) +
1021
- deltaZ * Math.cos((tRot / 180) * Math.PI);
1022
- tPoses.push(new Three.Vector3(pX, 0, pZ));
1023
- deltaX = -deltaX;
1024
- pX =
1025
- tPos.x +
1026
- deltaX * Math.cos((tRot / 180) * Math.PI) +
1027
- deltaZ * Math.sin((tRot / 180) * Math.PI);
1028
- pZ =
1029
- tPos.z -
1030
- deltaX * Math.sin((tRot / 180) * Math.PI) +
1031
- deltaZ * Math.cos((tRot / 180) * Math.PI);
1032
- tPoses.push(new Three.Vector3(pX, 0, pZ));
1033
- let distance = Math.sqrt(
1034
- (sPos.x - tPoses[0].x) * (sPos.x - tPoses[0].x) +
1035
- (sPos.z - tPoses[0].z) * (sPos.z - tPoses[0].z)
1036
- );
1037
- let tNum = 1;
1038
- tPos = tPoses[0].clone();
1039
- for (let i = 1; i < tPoses.length; i++) {
1040
- let curDis = Math.sqrt(
1041
- (sPos.x - tPoses[i].x) * (sPos.x - tPoses[i].x) +
1042
- (sPos.z - tPoses[i].z) * (sPos.z - tPoses[i].z)
1043
- );
1044
- if (curDis < distance) {
1045
- distance = curDis;
1046
- tNum = i + 1;
1047
- tPos = tPoses[i].clone();
1048
- }
1049
- }
1050
- // //////////////////////////////////
1051
- if (
1052
- targetObj != null &&
1053
- targetObj.userData.itemId == target.userData.itemId &&
1054
- tNum == targetNumber
1055
- ) {
1056
- removeSnapBoxObj();
1057
- return;
1058
- } else {
1059
- removeSnapBox();
1060
- }
1061
- // //////////////////////////////////
1062
- if (tNum >= 3) tRot += 180;
1063
-
1064
- snapAnimI = 0;
1065
- t_i = 0;
1066
- targetObj = target;
1067
- targetNumber = tNum;
1068
- targetRot = tRot;
1069
- targetPoint = tPos;
1070
- snapBox = snapBoxObj;
1071
- let cx = sPos.x - tPos.x;
1072
- let cz = sPos.z - tPos.z;
1073
- targetUVec = new Three.Vector3(cx, 0, cz);
1074
- targetCRotation = (((tRot - sRot) % 360) / 180) * Math.PI;
1075
- } else {
1076
- let item = layer.getIn(['items', source.userData.itemId]);
1077
- if (holeItems.length) {
1078
- let i;
1079
- for (i = 0; i < holeItems.length; i++) {
1080
- let hole = holeItems[i];
1081
- if (Math.abs(Math.sin(selectedObj.rotRad)) === 1) {
1082
- if (
1083
- item.y + selectedObj.size.width / 2 >=
1084
- hole.y - hole.width / 2 &&
1085
- item.y - selectedObj.size.width / 2 <=
1086
- hole.y + hole.width / 2 &&
1087
- (selectedObj.rotRad == 0 || selectedObj.rotRad == -Math.PI / 2
1088
- ? item.x <= hole.x &&
1089
- item.x + selectedObj.size.height >= hole.x
1090
- : item.x >= hole.x &&
1091
- item.x - selectedObj.size.height <= hole.x)
1092
- )
1093
- break;
1094
- } else {
1095
- if (
1096
- item.x + selectedObj.size.width / 2 >=
1097
- hole.x - hole.width / 2 &&
1098
- item.x - selectedObj.size.width / 2 <=
1099
- hole.x + hole.width / 2 &&
1100
- (selectedObj.rotRad == 0 || selectedObj.rotRad == -Math.PI / 2
1101
- ? item.y <= hole.y &&
1102
- item.y + selectedObj.size.height >= hole.y
1103
- : item.y >= hole.y &&
1104
- item.y - selectedObj.size.height <= hole.y)
1105
- )
1106
- break;
1107
- }
1108
- }
1109
- if (i != holeItems.length) return;
1110
- }
1111
- if (target.userData.type == 'hole') {
1112
- snapFlag = false;
1113
- return;
1114
- } else {
1115
- let layoutType = item.layoutpos;
1116
- let altitudeLength = convert(
1117
- item.properties.getIn(['altitude', '_length'])
1118
- )
1119
- .from('in')
1120
- .to('cm');
1121
- let sBounding = source.children[0].userData;
1122
- let width = sBounding.max.x - sBounding.min.x;
1123
- let height = sBounding.max.y - sBounding.min.y;
1124
- let depth = sBounding.max.z - sBounding.min.z;
1125
- let snapBoxGeom = new Three.BoxGeometry(width, height, depth);
1126
- let snapBoxObj = new Three.Mesh(
1127
- snapBoxGeom,
1128
- new Three.MeshBasicMaterial({
1129
- // color: 0x2cde6b,
1130
- // opacity: 0.7,
1131
- transparent: true,
1132
- blending: Three.MultiplyBlending
1133
- })
1134
- );
1135
- let removeSnapBoxObj = () => {
1136
- if (snapBoxObj) {
1137
- planData.plan.remove(snapBoxObj);
1138
- disposeObject(snapBoxObj);
1139
- }
1140
- snapFlag = false;
1141
- };
1142
- let box = new Three.BoxHelper(snapBoxObj, 0xffffff);
1143
- box.material.linewidth = 2;
1144
- box.material.depthTest = false;
1145
- box.renderOrder = 100;
1146
- snapBoxObj.add(box);
1147
-
1148
- snapBoxObj.position.set(
1149
- source.position.x,
1150
- layoutType === WALL_CABINET_LAYOUTPOS
1151
- ? altitudeLength + source.position.y + height / 2
1152
- : source.position.y + height / 2,
1153
- source.position.z
1154
- );
1155
- snapBoxObj.rotation.set(
1156
- source.rotation.x,
1157
- source.rotation.y,
1158
- source.rotation.z
1159
- );
1160
- snapBoxObj.name = 'TransformBox';
1161
- planData.plan.add(snapBoxObj);
1162
-
1163
- let snapLine = layer.getIn(['lines', target.userData.lineId]);
1164
- // let snapLineThickness = snapLine.properties.getIn([
1165
- // 'thickness',
1166
- // 'length'
1167
- // ]);
1168
- let snapLineThickness = 10.64;
1169
- let vertices = [];
1170
- if (snapLine === undefined) return;
1171
- snapLine.vertices.forEach(data => {
1172
- let vec = layer.getIn(['vertices', data]);
1173
- vertices.push(vec);
1174
- });
1175
- let iX = source.position.clone().x;
1176
- let iY = -source.position.clone().z;
1177
- let lineVec = new Three.Vector2(
1178
- vertices[1].x - vertices[0].x,
1179
- vertices[1].y - vertices[0].y
1180
- );
1181
- let oLength = Math.sqrt(
1182
- lineVec.x * lineVec.x + lineVec.y * lineVec.y
1183
- );
1184
- lineVec.normalize();
1185
- let vec2 = new Three.Vector2(iX - vertices[0].x, iY - vertices[0].y);
1186
- let vec2Legnth = Math.sqrt(vec2.x * vec2.x + vec2.y * vec2.y);
1187
- let angle = Math.abs(lineVec.angle() - vec2.angle());
1188
- angle = angle > Math.PI ? 2 * Math.PI - angle : angle;
1189
- let lineLength = Math.cos(angle) * vec2Legnth;
1190
- let transLength = 0;
1191
- if (lineLength < 100) {
1192
- transLength = -lineLength + (snapLineThickness + width) / 2;
1193
- }
1194
- if (lineLength > oLength - 100) {
1195
- transLength =
1196
- -lineLength - (snapLineThickness + width) / 2 + oLength;
1197
- }
1198
- let directPoint = new Three.Vector2(
1199
- lineVec.x * lineLength + vertices[0].x,
1200
- lineVec.y * lineLength + vertices[0].y
1201
- );
1202
- let directLine = new Three.Vector2(
1203
- directPoint.x - iX,
1204
- directPoint.y - iY
1205
- );
1206
- let dLength = Math.sqrt(
1207
- (iX - directPoint.x) * (iX - directPoint.x) +
1208
- (iY - directPoint.y) * (iY - directPoint.y)
1209
- );
1210
- let reduceLen = (snapLineThickness + depth) / 2;
1211
- let scale = (dLength - reduceLen) / dLength;
1212
- let tPos = new Three.Vector2(
1213
- iX + (directPoint.x - iX) * scale + lineVec.x * transLength,
1214
- iY + (directPoint.y - iY) * scale + lineVec.y * transLength
1215
- );
1216
- let realAngle = directLine.angle() - Math.PI / 2;
1217
- let tRot = (realAngle * 180) / Math.PI;
1218
- let sPos = new Three.Vector2(iX, iY);
1219
- let sRot = item.rotation;
1220
- let tNum = 0;
1221
- // //////////////////////////////////////
1222
- // check part////
1223
- let result = this.collisionCheck(
1224
- source,
1225
- tPos,
1226
- tRot,
1227
- target,
1228
- item,
1229
- this.context.catalog
1230
- );
1231
- // console.log('result', result);
1232
- if (result == false) {
1233
- removeSnapBoxObj();
1234
- removeSnapBox();
1235
- return;
1236
- }
1237
- // ////////////////
1238
- if (targetObj === target && snapBox !== null) {
1239
- removeSnapBoxObj();
1240
- snapAnimI = 20;
1241
- targetPoint = new Three.Vector3(tPos.x, 0, -tPos.y);
1242
- let sourcePos = snapBox.position.clone();
1243
- let cx = sourcePos.x - targetPoint.x;
1244
- let cz = sourcePos.z - targetPoint.z;
1245
- targetUVec = new Three.Vector3(cx, 0, cz);
1246
- targetRot = tRot;
1247
- targetCRotation = (((tRot - sRot) % 360) / 180) * Math.PI;
1248
- snapFlag = false;
1249
- return;
1250
- } else {
1251
- removeSnapBox();
1252
- }
1253
- // //////////////////////////////////////
1254
- snapAnimI = 0;
1255
- t_i = 0;
1256
- targetObj = target;
1257
- targetNumber = tNum;
1258
- targetRot = tRot;
1259
- targetPoint = new Three.Vector3(tPos.x, 0, -tPos.y);
1260
- snapBox = snapBoxObj;
1261
- let sourcePos = snapBox.position.clone();
1262
- let cx = sourcePos.x - targetPoint.x;
1263
- let cz = sourcePos.z - targetPoint.z;
1264
- targetUVec = new Three.Vector3(cx, 0, cz);
1265
- targetRot = tRot;
1266
- targetCRotation = (((tRot - sRot) % 360) / 180) * Math.PI;
1267
- }
1268
- }
1269
- };
1270
-
1271
- /*end of snap functions*/
1272
- let selectedObj = null;
1273
- let firstMove = false;
1274
- let prevX, prevY;
1275
-
1276
- let selObj = null;
1277
-
1278
- let createToolObject = () => {
1279
- const canvas = document.createElement('canvas');
1280
- canvas.width = 100;
1281
- canvas.height = 200;
1282
- canvas.style.width = 50 + 'px';
1283
- canvas.style.height = 100 + 'px';
1284
- const ctx = canvas.getContext('2d');
1285
- ctx.fillStyle = '#FFFFFF';
1286
- ctx.strokeStyle = '#000000';
1287
- ctx.beginPath();
1288
- ctx.arc(50, 50, 40, 0, 4 * Math.PI);
1289
- ctx.fill();
1290
- ctx.stroke();
1291
- let img1 = new Image();
1292
- img1.crossOrigin = 'anonymous';
1293
- img1.src = '/assets/img/svg/3d_item_rotation.svg';
1294
- img1.onload = function () {
1295
- ctx.drawImage(img1, 16, 16, 68, 68);
1296
- };
1297
-
1298
- ctx.beginPath();
1299
- ctx.arc(50, 150, 40, 0, 4 * Math.PI);
1300
- ctx.fill();
1301
- ctx.stroke();
1302
- let img2 = new Image();
1303
- img2.crossOrigin = 'anonymous';
1304
- img2.src = '/assets/img/svg/3d_item_move.svg';
1305
- img2.onload = function () {
1306
- ctx.drawImage(img2, 16, 116, 68, 68);
1307
- };
1308
-
1309
- return canvas;
1310
- };
1311
-
1312
- let clockWise = true;
1313
- let lastAngle = 0;
1314
-
1315
- let createAngleObject = rotate => {
1316
- const canvas = document.createElement('canvas');
1317
- canvas.width = 100;
1318
- canvas.height = 100;
1319
- canvas.style.width = 100 + 'px';
1320
- canvas.style.height = 100 + 'px';
1321
- const ctx = canvas.getContext('2d');
1322
- ctx.strokeStyle = '#FFFFFF';
1323
- ctx.lineWidth = 10;
1324
- ctx.beginPath();
1325
- ctx.arc(50, 50, 45, 0, 2 * Math.PI);
1326
- ctx.stroke();
1327
-
1328
- ctx.strokeStyle = SECONDARY_PURPLE_COLOR;
1329
- ctx.lineWidth = 6;
1330
- ctx.beginPath();
1331
- if (lastAngle < 15 && lastAngle > -15) {
1332
- if (rotate >= 0) {
1333
- clockWise = false;
1334
- } else {
1335
- clockWise = true;
1336
- }
1337
- if (lastAngle === 0) {
1338
- if (rotate > -180) {
1339
- clockWise = true;
1340
- } else {
1341
- clockWise = false;
1342
- }
1343
- }
1344
- }
1345
-
1346
- ctx.arc(50, 50, 45, 0, (rotate / 180.0) * Math.PI, clockWise);
1347
- ctx.stroke();
1348
-
1349
- lastAngle = rotate;
1350
-
1351
- return canvas;
1352
- };
1353
-
1354
- let toolTexture = new Three.Texture(createToolObject());
1355
- toolTexture.needsUpdate = true;
1356
-
1357
- let toolObj = new Three.Sprite(
1358
- new Three.SpriteMaterial({ map: toolTexture, sizeAttenuation: true })
1359
- );
1360
- toolObj.material.transparent = true;
1361
- toolObj.material.depthTest = false;
1362
- toolObj.scale.set(20, 40, 20);
1363
- toolObj.renderOrder = 3;
1364
- toolObj.name = 'toolObj';
1365
-
1366
- let angleTexture = new Three.Texture(createAngleObject(0));
1367
- angleTexture.needsUpdate = true;
1368
-
1369
- let angleObj = new Three.Sprite(
1370
- new Three.SpriteMaterial({ map: angleTexture, sizeAttenuation: false })
1371
- );
1372
-
1373
- angleObj.scale.set(0.075, 0.075, 0.075);
1374
- angleObj.material.transparent = true;
1375
- angleObj.material.depthTest = false;
1376
- angleObj.renderOrder = 3;
1377
- angleObj.name = 'angleObj';
1378
-
1379
- /**
1380
- * Calculate plane point of mouse with `event` & `altitude`
1381
- * * Calculate mouse.x & mouse.y
1382
- * * Set raycaster from camera & Set raycaster direction
1383
- * * Calculate Point & dispatch an action
1384
- */
1385
- const getPoint = (e, alti) => {
1386
- mouse.x = (e.offsetX / this.width) * 2 - 1;
1387
- mouse.y = (-e.offsetY / this.height) * 2 + 1;
1388
-
1389
- raycaster.setFromCamera(mouse, camera);
1390
- rayDirection = raycaster.ray.direction;
1391
-
1392
- Point = mapCursorPosition(e, alti);
1393
- this.context.projectActions.updateMouseCoord(Point);
1394
- };
1395
-
1396
- const getIntersectWallPoint = e => {
1397
- mouse.x = (e.offsetX / this.width) * 2 - 1;
1398
- mouse.y = (-e.offsetY / this.height) * 2 + 1;
1399
-
1400
- raycaster.setFromCamera(mouse, camera);
1401
- rayDirection = raycaster.ray.direction;
1402
-
1403
- let lines = planData.sceneGraph.layers[scene.selectedLayer].lines;
1404
- let keys = Object.keys(lines);
1405
- let arrMesh = [];
1406
- keys.forEach(key => {
1407
- lines[key].children[0].children.forEach(mesh => {
1408
- if (mesh.name == 'soul' && mesh.visible) arrMesh.push(mesh);
1409
- });
1410
- });
1411
- if (arrMesh.length > 0) {
1412
- const intersects = raycaster.intersectObjects(arrMesh);
1413
- if (intersects.length > 0) {
1414
- let intersectPt = intersects[0].point;
1415
- intersectPt.applyMatrix4(gridMatrix);
1416
-
1417
- Point = { x: intersectPt.x, y: -intersectPt.z };
1418
- this.context.projectActions.updateMouseCoord(Point);
1419
- return true;
1420
- }
1421
- }
1422
-
1423
- return false;
1424
- };
1425
-
1426
- this.mouseDownEvent = event => {
1427
- gridPlanOrigin = gridPlane.position;
1428
- gridMatrix.copy(gridPlane.matrixWorld).invert();
1429
- let altitude = 0;
1430
- if (
1431
- allItemRect &&
1432
- allItemRect.cur &&
1433
- allItemRect.cur.itemInfo !== undefined
1434
- ) {
1435
- let properties = allItemRect.cur.itemInfo.properties;
1436
- altitude = properties.getIn(['altitude', '_length']);
1437
- let unit = properties.getIn(['altitude', '_unit']) || 'in';
1438
- altitude = convert(altitude).from(unit).to(this.props.state.scene.unit);
1439
- }
1440
- getPoint(event, altitude);
1441
-
1442
- const state = this.props.state;
1443
-
1444
- this.lastMousePosition.x = mouse.x;
1445
- this.lastMousePosition.y = mouse.y;
1446
-
1447
- const layer = state.scene.getIn(['layers', state.scene.selectedLayer]);
1448
- const sCount =
1449
- layer.selected.areas.size +
1450
- layer.selected.holes.size +
1451
- layer.selected.items.size +
1452
- layer.selected.lines.size;
1453
-
1454
- if (sCount <= 0) {
1455
- isSelected = false;
1456
- } else if (sCount >= 0 && selectedObject && 'holeID' in selectedObject) {
1457
- isSelected = true;
1458
- }
1459
-
1460
- prevX = Point.x;
1461
- prevY = Point.y;
1462
-
1463
- /**
1464
- * 0 - rotate
1465
- * 1 - move up/down
1466
- * 2 - move x/y
1467
- * 3 - camera rotate
1468
- */
1469
- let transflag = 3;
1470
- raycaster.setFromCamera(mouse, camera);
1471
- const meshes = [];
1472
- toIntersect.forEach(object => {
1473
- if (!object) return;
1474
- object.traverse(o => {
1475
- if (o.isMesh) meshes.push(o);
1476
- });
1477
- });
1478
- let intersects = raycaster.intersectObjects(meshes, true);
1479
-
1480
- let toolIntersects = raycaster.intersectObjects([toolObj], true);
1481
-
1482
- if (toolIntersects.length > 0) {
1483
- let distance = Math.sqrt(
1484
- Math.pow((toolIntersects[0].uv.x - 0.5) * 50, 2) +
1485
- Math.pow((toolIntersects[0].uv.y - 0.25) * 100, 2)
1486
- );
1487
- if (distance <= 20) {
1488
- transflag = 2;
1489
- } else {
1490
- distance = Math.sqrt(
1491
- Math.pow((toolIntersects[0].uv.x - 0.5) * 50, 2) +
1492
- Math.pow((toolIntersects[0].uv.y - 0.75) * 100, 2)
1493
- );
1494
- if (distance <= 20) {
1495
- transflag = 0;
1496
- }
1497
- }
1498
- }
1499
-
1500
- if (intersects.length > 0) {
1501
- let i = 0,
1502
- length = intersects.length;
1503
- for (i = 0; i < length; i++) {
1504
- if (
1505
- intersects[i].object.type !== 'BoxHelper' &&
1506
- // intersects[i].object.type === OBJTYPE_MESH &&
1507
- intersects[i].object.name !== 'lineText' &&
1508
- intersects[i].object.name !== 'soul' &&
1509
- !intersects[i].object.name.includes('WarningBox')
1510
- )
1511
- break;
1512
- }
1513
-
1514
- if (intersects[i] !== undefined) {
1515
- if (intersects[i].object.name.indexOf('transUp') != -1) transflag = 1;
1516
- if (intersects[i].object.name.indexOf('transHole') != -1)
1517
- transflag = 2;
1518
- } else {
1519
- console.log('intersects[i] is undefined in viewer3d/viewer3d.js');
1520
- }
1521
- }
1522
-
1523
- if (this.props.state.mode == MODE_DRAWING_ITEM_3D) return;
1524
-
1525
- if (isSelected) {
1526
- if (intersects.length > 0 && !isNaN(intersects[0].distance)) {
1527
- let i;
1528
- for (i = 0; i < intersects.length; i++) {
1529
- if (
1530
- intersects[i].object instanceof Three.Mesh &&
1531
- intersects[i].object.name != 'TransformBox' &&
1532
- intersects[i].object.type != 'Line' &&
1533
- intersects[i].object.name != 'lineText' &&
1534
- intersects[i].object.name != 'countertops' &&
1535
- intersects[i].object.type != 'BoxHelper' &&
1536
- intersects[i].object.name != 'floor' &&
1537
- intersects[i].object.name != 'backFace' &&
1538
- intersects[i].object.name != 'soul' &&
1539
- !intersects[i].object.name.includes('backsplash') &&
1540
- !intersects[i].object.name.includes('WarningBox')
1541
- )
1542
- break;
1543
- }
1544
- if (intersects[i] === undefined) {
1545
- if (transflag !== 0 && transflag !== 2) {
1546
- isSelected = false;
1547
- this.context.projectActions.unselectAll();
1548
- scene3D.remove(toolObj);
1549
- this.context.itemsActions.removeReplacingSupport();
1550
- // orbitController.enableRotate = true;
1551
- return;
1552
- }
1553
- }
1554
- if (selectedObject !== undefined) {
1555
- sPoint.set(Point.x, Point.y);
1556
- if (transflag == 0) {
1557
- scene3D.remove(toolObj);
1558
- let alti = 0;
1559
- if (
1560
- allItemRect &&
1561
- allItemRect.cur &&
1562
- allItemRect.cur.itemInfo !== undefined
1563
- ) {
1564
- let properties = allItemRect.cur.itemInfo.properties;
1565
- alti = properties.getIn(['altitude', '_length']);
1566
- let unit = properties.getIn(['altitude', '_unit']) || 'in';
1567
- alti = convert(alti).from(unit).to(this.props.state.scene.unit);
1568
- }
1569
- getPoint(
1570
- { offsetX: event.offsetX - 50, offsetY: event.offsetY },
1571
- alti
1572
- );
1573
- let selectedItem =
1574
- planData.sceneGraph.layers[selectedObject.layerID].items[
1575
- selectedObject.itemID
1576
- ];
1577
- if (isUndefined(selectedItem)) return;
1578
- const selItem = this.props.state.scene.layers
1579
- .get(selectedObject.layerID)
1580
- .items.get(selectedObject.itemID);
1581
-
1582
- lastAngle = 0;
1583
-
1584
- angleObj.position.set(
1585
- planData.plan.position.x + Point.x,
1586
- selItem.category === 'lighting'
1587
- ? -planData.plan.position.y -
1588
- selItem.properties.get('height').get('length')
1589
- : selItem.properties.get('altitude').get('length') +
1590
- planData.plan.position.y,
1591
- planData.plan.position.z - Point.y
1592
- );
1593
-
1594
- angleTexture.image = createAngleObject(0);
1595
- angleTexture.needsUpdate = true;
1596
-
1597
- scene3D.add(angleObj);
1598
- this.setState({ angleObj: angleObj });
1599
- let centerPos = Point;
1600
- getPoint(event, alti);
1601
-
1602
- this.context.itemsActions.beginRotatingItem3D(
1603
- selectedObject.layerID,
1604
- selectedObject.itemID,
1605
- Point.x,
1606
- Point.y,
1607
- centerPos.x,
1608
- centerPos.y
1609
- );
1610
- bRotate = true;
1611
- } else if (transflag == 1) {
1612
- bMoveUP = true;
1613
- } else if (transflag == 2) {
1614
- switch (true) {
1615
- case 'holeID' in selectedObject:
1616
- this.context.holesActions.beginDraggingHole3D(
1617
- selectedObject.layerID,
1618
- selectedObject.holeID,
1619
- Point.x,
1620
- Point.y
1621
- );
1622
- break;
1623
- default:
1624
- this.context.itemsActions.beginDraggingItem3D(
1625
- selectedObject.layerID,
1626
- selectedObject.itemID,
1627
- Point.x,
1628
- Point.y
1629
- );
1630
- break;
1631
- }
1632
- bMove = true;
1633
- scene3D.remove(toolObj);
1634
- }
1635
- if (!ARRAY_ELEVATION_VIEW_MODES.includes(mode))
1636
- cameraControls.mouseButtons.left = CameraControls.ACTION.NONE;
1637
- }
1638
- } else {
1639
- isSelected = false;
1640
- this.context.projectActions.unselectAll();
1641
- scene3D.remove(toolObj);
1642
- this.context.itemsActions.removeReplacingSupport();
1643
- // orbitController.enableRotate = true;
1644
- return;
1645
- }
1646
- }
1647
- };
1648
-
1649
- this.renderer.setClearColor(new Three.Color(SharedStyle.COLORS.white)); // 3D background color
1650
- this.renderer.setSize(this.width, this.height);
1651
-
1652
- // Add the output of the renderer to the html element
1653
- const canvasWrapper = ReactDOM.findDOMNode(this.refs.canvasWrapper);
1654
- canvasWrapper.appendChild(this.renderer.domElement);
1655
-
1656
- //
1657
-
1658
- if (
1659
- scene.getIn(['layers', scene.selectedLayer, 'selected', 'items']).size !=
1660
- 0
1661
- ) {
1662
- // if selected Object
1663
- isSelected = true;
1664
- selectedObject.layerID = scene.selectedLayer;
1665
- selectedObject.itemID = scene
1666
- .getIn(['layers', scene.selectedLayer, 'selected', 'items'])
1667
- .toJS()[0];
1668
- setTimeout(() => {
1669
- try {
1670
- currentObject =
1671
- planData.sceneGraph.layers[selectedObject.layerID].items[
1672
- selectedObject.itemID
1673
- ];
1674
- if (isUndefined(currentObject)) return;
1675
- const selItem = this.props.state.scene.layers
1676
- .get(selectedObject.layerID)
1677
- .items.get(selectedObject.itemID);
1678
- let itemPos = currentObject.position.clone();
1679
- toolObj.position.set(
1680
- planData.plan.position.x + itemPos.x,
1681
- selItem.category === 'lighting'
1682
- ? -planData.plan.position.y -
1683
- selItem.properties.get('height').get('length')
1684
- : planData.plan.position.y + currentObject.children[0].position.y,
1685
- planData.plan.position.z + itemPos.z
1686
- );
1687
-
1688
- scene3D.add(toolObj);
1689
- this.setState({ toolObj: toolObj });
1690
- } catch (err) {
1691
- console.log(
1692
- 'selectedObject : ' +
1693
- JSON.stringify(selectedObject) +
1694
- '\nError: ' +
1695
- err
1696
- );
1697
- }
1698
- }, 2000);
1699
- }
1700
-
1701
- // Scene functions
1702
-
1703
- function init() {
1704
- clock = new Three.Clock();
1705
- scene3D = new Three.Scene();
1706
- scene3D.background = new Three.Color(0xc3cadc); // change color about v1: 0x8791AB, v2: 0xC2C2C2, v3: 0xC3CADC
1707
- // scene3D.fog = new Three.Fog(0xC3CADC, 2000, 3500);
1708
- window.scene3D = scene3D;
1709
- // Camera
1710
- if (ARRAY_ELEVATION_VIEW_MODES.includes(state.mode)) {
1711
- let { layers } = scene;
1712
- let selectedLayer = layers.get(scene.selectedLayer);
1713
- let ceilHeight = convert(selectedLayer.ceilHeight)
1714
- .from(scene.rulerUnit)
1715
- .to(scene.unit);
1716
- let vertices = selectedLayer.vertices.toJS();
1717
- let maxX = 0,
1718
- maxY = 0,
1719
- minX = 0,
1720
- minY = 0;
1721
- let lines = [];
1722
- selectedLayer.lines.toArray().forEach(line => {
1723
- let vertex0 = selectedLayer.vertices.get(line.vertices.get(0));
1724
- let vertex1 = selectedLayer.vertices.get(line.vertices.get(1));
1725
- let { x: x1, y: y1 } = vertex0;
1726
- let { x: x2, y: y2 } = vertex1;
1727
- let data = line.toJS();
1728
- data = { ...data, l0: { x: x1, y: y1 }, l1: { x: x2, y: y2 } };
1729
- switch (mode) {
1730
- case MODE_FRONT_ELEVATION_VIEW:
1731
- if (almostEqual(y1, y2) && x1 < x2) {
1732
- lines.push(data);
1733
- }
1734
- break;
1735
- case MODE_BACK_ELEVATION_VIEW:
1736
- if (almostEqual(y1, y2) && x1 > x2) {
1737
- lines.push(data);
1738
- }
1739
- break;
1740
- case MODE_LEFT_ELEVATION_VIEW:
1741
- if (almostEqual(x1, x2) && y1 < y2) {
1742
- lines.push(data);
1743
- }
1744
- break;
1745
- case MODE_RIGHT_ELEVATION_VIEW:
1746
- if (almostEqual(x1, x2) && y1 > y2) {
1747
- lines.push(data);
1748
- }
1749
- break;
1750
- default:
1751
- break;
1752
- }
1753
- });
1754
- vertices.toArray().forEach(vertex => {
1755
- if (lines.filter(line => line.vertices.includes(vertex.id)).length) {
1756
- maxX = Math.max(vertex.x, maxX);
1757
- maxY = Math.max(vertex.y, maxY);
1758
- if (minX === 0) minX = vertex.x;
1759
- if (minY === 0) minY = vertex.y;
1760
- minX = Math.min(vertex.x, minX);
1761
- minY = Math.min(vertex.y, minY);
1762
- }
1763
- });
1764
- let line_length, angle, posX, posY;
1765
- switch (state.mode) {
1766
- case MODE_FRONT_ELEVATION_VIEW:
1767
- line_length = maxX - minX;
1768
- posY = minY - 100;
1769
- posX = (minX + maxX) / 2;
1770
- angle = 0;
1771
- break;
1772
- case MODE_RIGHT_ELEVATION_VIEW:
1773
- line_length = maxY - minY;
1774
- posX = minX - 100;
1775
- posY = (minY + maxY) / 2;
1776
- angle = -Math.PI / 2;
1777
- break;
1778
- case MODE_LEFT_ELEVATION_VIEW:
1779
- line_length = maxY - minY;
1780
- posX = maxX + 100;
1781
- posY = (minY + maxY) / 2;
1782
- angle = Math.PI / 2;
1783
- break;
1784
- case MODE_BACK_ELEVATION_VIEW:
1785
- line_length = maxX - minX;
1786
- posY = maxY + 100;
1787
- posX = (minX + maxX) / 2;
1788
- angle = Math.PI;
1789
- break;
1790
- }
1791
- let scale = Math.min(
1792
- (self.width * 0.85) / line_length,
1793
- (self.height * 0.85) / ceilHeight
1794
- );
1795
- // let frontRect = {width: line_length * scale, height: ceilHeight * scale};
1796
- let cameraRect = {
1797
- width: self.width / scale,
1798
- height: self.height / scale
1799
- };
1800
- camera = new Three.OrthographicCamera(
1801
- -cameraRect.width / 2,
1802
- cameraRect.width / 2,
1803
- cameraRect.height / 2,
1804
- -cameraRect.height / 2,
1805
- 1,
1806
- 10000
1807
- );
1808
- camera.position.set(posX, ceilHeight / 2, -posY);
1809
- camera.rotation.set(0, angle, 0);
1810
- } else {
1811
- const aspectRatio = self.width / self.height;
1812
- camera = new Three.PerspectiveCamera(45, aspectRatio, 1, 300000);
1813
- camera.position.set(0, 0, 1);
1814
- }
1815
- camera.layers.enable(1);
1816
-
1817
- function loadENV() {
1818
- new RGBELoader().load(
1819
- '/assets/brown_photostudio_02_1k.hdr',
1820
- function (texture) {
1821
- texture.mapping = Three.EquirectangularReflectionMapping;
1822
- scene3D.environment = texture;
1823
- texture.dispose();
1824
- }
1825
- );
1826
- }
1827
-
1828
- // Camera Controls
1829
- if (!ARRAY_ELEVATION_VIEW_MODES.includes(state.mode)) {
1830
- cameraControls = new CameraControls(camera, self.renderer.domElement);
1831
- cameraControls.dollyToCursor = true;
1832
- cameraControls.infinityDolly = true;
1833
- cameraControls.minDistance = 50;
1834
- cameraControls.maxDistance = Infinity;
1835
- cameraControls.zoomSpeed = 1;
1836
-
1837
- loadENV();
1838
- }
1839
-
1840
- scene3D.add(planData.plan);
1841
- scene3D.add(planData.grid);
1842
- scene3D.add(camera);
1843
- if (ARRAY_ELEVATION_VIEW_MODES.includes(state.mode)) {
1844
- planData.cam.add(camera);
1845
- scene3D.add(planData.cam);
1846
- } else {
1847
- pivot = new Three.Object3D();
1848
- pivot.add(camera);
1849
- scene3D.add(pivot);
1850
- }
1851
-
1852
- // LIGHT
1853
-
1854
- let light = new Three.AmbientLight(0xbfbfbf, 0.9); // soft white light
1855
- }
1856
-
1857
- function render() {
1858
- const delta = clock.getDelta(); // Get time delta for smooth updates
1859
- if (!ARRAY_ELEVATION_VIEW_MODES.includes(state.mode))
1860
- cameraControls.update(delta);
1861
- for (let i = 0; i < lights.length; i++) {
1862
- lights[i].light.position.set(
1863
- planData.plan.position.x + lights[i].x,
1864
- planData.plan.position.y + lights[i].height - 10,
1865
- planData.plan.position.z - lights[i].y
1866
- );
1867
- lights[i].target.position.set(
1868
- planData.plan.position.x + lights[i].x,
1869
- planData.plan.position.y,
1870
- planData.plan.position.z - lights[i].y
1871
- );
1872
- }
1873
-
1874
- camera.updateMatrix();
1875
- camera.updateMatrixWorld();
1876
-
1877
- for (let elemID in planData.sceneGraph.LODs) {
1878
- planData.sceneGraph.LODs[elemID].update(camera);
1879
- }
1880
- if (snapBox !== null) {
1881
- if (snapAnimI >= 15) {
1882
- if ('x' in targetPoint)
1883
- snapBox.position.set(
1884
- targetPoint.x,
1885
- snapBox.position.y,
1886
- targetPoint.z
1887
- );
1888
- snapFlag = false;
1889
- t_i++;
1890
- } else {
1891
- if (snapAnimI == 0) {
1892
- targetCRotation =
1893
- ((((targetRot / 180) * Math.PI - snapBox.rotation.y + Math.PI) *
1894
- 180) /
1895
- Math.PI) %
1896
- 360;
1897
- if (targetCRotation > 180) targetCRotation -= 360;
1898
- if (targetCRotation < -180) targetCRotation += 360;
1899
- targetCRotation = (targetCRotation / 180) * Math.PI;
1900
- }
1901
- if (snapAnimI < 10) {
1902
- snapBox.rotateY(targetCRotation / 10);
1903
- } else {
1904
- snapBox.position.set(
1905
- snapBox.position.clone().x - targetUVec.x / 10,
1906
- snapBox.position.clone().y - targetUVec.y / 10,
1907
- snapBox.position.clone().z - targetUVec.z / 10
1908
- );
1909
- }
1910
- snapAnimI++;
1911
- }
1912
- }
1913
-
1914
- if (t_i === 20) {
1915
- //stop snap after 5s
1916
- removeSnapBox();
1917
- }
1918
-
1919
- // hide hole if wall is not visible
1920
- let layerID = self.props.state.scene.selectedLayer;
1921
- let layer = self.props.state.scene.layers.get(layerID);
1922
- layer.holes.forEach(data => {
1923
- let line = planData.sceneGraph.layers[layerID].lines[data.line];
1924
- let hole = planData.sceneGraph.layers[layerID].holes[data.id];
1925
- if (line instanceof Three.Object3D && !line.isMesh) {
1926
- line = line.children[0].children[0];
1927
- // index(faces) of the line
1928
- const indexAttribute = line.geometry.getIndex();
1929
- const firstFaceIndices = [
1930
- indexAttribute.getX(0),
1931
- indexAttribute.getX(1),
1932
- indexAttribute.getX(2)
1933
- ];
1934
-
1935
- if (firstFaceIndices == undefined) return;
1936
- // normal vector of the line
1937
- const normalAttribute = line.geometry.attributes.normal;
1938
- let normal = new Three.Vector3()
1939
- .fromBufferAttribute(normalAttribute, 0)
1940
- .clone();
1941
- normal = normal
1942
- .applyMatrix4(line.matrixWorld)
1943
- .sub(new Three.Vector3(0, 0, 0).applyMatrix4(line.matrixWorld))
1944
- .normalize();
1945
- let vertices = layer.lines.get(data.line).vertices.toJS();
1946
- let vertex1 = layer.vertices.get(vertices[0]);
1947
- let vertex2 = layer.vertices.get(vertices[1]);
1948
- let cX = (vertex1.x + vertex2.x) / 2;
1949
- let cY = (vertex1.y + vertex2.y) / 2;
1950
- let posVec = new Three.Vector3(cX, 150, -cY);
1951
- posVec = posVec.add(planData.plan.position.clone());
1952
- let cameraLine = camera.position.clone().sub(posVec);
1953
- if (hole) {
1954
- hole.traverse(child => {
1955
- if (child.isMesh) {
1956
- child.material.opacity = cameraLine.dot(normal) > 0 ? 1 : 0;
1957
- child.material.transparent =
1958
- cameraLine.dot(normal) > 0 ? false : true;
1959
- child.material.needsUpdate = true;
1960
- }
1961
- });
1962
- }
1963
- }
1964
- // /////////////////////////////////////
1965
- });
1966
-
1967
- self.renderer.render(scene3D, camera);
1968
- self.renderingID = requestAnimationFrame(render);
1969
-
1970
- if (self.state.waitForRender > 0) {
1971
- self.state.waitForRender++;
1972
- if (self.state.waitForRender > 2) {
1973
- self.setState({ isLoading: false, waitForRender: 0 });
1974
- setTimeout(() => self.props.setIsLoading3D(false), 100);
1975
- console.log('257 line: false');
1976
- self.renderer.domElement.style.display = 'block';
1977
- }
1978
- }
1979
- }
1980
-
1981
- //
1982
-
1983
- window.planData = planData;
1984
- this.planData = planData;
1985
- this.camera = camera;
1986
- this.cameraControls = cameraControls;
1987
- this.scene3D = scene3D;
1988
-
1989
- //
1990
-
1991
- prepareSnap(layer);
1992
- }
1993
-
1994
- componentWillUnmount() {
1995
- cancelAnimationFrame(this.renderingID);
1996
-
1997
- if (!ARRAY_ELEVATION_VIEW_MODES.includes(this.props.state.mode)) {
1998
- if (this.cameraControls !== undefined) this.cameraControls.dispose();
1999
- }
2000
-
2001
- disposeScene(this.scene3D);
2002
- this.scene3D.remove(this.planData.plan);
2003
- this.scene3D.remove(this.planData.grid);
2004
-
2005
- this.scene3D = null;
2006
- this.planData = null;
2007
- this.camera = null;
2008
- this.cameraControls = null;
2009
- this.renderer.renderLists.dispose();
2010
- }
2011
-
2012
- componentWillReceiveProps(nextProps) {
2013
- let { width, height } = nextProps;
2014
- let actions = {
2015
- areaActions: this.context.areaActions,
2016
- holesActions: this.context.holesActions,
2017
- itemsActions: this.context.itemsActions,
2018
- sceneActions: this.context.sceneActions,
2019
- linesActions: this.context.linesActions,
2020
- projectActions: this.context.projectActions,
2021
- catalog: this.context.catalog
2022
- };
2023
-
2024
- this.width = width;
2025
- this.height = height;
2026
-
2027
- this.renderer.setSize(width, height);
2028
-
2029
- let allLines;
2030
- let allLineRects;
2031
- let allItemRect;
2032
-
2033
- this.camera.aspect = width / height;
2034
- this.camera.updateProjectionMatrix();
2035
-
2036
- let data = nextProps.state.scene;
2037
- let layer = data.getIn(['layers', data.selectedLayer]);
2038
- const self = this;
2039
-
2040
- function implementBacksplash() {
2041
- let allItems = GeometryUtils.getAllItemSpecified(
2042
- nextProps.state.scene,
2043
- actions.catalog,
2044
- BASE_CABINET_LAYOUTPOS
2045
- );
2046
- let i,
2047
- items = [];
2048
- for (i = 0; i < allItems.others.length; i++)
2049
- items.push(allItems.others[i]);
2050
- if (allItems.cur) items.push(allItems.cur);
2051
-
2052
- for (i = 0; i < items.length; i++) {
2053
- let calcRect = GeometryUtils.getCalcRectFromItem3D(items[i]);
2054
- let visible = GeometryUtils.isSnappedLine(calcRect, allLineRects);
2055
- actions.itemsActions.setBacksplashVisible(
2056
- items[i].itemInfo.id,
2057
- visible
2058
- );
2059
-
2060
- createBacksplash(
2061
- items[i],
2062
- nextProps.state.scene.getIn([
2063
- 'layers',
2064
- nextProps.state.scene.selectedLayer
2065
- ]),
2066
- planData,
2067
- nextProps.state.scene
2068
- );
2069
- }
2070
- }
2071
-
2072
- function implementWarningBox() {
2073
- let holeItems = GeometryUtils.getHoleItems(layer);
2074
- let i,
2075
- items = [];
2076
- for (i = 0; i < allItemRect.others.length; i++)
2077
- items.push(allItemRect.others[i]);
2078
- if (allItemRect.cur) items.push(allItemRect.cur);
2079
-
2080
- for (i = 0; i < items.length; i++)
2081
- checkCabinetOverlap(
2082
- { x: items[i].pos.x, y: items[i].pos.y },
2083
- items[i],
2084
- holeItems,
2085
- planData
2086
- );
2087
- }
2088
-
2089
- let prepareSnapSpec = layer => {
2090
- allLines = GeometryUtils.getAllLines(layer);
2091
- allLineRects = GeometryUtils.buildRectFromLines(layer, allLines);
2092
- allItemRect = GeometryUtils.getAllItemSpecified(
2093
- this.props.state.scene,
2094
- actions.catalog,
2095
- [WALL_CABINET_LAYOUTPOS, TALL_CABINET_LAYOUTPOS]
2096
- );
2097
- };
2098
-
2099
- let layer1 = this.props.state.scene.getIn(['layers', data.selectedLayer]);
2100
-
2101
- if (this.state.showflag) {
2102
- prepareSnapSpec(layer);
2103
- implementBacksplash();
2104
- implementWarningBox();
2105
- this.setState({ showflag: false });
2106
- }
2107
- if (
2108
- nextProps.state.scene !== this.props.state.scene ||
2109
- (nextProps.state.doorStyle &&
2110
- nextProps.state.doorStyle.get('name') !==
2111
- this.props.state.doorStyle.get('name'))
2112
- ) {
2113
- let changedValues = diff(this.props.state.scene, nextProps.state.scene);
2114
- prepareSnapSpec(layer);
2115
- if (
2116
- nextProps.state.doorStyle &&
2117
- nextProps.state.doorStyle.get('name') ===
2118
- this.props.state.doorStyle.get('name')
2119
- ) {
2120
- self.setState({ isLoading: true, waitForRender: 0 });
2121
- this.props.setIsLoading3D(true);
2122
- self.renderer.domElement.style.display = 'none';
2123
- }
2124
- if (nextProps.state.scene.showfg == true) {
2125
- implementBacksplash();
2126
- implementWarningBox();
2127
- } else {
2128
- deleteSpecifiedMeshObjects('TransformBox');
2129
- }
2130
- let { toolObj, angleObj } = this.state;
2131
- var { promise } = updateScene(
2132
- this.planData,
2133
- nextProps.state.scene,
2134
- this.props.state.scene,
2135
- changedValues.toJS(),
2136
- actions,
2137
- this.context.catalog,
2138
- nextProps.state.mode,
2139
- toolObj,
2140
- angleObj
2141
- );
2142
- promise.then(p1Value => {
2143
- self.setState({ waitForRender: 1 });
2144
- });
2145
- }
2146
- }
2147
-
2148
- render() {
2149
- const { isLoading } = this.state;
2150
- if (isLoading) {
2151
- // document.getElementById('elevation') && (document.getElementById('elevation').style.display = 'none');
2152
- this.renderer.domElement.style.display = 'none';
2153
- return (
2154
- <div
2155
- style={{
2156
- alignItems: ' center',
2157
- width: this.props.width,
2158
- height: this.props.height,
2159
- display: 'inline-flex',
2160
- justifyContent: 'center'
2161
- }}
2162
- >
2163
- <img
2164
- style={{
2165
- width: '70px',
2166
- height: '70px',
2167
- animation: 'spin 2s linear infinite'
2168
- }}
2169
- src={'/assets/img/loading_large.gif'}
2170
- alt="img"
2171
- />
2172
- </div>
2173
- );
2174
- } else {
2175
- this.renderer.domElement.style.pointerEvents = 'auto';
2176
- this.renderer.domElement.style.opacity = '1';
2177
- // document.getElementById('elevation') && (document.getElementById('elevation').style.display = 'block');
2178
- return React.createElement('div', { ref: 'canvasWrapper' });
2179
- }
2180
- }
2181
- }
2182
-
2183
- Viewer3DElevationDownload.propTypes = {
2184
- state: PropTypes.object.isRequired,
2185
- width: PropTypes.number.isRequired,
2186
- height: PropTypes.number.isRequired,
2187
- replaceCabinet: PropTypes.func.isRequired
2188
- };
2189
-
2190
- Viewer3DElevationDownload.contextTypes = {
2191
- areaActions: PropTypes.object.isRequired,
2192
- holesActions: PropTypes.object.isRequired,
2193
- itemsActions: PropTypes.object.isRequired,
2194
- linesActions: PropTypes.object.isRequired,
2195
- sceneActions: PropTypes.object.isRequired,
2196
- projectActions: PropTypes.object.isRequired,
2197
- catalog: PropTypes.object
2198
- };