kitchen-simulator 4.0.2-react-18 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/README.md +3 -0
  2. package/es/AppContext.js +1 -1
  3. package/es/LiteKitchenConfigurator.js +165 -107
  4. package/es/LiteRenderer.js +161 -129
  5. package/es/actions/export.js +25 -12
  6. package/es/assets/gltf/door_sliding.bin +0 -0
  7. package/es/assets/img/png/helper/video_preview_start.png +0 -0
  8. package/es/assets/img/svg/bottombar/elevation.svg +12 -5
  9. package/es/catalog/catalog.js +21 -5
  10. package/es/catalog/holes/window-clear/planner-element.js +2 -2
  11. package/es/catalog/properties/export.js +21 -0
  12. package/es/catalog/properties/property-checkbox.js +68 -0
  13. package/es/catalog/properties/property-color.js +39 -0
  14. package/es/catalog/properties/property-enum.js +50 -0
  15. package/es/catalog/properties/property-hidden.js +19 -0
  16. package/es/catalog/properties/property-lenght-measure.js +100 -0
  17. package/es/catalog/properties/property-length-measure.js +84 -0
  18. package/es/catalog/properties/property-length-measure_hole.js +100 -0
  19. package/es/catalog/properties/property-number.js +48 -0
  20. package/es/catalog/properties/property-read-only.js +26 -0
  21. package/es/catalog/properties/property-string.js +48 -0
  22. package/es/catalog/properties/property-toggle.js +39 -0
  23. package/es/catalog/properties/shared-property-style.js +14 -0
  24. package/es/catalog/utils/exporter.js +1 -0
  25. package/es/catalog/utils/item-loader.js +18 -12
  26. package/es/class/hole.js +0 -2
  27. package/es/class/item.js +95 -69
  28. package/es/class/line.js +4 -8
  29. package/es/class/project.js +93 -80
  30. package/es/components/content.js +5 -93
  31. package/es/components/export.js +4 -6
  32. package/es/components/style/button.js +106 -0
  33. package/es/components/style/cancel-button.js +21 -0
  34. package/es/components/style/content-container.js +30 -0
  35. package/es/components/style/content-title.js +25 -0
  36. package/es/components/style/delete-button.js +24 -0
  37. package/es/components/style/export.js +28 -2
  38. package/es/components/style/form-block.js +20 -0
  39. package/es/components/style/form-color-input.js +26 -0
  40. package/es/components/style/form-label.js +22 -0
  41. package/es/components/style/form-number-input.js +11 -22
  42. package/es/components/style/form-number-input_2.js +200 -0
  43. package/es/components/style/form-select.js +19 -0
  44. package/es/components/style/form-slider.js +60 -0
  45. package/es/components/style/form-submit-button.js +25 -0
  46. package/es/components/style/form-text-input.js +69 -0
  47. package/es/components/viewer2d/group.js +5 -4
  48. package/es/components/viewer2d/item.js +155 -359
  49. package/es/components/viewer2d/layer.js +1 -1
  50. package/es/components/viewer2d/line.js +17 -47
  51. package/es/components/viewer2d/ruler.js +5 -3
  52. package/es/components/viewer2d/rulerDist.js +8 -7
  53. package/es/components/viewer2d/rulerX.js +4 -2
  54. package/es/components/viewer2d/rulerY.js +3 -0
  55. package/es/components/viewer2d/scene.js +4 -1
  56. package/es/components/viewer2d/state.js +1 -1
  57. package/es/components/viewer2d/utils.js +2 -2
  58. package/es/components/viewer2d/viewer2d.js +51 -84
  59. package/es/components/viewer3d/ruler-utils/scene3D.js +1 -1
  60. package/es/components/viewer3d/scene-creator.js +51 -15
  61. package/es/components/viewer3d/viewer3d-first-person.js +8 -0
  62. package/es/components/viewer3d/viewer3d.js +80 -88
  63. package/es/constants.js +6 -2
  64. package/es/devLiteRenderer.js +491 -150
  65. package/es/index.js +567 -25
  66. package/es/models.js +2 -1
  67. package/es/plugins/SVGLoader.js +1414 -0
  68. package/es/plugins/console-debugger.js +34 -0
  69. package/es/plugins/export.js +7 -0
  70. package/es/plugins/keyboard.js +110 -0
  71. package/es/reducers/project-reducer.js +3 -0
  72. package/es/styles/export.js +5 -0
  73. package/es/styles/tabs.css +40 -0
  74. package/es/utils/geometry.js +64 -106
  75. package/es/utils/helper.js +38 -1
  76. package/es/utils/isolate-event-handler.js +824 -605
  77. package/es/utils/molding.js +457 -11
  78. package/lib/AppContext.js +1 -1
  79. package/lib/LiteKitchenConfigurator.js +164 -107
  80. package/lib/LiteRenderer.js +160 -129
  81. package/lib/actions/export.js +35 -39
  82. package/lib/assets/gltf/door_sliding.bin +0 -0
  83. package/lib/assets/img/png/helper/video_preview_start.png +0 -0
  84. package/lib/assets/img/svg/bottombar/elevation.svg +12 -5
  85. package/lib/catalog/catalog.js +20 -4
  86. package/lib/catalog/holes/window-clear/planner-element.js +2 -2
  87. package/lib/catalog/properties/export.js +81 -0
  88. package/lib/catalog/properties/property-checkbox.js +76 -0
  89. package/lib/catalog/properties/property-color.js +47 -0
  90. package/lib/catalog/properties/property-enum.js +58 -0
  91. package/lib/catalog/properties/property-hidden.js +27 -0
  92. package/lib/catalog/properties/property-lenght-measure.js +108 -0
  93. package/lib/catalog/properties/property-length-measure.js +92 -0
  94. package/lib/catalog/properties/property-length-measure_hole.js +108 -0
  95. package/lib/catalog/properties/property-number.js +56 -0
  96. package/lib/catalog/properties/property-read-only.js +34 -0
  97. package/lib/catalog/properties/property-string.js +56 -0
  98. package/lib/catalog/properties/property-toggle.js +47 -0
  99. package/lib/catalog/properties/shared-property-style.js +21 -0
  100. package/lib/catalog/utils/exporter.js +1 -0
  101. package/lib/catalog/utils/item-loader.js +18 -12
  102. package/lib/class/hole.js +0 -2
  103. package/lib/class/item.js +93 -67
  104. package/lib/class/line.js +3 -7
  105. package/lib/class/project.js +93 -80
  106. package/lib/components/content.js +5 -93
  107. package/lib/components/export.js +6 -26
  108. package/lib/components/style/button.js +115 -0
  109. package/lib/components/style/cancel-button.js +29 -0
  110. package/lib/components/style/content-container.js +38 -0
  111. package/lib/components/style/content-title.js +35 -0
  112. package/lib/components/style/delete-button.js +34 -0
  113. package/lib/components/style/export.js +105 -1
  114. package/lib/components/style/form-block.js +28 -0
  115. package/lib/components/style/form-color-input.js +34 -0
  116. package/lib/components/style/form-label.js +30 -0
  117. package/lib/components/style/form-number-input.js +11 -22
  118. package/lib/components/style/form-number-input_2.js +209 -0
  119. package/lib/components/style/form-select.js +29 -0
  120. package/lib/components/style/form-slider.js +68 -0
  121. package/lib/components/style/form-submit-button.js +35 -0
  122. package/lib/components/style/form-text-input.js +78 -0
  123. package/lib/components/viewer2d/group.js +5 -4
  124. package/lib/components/viewer2d/item.js +152 -356
  125. package/lib/components/viewer2d/layer.js +1 -1
  126. package/lib/components/viewer2d/line.js +17 -47
  127. package/lib/components/viewer2d/ruler.js +4 -2
  128. package/lib/components/viewer2d/rulerDist.js +8 -7
  129. package/lib/components/viewer2d/rulerX.js +4 -2
  130. package/lib/components/viewer2d/rulerY.js +3 -0
  131. package/lib/components/viewer2d/scene.js +4 -1
  132. package/lib/components/viewer2d/state.js +1 -1
  133. package/lib/components/viewer2d/utils.js +2 -2
  134. package/lib/components/viewer2d/viewer2d.js +49 -81
  135. package/lib/components/viewer3d/ruler-utils/scene3D.js +1 -1
  136. package/lib/components/viewer3d/scene-creator.js +49 -13
  137. package/lib/components/viewer3d/viewer3d-first-person.js +8 -0
  138. package/lib/components/viewer3d/viewer3d.js +77 -84
  139. package/lib/constants.js +11 -7
  140. package/lib/devLiteRenderer.js +489 -148
  141. package/lib/index.js +567 -25
  142. package/lib/models.js +2 -1
  143. package/lib/plugins/SVGLoader.js +1419 -0
  144. package/lib/plugins/console-debugger.js +42 -0
  145. package/lib/plugins/export.js +25 -0
  146. package/lib/plugins/keyboard.js +117 -0
  147. package/lib/reducers/project-reducer.js +3 -0
  148. package/lib/styles/export.js +13 -0
  149. package/lib/styles/tabs.css +40 -0
  150. package/lib/utils/geometry.js +64 -106
  151. package/lib/utils/helper.js +40 -1
  152. package/lib/utils/isolate-event-handler.js +824 -604
  153. package/lib/utils/molding.js +458 -9
  154. package/package.json +21 -16
  155. package/es/mocks/appliancePayload.json +0 -27
  156. package/es/mocks/cabinetPayload.json +0 -1914
  157. package/es/mocks/cabinetPayload2.json +0 -76
  158. package/es/mocks/dataBundle2.json +0 -4
  159. package/es/mocks/distancePayload.json +0 -6
  160. package/es/mocks/doorStylePayload2.json +0 -84
  161. package/es/mocks/furnishingPayload.json +0 -23
  162. package/es/mocks/itemCDSPayload.json +0 -27
  163. package/es/mocks/lightingPayload.json +0 -23
  164. package/es/mocks/mockProps.json +0 -43
  165. package/es/mocks/mockProps2.json +0 -9
  166. package/es/mocks/moldingPayload.json +0 -19
  167. package/es/mocks/projectItemsCatalog.json +0 -133
  168. package/es/mocks/rectangleShape.json +0 -238
  169. package/es/mocks/replaceCabinetPayload.json +0 -81
  170. package/es/mocks/roomShapePayload.json +0 -5
  171. package/es/useAppContext.js +0 -8
  172. package/lib/mocks/appliancePayload.json +0 -27
  173. package/lib/mocks/cabinetPayload.json +0 -1914
  174. package/lib/mocks/cabinetPayload2.json +0 -76
  175. package/lib/mocks/dataBundle2.json +0 -4
  176. package/lib/mocks/distancePayload.json +0 -6
  177. package/lib/mocks/doorStylePayload2.json +0 -84
  178. package/lib/mocks/furnishingPayload.json +0 -23
  179. package/lib/mocks/itemCDSPayload.json +0 -27
  180. package/lib/mocks/lightingPayload.json +0 -23
  181. package/lib/mocks/mockProps.json +0 -43
  182. package/lib/mocks/mockProps2.json +0 -9
  183. package/lib/mocks/moldingPayload.json +0 -19
  184. package/lib/mocks/projectItemsCatalog.json +0 -133
  185. package/lib/mocks/rectangleShape.json +0 -238
  186. package/lib/mocks/replaceCabinetPayload.json +0 -81
  187. package/lib/mocks/roomShapePayload.json +0 -5
  188. package/lib/useAppContext.js +0 -16
@@ -9,14 +9,14 @@ import * as Three from 'three';
9
9
  import { Color, Group } from 'three';
10
10
  import createGrid from "./grid-creator";
11
11
  import { disposeObject } from "./three-memory-cleaner";
12
- import { ANIMATE_STEP_MAX, ANIMATE_STEP_MIN, ARRAY_3D_MODES, ARROW_TEXT_BACKCOLOR, ARROW_TEXT_FONTFACE, ARROW_TEXT_FORECOLOR, BASE_CABINET_LAYOUTPOS, BOTTOM_MOLDING_LOCATION, DECIMAL_PLACES_2, DIFFERENT_VALUES_PATH_LENGTH, DISTANCE_EPSILON, EPSILON, MIDDLE_MOLDING_LOCATION, MODE_DRAGGING_ITEM_3D, MODE_DRAWING_ITEM_3D, MODE_IDLE, MODE_IDLE_3D, MODE_ROTATING_ITEM_3D, OBJTYPE_MESH, SHADE_DARK_PURPLE_COLOR, TOP_MOLDING_LOCATION, UNIT_CENTIMETER, WALL_CABINET_LAYOUTPOS } from "../../constants";
12
+ import { ANIMATE_STEP_MAX, ANIMATE_STEP_MIN, ARRAY_3D_MODES, ARROW_TEXT_BACKCOLOR, ARROW_TEXT_FONTFACE, ARROW_TEXT_FORECOLOR, BASE_CABINET_LAYOUTPOS, BOTTOM_MOLDING_LOCATION, DECIMAL_PLACES_2, DIFFERENT_VALUES_PATH_LENGTH, DISTANCE_EPSILON, EPSILON, MIDDLE_MOLDING_LOCATION, MODE_DRAGGING_ITEM_3D, MODE_DRAWING_ITEM_3D, MODE_IDLE, MODE_IDLE_3D, MODE_ROTATING_ITEM_3D, OBJTYPE_MESH, SHADE_DARK_PURPLE_COLOR, TOP_MOLDING_LOCATION, UNIT_CENTIMETER, UNIT_FOOT, UNIT_INCH, UNIT_METER, WALL_CABINET_LAYOUTPOS } from "../../constants";
13
13
  import { GeometryUtils, IDBroker, MoldingUtils } from "../../utils/export";
14
14
  import { convert } from "../../utils/convert-units-lite";
15
15
  import { verticesDistance } from "../../utils/geometry";
16
16
  import * as GeomUtils from "../../catalog/utils/geom-utils";
17
17
  import { loadTexture } from "../../catalog/utils/item-loader";
18
18
  import { returnReplaceableDeepSearchType } from "../viewer2d/utils";
19
- import { animateDoor, isElevationView, isEmpty, replaceMeshesWithLineSegments, translateDrawer } from "../../utils/helper";
19
+ import { animateDoor, isElevationView, isEmpty, isImmutable, replaceMeshesWithLineSegments, translateDrawer } from "../../utils/helper";
20
20
  import { formatNumber } from "../../utils/math";
21
21
  var transformBox;
22
22
  export var fVLine = [];
@@ -187,6 +187,31 @@ export function createWarningObject() {
187
187
  warningObj.name = 'warningObj';
188
188
  return warningObj;
189
189
  }
190
+ function swapLengthProperty(diffs) {
191
+ var idx1 = diffs.findIndex(function (v) {
192
+ return v.path[v.path.length - 1] === 'length';
193
+ });
194
+ var idx2 = diffs.findIndex(function (v) {
195
+ return v.path[v.path.length - 1] === '_length';
196
+ });
197
+ if (idx1 < 0 || idx2 < 0) return diffs;
198
+ if (idx1 > idx2) return diffs;
199
+ if (diffs[idx1].op === diffs[idx2].op) {
200
+ var isSwap = true;
201
+ for (var i = 0; i < diffs[idx1].path.length - 2; i++) {
202
+ if (diffs[idx1].path[i] !== diffs[idx2].path[i]) {
203
+ isSwap = false;
204
+ break;
205
+ }
206
+ }
207
+ if (isSwap) {
208
+ var temp = diffs[idx1];
209
+ diffs[idx1] = diffs[idx2];
210
+ diffs[idx2] = temp;
211
+ }
212
+ }
213
+ return diffs;
214
+ }
190
215
  export function updateScene(planData, sceneData, oldSceneData, diffArray, actions, catalog) {
191
216
  var _draggingItem$toJS, _filteredDiffs, _filteredDiffs2;
192
217
  var mode = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
@@ -204,6 +229,9 @@ export function updateScene(planData, sceneData, oldSceneData, diffArray, action
204
229
  value: el.value
205
230
  };
206
231
  });
232
+
233
+ // move "length" to after "_length"
234
+ splitted = swapLengthProperty(splitted);
207
235
  var filteredDiffs = filterDiffs(splitted, sceneData, oldSceneData);
208
236
  //***testing additional filter***
209
237
  filteredDiffs = filteredDiffs.filter(function (_ref) {
@@ -238,7 +266,7 @@ export function updateScene(planData, sceneData, oldSceneData, diffArray, action
238
266
  * Every 'doorStyle' change has a 'door_style_id' change.
239
267
  * So, if door_style_id changes, it indicates 'doorStyle' change.
240
268
  */
241
- if (['id'].includes(path[path.length - 1])) isSettingDoorStyle = true;
269
+ if (path[1] === 'layers' && path[3] === 'molding' || path[path.length - 2] === 'doorStyle' && path[path.length - 1] === 'id' || ['id'].includes(path[path.length - 1])) isSettingDoorStyle = true;
242
270
 
243
271
  // If there are any molding change of layer
244
272
  if (path[1] === 'layers' && path[3] === 'molding') isUpdateMolding = true;
@@ -614,10 +642,10 @@ function replaceObject(modifiedPath, layer, planData, actions, sceneData, oldSce
614
642
  vLine3.material.depthTest = false;
615
643
  var uVec = new Three.Vector3(-posVec.x / scalevec.x, -posVec.y / scalevec.y, -posVec.z / scalevec.z);
616
644
  var blLighting = item.type.includes('Light');
617
- vLine.translateY(blLighting ? 1.6 : 0.1);
618
- vLine1.translateY(blLighting ? 1.6 : 0.1);
619
- vLine2.translateY(blLighting ? 1.6 : 0.1);
620
- vLine3.translateY(blLighting ? 1.6 : 0.1);
645
+ vLine.translateY(blLighting ? 1.6 : boundingBox.min.y + 0.1);
646
+ vLine1.translateY(blLighting ? 1.6 : boundingBox.min.y + 0.1);
647
+ vLine2.translateY(blLighting ? 1.6 : boundingBox.min.y + 0.1);
648
+ vLine3.translateY(blLighting ? 1.6 : boundingBox.min.y + 0.1);
621
649
  upObj.translateOnAxis(uVec, 1);
622
650
  upObj.translateY(max.y - min.y);
623
651
  _mBox.name = 'TransformBox';
@@ -923,9 +951,9 @@ function getLineDistance(obj, layer, isCalcWall, index) {
923
951
  obj.geometry.attributes.position.needsUpdate = true;
924
952
  obj.geometry.computeBoundingSphere();
925
953
  obj.geometry.computeBoundingBox();
926
- var dist = formatNumber(convert(intersects[i].distance).from('cm').to('in'), DECIMAL_PLACES_2);
954
+ var dist = convert(intersects[i].distance).from('cm').to('in');
927
955
  if (dist > 3) {
928
- var _canvas = getTextCanvas(dist);
956
+ var _canvas = getDistanceCanvas(dist, layer);
929
957
  var wid = _canvas.width / window.innerWidth * 30;
930
958
  var hei = _canvas.height / window.innerHeight * 30;
931
959
  var texture = new Three.Texture(_canvas);
@@ -1047,7 +1075,7 @@ function getLineDistance(obj, layer, isCalcWall, index) {
1047
1075
  obj.geometry.attributes.position.needsUpdate = true;
1048
1076
  var _dist = formatNumber(distance, DECIMAL_PLACES_2);
1049
1077
  if (_dist > 3) {
1050
- var _canvas2 = getTextCanvas(_dist);
1078
+ var _canvas2 = getDistanceCanvas(_dist, layer);
1051
1079
  var _wid = _canvas2.width / window.innerWidth * 30;
1052
1080
  var _hei = _canvas2.height / window.innerHeight * 30;
1053
1081
  var _texture = new Three.Texture(_canvas2);
@@ -1175,12 +1203,18 @@ export function getIntersectPoint(opX, opY, pX, pY) {
1175
1203
  function gcd(a, b) {
1176
1204
  return a % b ? gcd(b, a % b) : b;
1177
1205
  }
1178
- function getTextCanvas(text) {
1179
- var parameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1206
+ function getDistanceCanvas(distance, layer) {
1207
+ var _layer$unit;
1208
+ var parameters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
1180
1209
  var canvas = document.createElement('canvas');
1181
1210
  var ctx = canvas.getContext('2d');
1211
+ var curUnit = (_layer$unit = layer === null || layer === void 0 ? void 0 : layer.unit) !== null && _layer$unit !== void 0 ? _layer$unit : UNIT_INCH;
1212
+ var fixedLength = (layer === null || layer === void 0 ? void 0 : layer.unit) === UNIT_METER || (layer === null || layer === void 0 ? void 0 : layer.unit) === UNIT_FOOT ? 2 : 0;
1213
+ var distText = String((Math.round(convert(distance).from('in').to(curUnit) * 100) / 100).toFixed(fixedLength));
1182
1214
  var fontSize = 16;
1183
- var integral = String(text) + "''";
1215
+ var integral = distText + curUnit;
1216
+ // let integral = String(distance) + "''";
1217
+
1184
1218
  parameters.fontName = parameters.fontName || ARROW_TEXT_FONTFACE;
1185
1219
 
1186
1220
  // Prepare the font to be able to measure
@@ -3418,9 +3452,11 @@ export function updateMoldingGroupArray(MGArray, selItem, planData, layer) {
3418
3452
  // refresh mesh of the updating molding groups
3419
3453
  new_MGArray.forEach(function (mg, index) {
3420
3454
  if (mg.items[0].molding.some(function (mol) {
3421
- return mol.location_type === mg.location_type;
3455
+ return isImmutable(mol) ? mol.toJS().location_type === mg.location_type : mol.location_type === mg.location_type;
3422
3456
  })) {
3423
- var molding = mg.items[0].molding.filter(function (mol) {
3457
+ var molding = isImmutable(mg.items[0].molding) ? mg.items[0].molding.filter(function (mol) {
3458
+ return mol.toJS().location_type === mg.location_type;
3459
+ }).toJS()[0] : mg.items[0].molding.filter(function (mol) {
3424
3460
  return mol.location_type === mg.location_type;
3425
3461
  })[0];
3426
3462
  if (mg.molding === null || mg.molding.itemID !== mol.itemID || mg.lines === null || mg.points === null) {
@@ -298,4 +298,12 @@ Viewer3DFirstPerson.propTypes = {
298
298
  state: PropTypes.object.isRequired,
299
299
  width: PropTypes.number.isRequired,
300
300
  height: PropTypes.number.isRequired
301
+ };
302
+ Viewer3DFirstPerson.contextTypes = {
303
+ areaActions: PropTypes.object.isRequired,
304
+ holesActions: PropTypes.object.isRequired,
305
+ itemsActions: PropTypes.object.isRequired,
306
+ linesActions: PropTypes.object.isRequired,
307
+ projectActions: PropTypes.object.isRequired,
308
+ catalog: PropTypes.object
301
309
  };
@@ -19,17 +19,16 @@ import { checkCabinetOverlap, createBacksplash, deleteSpecifiedMeshObjects, fVLi
19
19
  import { disposeObject, disposeScene } from "./three-memory-cleaner";
20
20
  import diff from 'immutablediff';
21
21
  import * as SharedStyle from "../../shared-style";
22
- import { BASE_CABINET_LAYOUTPOS, MODE_3D_VIEW, MODE_DRAGGING_ITEM_3D, MODE_DRAWING_HOLE_3D, MODE_DRAWING_ITEM_3D, MODE_ELEVATION_VIEW, MODE_IDLE_3D, MODE_ROTATING_ITEM_3D, SECONDARY_PURPLE_COLOR, TALL_CABINET_LAYOUTPOS, UNIT_CENTIMETER, WALL_CABINET_LAYOUTPOS, INTERNAL_EVENT_SELECT_ELEMENT, INTERNAL_EVENT_DRAG_ELEMENT, INTERNAL_EVENT_DRAW_ELEMENT, INTERNAL_EVENT_ROTATE_ELEMENT, MODE_ROTATING_ITEM, MODE_DRAGGING_HOLE_3D } from "../../constants";
22
+ import { BASE_CABINET_LAYOUTPOS, MODE_3D_VIEW, MODE_DRAGGING_ITEM_3D, MODE_DRAWING_HOLE_3D, MODE_DRAWING_ITEM_3D, MODE_ELEVATION_VIEW, MODE_IDLE_3D, MODE_ROTATING_ITEM_3D, SECONDARY_PURPLE_COLOR, TALL_CABINET_LAYOUTPOS, UNIT_CENTIMETER, WALL_CABINET_LAYOUTPOS, INTERNAL_EVENT_SELECT_ELEMENT, INTERNAL_EVENT_DRAG_ELEMENT, INTERNAL_EVENT_DRAW_ELEMENT, INTERNAL_EVENT_ROTATE_ELEMENT, MODE_ROTATING_ITEM, MODE_DRAGGING_HOLE_3D, INTERNAL_EVENT_REPLACE_CABINET } from "../../constants";
23
23
  import { isUndefined } from 'util';
24
24
  import { verticesDistance } from "../../utils/geometry";
25
25
  import { convert } from "../../utils/convert-units-lite";
26
26
  import { GeometryUtils } from "../../utils/export";
27
- import { handleCamRect, isElevationView, isEmpty } from "../../utils/helper";
27
+ import { handleCamRect, isElevationView, isEmpty, updatePayloadOfInternalEvent } from "../../utils/helper";
28
28
  import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader';
29
29
  import CameraControls from 'camera-controls';
30
30
  import { getAllMeshes, vectorIntersectWithMesh } from "../../utils/objects-utils";
31
- import { isWarningItem, returnReplaceableDeepSearchType } from "../viewer2d/utils";
32
- import { MoldingUtils } from "../../utils/export";
31
+ import { returnReplaceableDeepSearchType } from "../viewer2d/utils";
33
32
  CameraControls.install({
34
33
  THREE: Three
35
34
  });
@@ -232,6 +231,7 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
232
231
  });
233
232
  self.renderer.domElement.style.display = 'block';
234
233
  }, 1500);
234
+ self.planData = planData;
235
235
  });
236
236
  var area = scene.getIn(['layers', scene.selectedLayer, 'areas']);
237
237
  var layer = scene.getIn(['layers', scene.selectedLayer]);
@@ -670,7 +670,7 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
670
670
  layer.lines.forEach(function (line) {
671
671
  line.holes.forEach(function (holeID) {
672
672
  var hole = layer.holes.get(holeID);
673
- holes.push(hole);
673
+ if (hole) holes.push(hole);
674
674
  });
675
675
  });
676
676
  var i = 0;
@@ -1186,18 +1186,10 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1186
1186
  };
1187
1187
  var sendInternalEvent = function sendInternalEvent(evtType, evtElement) {
1188
1188
  var pointArray = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
1189
- if (!isEmpty(evtType)) {
1190
- var _this2$props$onIntern, _this2$props;
1191
- var payload = evtElement === null || evtElement === void 0 ? void 0 : evtElement.toJS();
1192
- if ((evtElement === null || evtElement === void 0 ? void 0 : evtElement.prototype) === 'items') {
1193
- // check this cabinet has warning box
1194
- payload.isWarning = isWarningItem(evtElement);
1195
- // check this item is available molding
1196
- payload.isMoldingAvailable = MoldingUtils.isEnableItemForMolding(layer, evtElement); // check this item is snapped to wall
1197
- payload.isAttachedWall = MoldingUtils.isAttachedWall(layer, evtElement);
1198
- // update distArray
1199
- if (pointArray) payload.distArray = pointArray;
1200
- }
1189
+ if (!isEmpty(evtType) && !isEmpty(evtElement)) {
1190
+ var _state$get, _this2$props$onIntern, _this2$props;
1191
+ var catalog = (_state$get = state.get('catalog')) === null || _state$get === void 0 ? void 0 : _state$get.toJS();
1192
+ var payload = updatePayloadOfInternalEvent(evtElement, layer, catalog, pointArray);
1201
1193
  (_this2$props$onIntern = (_this2$props = _this2.props).onInternalEvent) === null || _this2$props$onIntern === void 0 || _this2$props$onIntern.call(_this2$props, {
1202
1194
  type: evtType,
1203
1195
  value: payload
@@ -1355,11 +1347,6 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1355
1347
  if (selectedFlag || toolIntersects.length > 0 && !isElevationView(mode)) {
1356
1348
  cameraControls.mouseButtons.left = CameraControls.ACTION.NONE;
1357
1349
  selectedFlag = false;
1358
- } else {
1359
- isSelected = false;
1360
- _this2.context.projectActions.unselectAll();
1361
- scene3D.remove(toolObj);
1362
- _this2.context.itemsActions.removeReplacingSupport();
1363
1350
  }
1364
1351
  }
1365
1352
  } else {
@@ -1412,11 +1399,18 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1412
1399
  }
1413
1400
  switch (_this2.props.state.mode) {
1414
1401
  case MODE_DRAGGING_ITEM_3D:
1402
+ case MODE_DRAGGING_HOLE_3D:
1415
1403
  internalType = INTERNAL_EVENT_DRAG_ELEMENT;
1416
1404
  break;
1417
1405
  case MODE_ROTATING_ITEM_3D:
1418
1406
  internalType = INTERNAL_EVENT_ROTATE_ELEMENT;
1419
1407
  break;
1408
+ case MODE_DRAWING_HOLE_3D:
1409
+ internalType = INTERNAL_EVENT_DRAW_ELEMENT;
1410
+ break;
1411
+ case MODE_IDLE_3D:
1412
+ internalType = INTERNAL_EVENT_SELECT_ELEMENT;
1413
+ break;
1420
1414
  }
1421
1415
  if (_this2.props.state.mode == MODE_DRAGGING_ITEM_3D) {
1422
1416
  _this2.context.itemsActions.endDraggingItem3D();
@@ -1450,7 +1444,8 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1450
1444
  });
1451
1445
  });
1452
1446
  var intersects = raycaster.intersectObjects(meshes, true);
1453
- var _i10;
1447
+ var _i10; // index of warning object in intersects
1448
+
1454
1449
  if (intersects.length > 0 && !isNaN(intersects[0].distance)) {
1455
1450
  for (_i10 = 0; _i10 < intersects.length; _i10++) {
1456
1451
  if (intersects[_i10].object.name === 'warningObj') break;
@@ -1466,6 +1461,9 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1466
1461
  var replaceInfo = intersects[_i10].object.parent.parent.userData;
1467
1462
  _this2.context.itemsActions.selectItem(replaceInfo.layerId, replaceInfo.itemId);
1468
1463
  !_this2.props.downloadFlag && _this2.props.replaceCabinet(true);
1464
+ internalType = INTERNAL_EVENT_REPLACE_CABINET;
1465
+ var replaceElement = _this2.props.state.scene.layers.get(replaceInfo.layerId).items.get(replaceInfo.itemId);
1466
+ sendInternalEvent(internalType, replaceElement);
1469
1467
  return;
1470
1468
  }
1471
1469
  }
@@ -1478,6 +1476,19 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1478
1476
  }
1479
1477
  }
1480
1478
  gridMatrix.copy(gridPlane.matrixWorld).invert();
1479
+ var addItemToolObj = function addItemToolObj() {
1480
+ var _planData$sceneGraph, _selectedObject, _intersects$_i;
1481
+ var selectedItem = (_planData$sceneGraph = planData.sceneGraph) === null || _planData$sceneGraph === void 0 || (_planData$sceneGraph = _planData$sceneGraph.layers[selectedObject.layerID]) === null || _planData$sceneGraph === void 0 ? void 0 : _planData$sceneGraph.items[(_selectedObject = selectedObject) === null || _selectedObject === void 0 ? void 0 : _selectedObject.itemID];
1482
+ if (isUndefined(selectedItem)) return;
1483
+ selectedElement = _this2.props.state.scene.layers.get(selectedObject.layerID).items.get(selectedObject.itemID);
1484
+ var itemPos = selectedItem.position.clone();
1485
+ if (((_intersects$_i = intersects[_i10]) === null || _intersects$_i === void 0 || (_intersects$_i = _intersects$_i.object) === null || _intersects$_i === void 0 || (_intersects$_i = _intersects$_i.parent) === null || _intersects$_i === void 0 || (_intersects$_i = _intersects$_i.parent) === null || _intersects$_i === void 0 || (_intersects$_i = _intersects$_i.userData) === null || _intersects$_i === void 0 ? void 0 : _intersects$_i.itemId) === selectedItem.userData.itemId) {
1486
+ toolObj.position.set(intersects[_i10].point.x, intersects[_i10].point.y, intersects[_i10].point.z);
1487
+ } else {
1488
+ toolObj.position.set(planData.plan.position.x + itemPos.x, selectedElement.category === 'lighting' ? -planData.plan.position.y - selectedElement.properties.get('height').get('length') : planData.plan.position.y + selectedItem.children[0].position.y, planData.plan.position.z + itemPos.z);
1489
+ }
1490
+ scene3D.add(toolObj);
1491
+ };
1481
1492
  if (Math.abs(mouse.x - _this2.lastMousePosition.x) <= 0.02 && Math.abs(mouse.y - _this2.lastMousePosition.y) <= 0.02 || bMove) {
1482
1493
  if (intersects.length > 0 && !isNaN(intersects[0].distance)) {
1483
1494
  if (intersects[_i10] === undefined) {
@@ -1501,36 +1512,17 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1501
1512
  isSelected = true;
1502
1513
  setTimeout(function () {
1503
1514
  getDistances(layer);
1504
- var selectedItem = planData.sceneGraph.layers[selectedObject.layerID].items[selectedObject.itemID];
1505
- if (isUndefined(selectedItem)) return;
1506
- selectedElement = _this2.props.state.scene.layers.get(selectedObject.layerID).items.get(selectedObject.itemID);
1507
- var itemPos = selectedItem.position.clone();
1508
- if (intersects[_i10].object.parent && intersects[_i10].object.parent.parent.userData.itemId === selectedItem.userData.itemId) {
1509
- toolObj.position.set(intersects[_i10].point.x, intersects[_i10].point.y, intersects[_i10].point.z);
1510
- } else {
1511
- toolObj.position.set(planData.plan.position.x + itemPos.x, selectedElement.category === 'lighting' ? -planData.plan.position.y - selectedElement.properties.get('height').get('length') : planData.plan.position.y + selectedItem.children[0].position.y, planData.plan.position.z + itemPos.z);
1512
- }
1513
- scene3D.add(toolObj);
1515
+ addItemToolObj();
1514
1516
  _this2.setState({
1515
1517
  toolObj: toolObj
1516
1518
  });
1517
1519
  // showItemButtons(layer.getIn(['items', selectedObject.itemID]), currentObject, event, camera, this.renderer);
1518
- var pointArray = [],
1519
- cnt = 0;
1520
- pointArray.push([fVLine[0].userData.distance, 90]);
1521
- pointArray.push([fVLine[1].userData.distance, -90]);
1522
- pointArray.push([fVLine[2].userData.distance, 180]);
1523
- pointArray.push([fVLine[3].userData.distance, 0]);
1524
- pointArray.forEach(function (pointElement, index) {
1525
- if (pointElement[0] == undefined) pointArray[index][0] = 0;
1526
- });
1527
- pointArray.forEach(function (pointElement) {
1528
- if (pointElement[0] == 0) cnt++;
1529
- });
1530
- if (cnt == 4 || cnt == 3) {
1531
- pointArray[0][0] = 100;
1532
- pointArray[1][0] = 100;
1533
- }
1520
+ var pointArray = [];
1521
+ // pointArray.push([fVLine[0].userData.distance, 90]);
1522
+ // pointArray.push([fVLine[1].userData.distance, -90]);
1523
+ // pointArray.push([fVLine[2].userData.distance, 180]);
1524
+ // pointArray.push([fVLine[3].userData.distance, 0]);
1525
+ pointArray = GeometryUtils.calcDistancesFromItemToWalls(selectedElement, layer).PointArray;
1534
1526
  actions.itemsActions.storeDistArray(layer.id, selectedObject.itemID, pointArray);
1535
1527
  internalType = internalType ? internalType : INTERNAL_EVENT_SELECT_ELEMENT;
1536
1528
  sendInternalEvent(internalType, selectedElement, pointArray);
@@ -1541,16 +1533,17 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1541
1533
  var elementPrototype = null;
1542
1534
  switch (true) {
1543
1535
  case 'holeID' in selectedObject:
1544
- case 'lineID' in selectedObject:
1536
+ elementID = selectedObject.holeID;
1537
+ elementPrototype = 'holes';
1545
1538
  if (_this2.props.state.mode === MODE_DRAGGING_HOLE_3D) {
1546
1539
  actions.holesActions.endDraggingHole3D(sPoint.x, sPoint.y);
1547
- internalType = INTERNAL_EVENT_SELECT_ELEMENT;
1548
- elementID = selectedObject.holeID;
1549
- elementPrototype = 'holes';
1550
1540
  }
1551
1541
  break;
1542
+ case 'lineID' in selectedObject:
1543
+ elementID = selectedObject.lineID;
1544
+ elementPrototype = 'lines';
1545
+ break;
1552
1546
  case 'areaID' in selectedObject:
1553
- internalType = INTERNAL_EVENT_SELECT_ELEMENT;
1554
1547
  elementID = selectedObject.areaID;
1555
1548
  elementPrototype = 'areas';
1556
1549
  break;
@@ -1562,15 +1555,20 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1562
1555
  isSelected = false;
1563
1556
  }
1564
1557
  } else {
1565
- isSelected = false;
1566
- _this2.context.projectActions.unselectAll();
1567
- switch (true) {
1568
- case 'holeID' in selectedObject:
1569
- actions.holesActions.endDraggingHole3D(sPoint.x, sPoint.y);
1570
- break;
1571
- default:
1572
- _this2.context.itemsActions.removeReplacingSupport();
1573
- break;
1558
+ var selectedItem = planData.sceneGraph.layers[selectedObject.layerID].items[selectedObject.itemID];
1559
+ if (bMove && !isEmpty(selectedItem)) {
1560
+ addItemToolObj();
1561
+ } else {
1562
+ isSelected = false;
1563
+ _this2.context.projectActions.unselectAll();
1564
+ switch (true) {
1565
+ case 'holeID' in selectedObject:
1566
+ actions.holesActions.endDraggingHole3D(sPoint.x, sPoint.y);
1567
+ break;
1568
+ default:
1569
+ _this2.context.itemsActions.removeReplacingSupport();
1570
+ break;
1571
+ }
1574
1572
  }
1575
1573
  }
1576
1574
  bMove = false;
@@ -1581,6 +1579,7 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1581
1579
  selectedObj = allItemRect.cur;
1582
1580
  }
1583
1581
  } else {
1582
+ var _planData$sceneGraph2, _selectedObject2, _selectedObject3;
1584
1583
  visibleTransformBox(false);
1585
1584
  var alti = 0;
1586
1585
  if (allItemRect && allItemRect.cur && allItemRect.cur.itemInfo !== undefined) {
@@ -1590,18 +1589,9 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1590
1589
  alti = convert(alti).from(_unit2).to(_this2.props.state.scene.unit);
1591
1590
  }
1592
1591
  getPoint(event, alti);
1592
+ var _selectedItem = planData === null || planData === void 0 || (_planData$sceneGraph2 = planData.sceneGraph) === null || _planData$sceneGraph2 === void 0 || (_planData$sceneGraph2 = _planData$sceneGraph2.layers[(_selectedObject2 = selectedObject) === null || _selectedObject2 === void 0 ? void 0 : _selectedObject2.layerID]) === null || _planData$sceneGraph2 === void 0 ? void 0 : _planData$sceneGraph2.items[(_selectedObject3 = selectedObject) === null || _selectedObject3 === void 0 ? void 0 : _selectedObject3.itemID];
1593
+ if (isSelected && !isEmpty(_selectedItem)) addItemToolObj();
1593
1594
  if (bRotate) {
1594
- var _intersects$_i;
1595
- var selectedItem = planData.sceneGraph.layers[selectedObject.layerID].items[selectedObject.itemID];
1596
- if (isUndefined(selectedItem)) return;
1597
- selectedElement = _this2.props.state.scene.layers.get(selectedObject.layerID).items.get(selectedObject.itemID);
1598
- var itemPos = selectedItem.position.clone();
1599
- if (((_intersects$_i = intersects[_i10]) === null || _intersects$_i === void 0 || (_intersects$_i = _intersects$_i.object) === null || _intersects$_i === void 0 || (_intersects$_i = _intersects$_i.parent) === null || _intersects$_i === void 0 || (_intersects$_i = _intersects$_i.parent) === null || _intersects$_i === void 0 || (_intersects$_i = _intersects$_i.userData) === null || _intersects$_i === void 0 ? void 0 : _intersects$_i.itemId) === selectedItem.userData.itemId) {
1600
- toolObj.position.set(intersects[_i10].point.x, intersects[_i10].point.y, intersects[_i10].point.z);
1601
- } else {
1602
- toolObj.position.set(planData.plan.position.x + itemPos.x, selectedElement.category === 'lighting' ? -planData.plan.position.y - selectedElement.properties.get('height').get('length') : planData.plan.position.y + selectedItem.children[0].position.y, planData.plan.position.z + itemPos.z);
1603
- }
1604
- scene3D.add(toolObj);
1605
1595
  _this2.setState({
1606
1596
  toolObj: toolObj
1607
1597
  });
@@ -1610,16 +1600,6 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
1610
1600
  }
1611
1601
  if (bMove) {
1612
1602
  bMove = false;
1613
- var _selectedItem = planData.sceneGraph.layers[selectedObject.layerID].items[selectedObject.itemID];
1614
- if (isUndefined(_selectedItem)) return;
1615
- selectedElement = _this2.props.state.scene.layers.get(selectedObject.layerID).items.get(selectedObject.itemID);
1616
- var _itemPos = _selectedItem.position.clone();
1617
- if (intersects[_i10].object.parent.parent.userData.itemId === _selectedItem.userData.itemId) {
1618
- toolObj.position.set(intersects[_i10].point.x, intersects[_i10].point.y, intersects[_i10].point.z);
1619
- } else {
1620
- toolObj.position.set(planData.plan.position.x + _itemPos.x, selectedElement.category === 'lighting' ? -planData.plan.position.y - selectedElement.properties.get('height').get('length') : planData.plan.position.y + _selectedItem.children[0].position.y, planData.plan.position.z + _itemPos.z);
1621
- }
1622
- scene3D.add(toolObj);
1623
1603
  _this2.setState({
1624
1604
  toolObj: toolObj
1625
1605
  });
@@ -2086,7 +2066,7 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
2086
2066
  if (minDis < snapDelta && !snapFlag) {
2087
2067
  _this2.snap(snapObj, layer);
2088
2068
  snapFlag = true;
2089
- getDistances(layer, true);
2069
+ getDistances(layer);
2090
2070
  var _i13 = 0;
2091
2071
  for (_i13 = 0; _i13 < fVLine.length; _i13++) {
2092
2072
  if (fVLine[_i13].userData.distance < snapDelta) {
@@ -2536,10 +2516,13 @@ var Scene3DViewer = /*#__PURE__*/function (_React$Component) {
2536
2516
  if (nextProps.state.scene !== this.props.state.scene || nextProps.state.doorStyle && nextProps.state.doorStyle.get('name') !== this.props.state.doorStyle.get('name')) {
2537
2517
  var changedValues = diff(this.props.state.scene, nextProps.state.scene);
2538
2518
  prepareSnapSpec(layer);
2519
+ var isInteractiveMove = nextProps.state.mode === MODE_DRAGGING_ITEM_3D || nextProps.state.mode === MODE_ROTATING_ITEM_3D || nextProps.state.mode === MODE_DRAWING_ITEM_3D || nextProps.state.mode === MODE_DRAGGING_HOLE_3D || nextProps.state.mode === MODE_IDLE_3D;
2539
2520
  if (nextProps.state.doorStyle && nextProps.state.doorStyle.get('name') === this.props.state.doorStyle.get('name')) {
2540
- self.setState({
2541
- isLoading: true
2542
- });
2521
+ if (!isInteractiveMove) {
2522
+ self.setState({
2523
+ isLoading: true
2524
+ });
2525
+ }
2543
2526
  if (self.props.downloadFlag) {
2544
2527
  self.setState({
2545
2528
  waitForRender: 0
@@ -2665,4 +2648,13 @@ Scene3DViewer.propTypes = {
2665
2648
  width: PropTypes.number.isRequired,
2666
2649
  height: PropTypes.number.isRequired,
2667
2650
  replaceCabinet: PropTypes.func.isRequired
2651
+ };
2652
+ Scene3DViewer.contextTypes = {
2653
+ areaActions: PropTypes.object.isRequired,
2654
+ holesActions: PropTypes.object.isRequired,
2655
+ itemsActions: PropTypes.object.isRequired,
2656
+ linesActions: PropTypes.object.isRequired,
2657
+ sceneActions: PropTypes.object.isRequired,
2658
+ projectActions: PropTypes.object.isRequired,
2659
+ catalog: PropTypes.object
2668
2660
  };
package/es/constants.js CHANGED
@@ -66,6 +66,7 @@ export var CHANGE_WALL_LENGTH_MEASURE = 'CHANGE_WALL_LENGTH_MEASURE';
66
66
  export var CHANGE_BASE_CABINET_MEASURE = 'CHANGE_BASE_CABINET_MEASURE';
67
67
  export var CHANGE_WALL_CABINET_MEASURE = 'CHANGE_WALL_CABINET_MEASURE';
68
68
  export var CHANGE_WINDOW_DOOR_MEASURE = 'CHANGE_WINDOW_DOOR_MEASURE';
69
+ export var CHANGE_MEASUREMENT_UNIT = 'CHANGE_MEASUREMENT_UNIT';
69
70
 
70
71
  //ACTIONS viewer3D
71
72
  export var SELECT_TOOL_3D_VIEW = 'SELECT_TOOL_3D_VIEW';
@@ -650,10 +651,11 @@ export var PROJECT_SETTING_OPTION = {
650
651
  CHANGE_WALL_LENGTH_MEASURE: CHANGE_WALL_LENGTH_MEASURE,
651
652
  CHANGE_BASE_CABINET_MEASURE: CHANGE_BASE_CABINET_MEASURE,
652
653
  CHANGE_WALL_CABINET_MEASURE: CHANGE_WALL_CABINET_MEASURE,
653
- CHANGE_WINDOW_DOOR_MEASURE: CHANGE_WINDOW_DOOR_MEASURE
654
+ CHANGE_WINDOW_DOOR_MEASURE: CHANGE_WINDOW_DOOR_MEASURE,
655
+ CHANGE_MEASUREMENT_UNIT: CHANGE_MEASUREMENT_UNIT
654
656
  };
655
657
  export var HOLE_NAMES = {
656
- WINDOW_CLEAR: 'Clear Window',
658
+ WINDOW_CLEAR: 'Window',
657
659
  WINDOW_CROSS: 'Cross Window',
658
660
  WINDOW_DOUBLE_HUNG: 'Double Hung Window',
659
661
  WINDOW_VERTICAL: 'window-vertical',
@@ -739,6 +741,7 @@ export var EXTERNAL_EVENT_UPDATE_ATTRIBUTE = 'EXTERNAL_EVENT_UPDATE_ATTRIBUTE';
739
741
  export var EXTERNAL_EVENT_UPDATE_PROPERTY = 'EXTERNAL_EVENT_UPDATE_PROPERTY'; // update the element's property (flip_doorhandle, open_doors...) in the property window
740
742
  export var EXTERNAL_EVENT_REPLACE_CABINET = 'EXTERNAL_EVENT_REPLACE_CABINET';
741
743
  export var EXTERNAL_EVENT_SET_FINISHING = 'EXTERNAL_EVENT_SET_FINISHING'; // set finishing(wallColor, floorStyle, doorHandle, backsplash, counterTop)
744
+ export var EXTERNAL_EVENT_ROTATE_PAN = 'EXTERNAL_EVENT_ROTATE_PAN'; // external event for rotate pan
742
745
 
743
746
  // internal event type
744
747
  export var INTERNAL_EVENT_UNSELECT_ALL = 'INTERNAL_EVENT_UNSELECT_ALL';
@@ -751,6 +754,7 @@ export var INTERNAL_EVENT_START_DRAW_WALL = 'INTERNAL_EVENT_START_DRAW_WALL';
751
754
 
752
755
  // room shape type
753
756
  export var ROOM_SHAPE_TYPE = {
757
+ CUSTOM: 'custom',
754
758
  RECTANGLE: 'rectangle',
755
759
  TWO_WALLS_LEFT_TOP: '2wLeftTop',
756
760
  TWO_WALLS_RIGHT_TOP: '2wRightTop',