kitchen-simulator 4.3.5 → 4.3.7

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.
@@ -6,7 +6,7 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
6
6
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
7
7
  import _regeneratorRuntime from "@babel/runtime/regenerator";
8
8
  import { Map } from 'immutable';
9
- import { EXTERNAL_EVENT_ADD_WALL, EXTERNAL_EVENT_TOGGLE_TO_3D, EXTERNAL_EVENT_TOGGLE_TO_2D, EXTERNAL_EVENT_TOGGLE_TO_ELEVATION, EXTERNAL_EVENT_MOVE_PAN, MODE_IDLE, MODE_2D_PAN, EXTERNAL_EVENT_ADD_ITEM, ARRAY_3D_MODES, MODE_IDLE_3D, MODE_ELEVATION_VIEW, MODE_DRAWING_LINE, TOP, BOTTOM, LEFT, RIGHT, EXTERNAL_EVENT_NEW_PROJECT, EXTERNAL_EVENT_CHANGE_DOORSTYLE, EXTERNAL_EVENT_ADD_ROOM_SHAPE, EXTERNAL_EVENT_ZOOM_IN, EXTERNAL_EVENT_ZOOM_OUT, EXTERNAL_EVENT_UNDO, EXTERNAL_EVENT_REDO, EXTERNAL_EVENT_SET_MOLDING, EXTERNAL_EVENT_PROJECT_SETTING, PROJECT_SETTING_OPTION, EXTERNAL_EVENT_SYNC_SCENE, INTERNAL_EVENT_SYNC_SCENE, EXTERNAL_EVENT_UPDATE_ATTRIBUTE, ATT_ITEM_POS, ATT_LINE_LENGTH, ATT_VERTEXT_ONE, ATT_VERTEXT_TWO, ATT_HOLE_OFFSET_A, ATT_HOLE_OFFSET_B, UNIT_CENTIMETER, UNIT_INCH, EXTERNAL_EVENT_UPDATE_PROPERTY, PROP_FLIP_DOOR_HANDLE, PROP_OPEN_DOORS, EXTERNAL_EVENT_LOAD_PROJECT, INTERNAL_EVENT_ITEMS_CATALOG, EXTERNAL_EVENT_ADD_HOLE, EXTERNAL_EVENT_CENTERING_2D, EXTERNAL_EVENT_DUPLICATE_ELEMENT, EXTERNAL_EVENT_DELETE_ELEMENT, ELEMENT_HOLE, ELEMENT_ITEM, ELEMENT_LINE, EXTERNAL_EVENT_REPLACE_CABINET, FINISHING_TYPE, EXTERNAL_EVENT_SET_FINISHING, EXTERNAL_EVENT_ROTATE_PAN } from "../constants";
9
+ import { EXTERNAL_EVENT_ADD_WALL, EXTERNAL_EVENT_TOGGLE_TO_3D, EXTERNAL_EVENT_TOGGLE_TO_2D, EXTERNAL_EVENT_TOGGLE_TO_ELEVATION, EXTERNAL_EVENT_MOVE_PAN, MODE_IDLE, MODE_2D_PAN, EXTERNAL_EVENT_ADD_ITEM, ARRAY_3D_MODES, MODE_IDLE_3D, MODE_ELEVATION_VIEW, MODE_DRAWING_LINE, TOP, BOTTOM, LEFT, RIGHT, EXTERNAL_EVENT_NEW_PROJECT, EXTERNAL_EVENT_CHANGE_DOORSTYLE, EXTERNAL_EVENT_ADD_ROOM_SHAPE, EXTERNAL_EVENT_ZOOM_IN, EXTERNAL_EVENT_ZOOM_OUT, EXTERNAL_EVENT_UNDO, EXTERNAL_EVENT_REDO, EXTERNAL_EVENT_SET_MOLDING, EXTERNAL_EVENT_PROJECT_SETTING, PROJECT_SETTING_OPTION, EXTERNAL_EVENT_SYNC_SCENE, INTERNAL_EVENT_SYNC_SCENE, EXTERNAL_EVENT_UPDATE_ATTRIBUTE, ATT_ITEM_POS, ATT_LINE_LENGTH, ATT_VERTEXT_ONE, ATT_VERTEXT_TWO, ATT_HOLE_OFFSET_A, ATT_HOLE_OFFSET_B, UNIT_CENTIMETER, UNIT_INCH, EXTERNAL_EVENT_UPDATE_PROPERTY, PROP_FLIP_DOOR_HANDLE, PROP_OPEN_DOORS, EXTERNAL_EVENT_LOAD_PROJECT, INTERNAL_EVENT_ITEMS_CATALOG, EXTERNAL_EVENT_ADD_HOLE, EXTERNAL_EVENT_CENTERING_2D, EXTERNAL_EVENT_DUPLICATE_ELEMENT, EXTERNAL_EVENT_DELETE_ELEMENT, ELEMENT_HOLE, ELEMENT_ITEM, ELEMENT_LINE, EXTERNAL_EVENT_REPLACE_CABINET, FINISHING_TYPE, EXTERNAL_EVENT_SET_FINISHING, EXTERNAL_EVENT_ROTATE_PAN, DOORSTYLE_SCOPE_SINGLE, DOORSTYLE_SCOPE_ALL, DOORSTYLE_SCOPE_MULTIPLE } from "../constants";
10
10
  import { isEmpty, updateViwer2D, centering2D } from "./helper";
11
11
  import exporter from "../catalog/utils/exporter";
12
12
  import { render2DItem, render3DItem, render3DApplianceItem, render3DLightingItem } from "../catalog/utils/item-loader";
@@ -1211,7 +1211,7 @@ export function handleExternalEvent(_x0) {
1211
1211
  function _handleExternalEvent() {
1212
1212
  _handleExternalEvent = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee0(props) {
1213
1213
  var _evt$payload3, _evt$payload4;
1214
- var evt, state, layerId, layer, _evt$payload, _state$catalog, cdsItems, itemKeys, _loop6, i, newScene, tempState, _props$onInternalEven, sLineCnt, element, _state$viewer2D, _evt$payload$initialP, mouseX, mouseY, v2d, vPosX, vPosY, layerID, defaulTitle, _Object$keys, _evt$payload5, doorStyle, itemCDS, isAll, _layerId, _cdsItems, allItems, selectedItemId, _itemKeys, _loop7, _i2, _props$onInternalEven2, _evt$payload6, roomShapeType, width, height, measurementUnit, _doorStyle, value, _value, _evt$payload7, moldingInfo, isGlobal, distElement, _distElement, _evt$payload8, option, _value2, _layerId2, _layer, _layer$getIn, selectedLines, selectedHoles, selectedItems, _i4, _i5, _i6, _evt$payload9, _evt$payload0, _evt$payload1, _evt$payload10, _layerID, _layer2, orginalItemInfo, originalItem, originalItemPos, replaceItem, _props$onInternalEven3, sceneData, currentTexture, _t5, _t6;
1214
+ var evt, state, layerId, layer, _evt$payload, _state$catalog, cdsItems, itemKeys, _loop6, i, newScene, tempState, _props$onInternalEven, sLineCnt, element, _state$viewer2D, _evt$payload$initialP, mouseX, mouseY, v2d, vPosX, vPosY, layerID, defaulTitle, _evt$payload5, doorStyle, itemCDS, applyScope, _evt$payload5$itemIds, itemIds, _layerId, allItems, targetItems, idSet, selectedItemIds, _cdsItems, _loop7, _i2, _props$onInternalEven2, _evt$payload6, roomShapeType, width, height, measurementUnit, _doorStyle, value, _value, _evt$payload7, moldingInfo, isGlobal, distElement, _distElement, _evt$payload8, option, _value2, _layerId2, _layer, _layer$getIn, selectedLines, selectedHoles, selectedItems, _i4, _i5, _i6, _evt$payload9, _evt$payload0, _evt$payload1, _evt$payload10, _layerID, _layer2, orginalItemInfo, originalItem, originalItemPos, replaceItem, _props$onInternalEven3, sceneData, currentTexture, _t5, _t6, _t7;
1215
1215
  return _regeneratorRuntime.wrap(function (_context11) {
1216
1216
  while (1) switch (_context11.prev = _context11.next) {
1217
1217
  case 0:
@@ -1227,7 +1227,7 @@ function _handleExternalEvent() {
1227
1227
  layerId = state.getIn(['scene', 'selectedLayer']);
1228
1228
  layer = state.getIn(['scene', 'layers', layerId]);
1229
1229
  _t5 = evt === null || evt === void 0 ? void 0 : evt.type;
1230
- _context11.next = _t5 === EXTERNAL_EVENT_LOAD_PROJECT ? 2 : _t5 === EXTERNAL_EVENT_TOGGLE_TO_3D ? 7 : _t5 === EXTERNAL_EVENT_TOGGLE_TO_2D ? 8 : _t5 === EXTERNAL_EVENT_TOGGLE_TO_ELEVATION ? 9 : _t5 === EXTERNAL_EVENT_ADD_WALL ? 10 : _t5 === EXTERNAL_EVENT_ADD_ITEM ? 11 : _t5 === EXTERNAL_EVENT_ADD_HOLE ? 14 : _t5 === EXTERNAL_EVENT_ROTATE_PAN ? 15 : _t5 === EXTERNAL_EVENT_MOVE_PAN ? 15 : _t5 === EXTERNAL_EVENT_NEW_PROJECT ? 16 : _t5 === EXTERNAL_EVENT_CHANGE_DOORSTYLE ? 17 : _t5 === EXTERNAL_EVENT_ADD_ROOM_SHAPE ? 21 : _t5 === EXTERNAL_EVENT_ZOOM_IN ? 22 : _t5 === EXTERNAL_EVENT_ZOOM_OUT ? 23 : _t5 === EXTERNAL_EVENT_CENTERING_2D ? 24 : _t5 === EXTERNAL_EVENT_UNDO ? 25 : _t5 === EXTERNAL_EVENT_REDO ? 26 : _t5 === EXTERNAL_EVENT_SET_MOLDING ? 27 : _t5 === EXTERNAL_EVENT_DUPLICATE_ELEMENT ? 29 : _t5 === EXTERNAL_EVENT_DELETE_ELEMENT ? 30 : _t5 === EXTERNAL_EVENT_PROJECT_SETTING ? 31 : _t5 === EXTERNAL_EVENT_UPDATE_ATTRIBUTE ? 40 : _t5 === EXTERNAL_EVENT_UPDATE_PROPERTY ? 40 : _t5 === EXTERNAL_EVENT_REPLACE_CABINET ? 41 : _t5 === EXTERNAL_EVENT_SET_FINISHING ? 43 : _t5 === EXTERNAL_EVENT_SYNC_SCENE ? 44 : 45;
1230
+ _context11.next = _t5 === EXTERNAL_EVENT_LOAD_PROJECT ? 2 : _t5 === EXTERNAL_EVENT_TOGGLE_TO_3D ? 7 : _t5 === EXTERNAL_EVENT_TOGGLE_TO_2D ? 8 : _t5 === EXTERNAL_EVENT_TOGGLE_TO_ELEVATION ? 9 : _t5 === EXTERNAL_EVENT_ADD_WALL ? 10 : _t5 === EXTERNAL_EVENT_ADD_ITEM ? 11 : _t5 === EXTERNAL_EVENT_ADD_HOLE ? 14 : _t5 === EXTERNAL_EVENT_ROTATE_PAN ? 15 : _t5 === EXTERNAL_EVENT_MOVE_PAN ? 15 : _t5 === EXTERNAL_EVENT_NEW_PROJECT ? 16 : _t5 === EXTERNAL_EVENT_CHANGE_DOORSTYLE ? 17 : _t5 === EXTERNAL_EVENT_ADD_ROOM_SHAPE ? 25 : _t5 === EXTERNAL_EVENT_ZOOM_IN ? 26 : _t5 === EXTERNAL_EVENT_ZOOM_OUT ? 27 : _t5 === EXTERNAL_EVENT_CENTERING_2D ? 28 : _t5 === EXTERNAL_EVENT_UNDO ? 29 : _t5 === EXTERNAL_EVENT_REDO ? 30 : _t5 === EXTERNAL_EVENT_SET_MOLDING ? 31 : _t5 === EXTERNAL_EVENT_DUPLICATE_ELEMENT ? 33 : _t5 === EXTERNAL_EVENT_DELETE_ELEMENT ? 34 : _t5 === EXTERNAL_EVENT_PROJECT_SETTING ? 35 : _t5 === EXTERNAL_EVENT_UPDATE_ATTRIBUTE ? 44 : _t5 === EXTERNAL_EVENT_UPDATE_PROPERTY ? 44 : _t5 === EXTERNAL_EVENT_REPLACE_CABINET ? 45 : _t5 === EXTERNAL_EVENT_SET_FINISHING ? 47 : _t5 === EXTERNAL_EVENT_SYNC_SCENE ? 48 : 49;
1231
1231
  break;
1232
1232
  case 2:
1233
1233
  if (!(evt !== null && evt !== void 0 && evt.payload)) {
@@ -1322,24 +1322,24 @@ function _handleExternalEvent() {
1322
1322
  }());
1323
1323
  } else props.projectActions.loadProject(evt.payload);
1324
1324
  case 6:
1325
- return _context11.abrupt("continue", 45);
1325
+ return _context11.abrupt("continue", 49);
1326
1326
  case 7:
1327
1327
  props.projectActions.unselectAll();
1328
1328
  props.projectActions.setMode(MODE_IDLE_3D);
1329
- return _context11.abrupt("continue", 45);
1329
+ return _context11.abrupt("continue", 49);
1330
1330
  case 8:
1331
1331
  props.projectActions.setMode(MODE_IDLE);
1332
- return _context11.abrupt("continue", 45);
1332
+ return _context11.abrupt("continue", 49);
1333
1333
  case 9:
1334
1334
  sLineCnt = layer.selected.lines.size;
1335
1335
  if (sLineCnt > 0) props.projectActions.setMode(MODE_ELEVATION_VIEW);
1336
- return _context11.abrupt("continue", 45);
1336
+ return _context11.abrupt("continue", 49);
1337
1337
  case 10:
1338
1338
  if (state.mode === MODE_IDLE || state.mode === MODE_2D_PAN) props.linesActions.selectToolDrawingLine('wall');else {
1339
1339
  props.projectActions.setMode(MODE_IDLE);
1340
1340
  props.linesActions.selectToolDrawingLine('wall');
1341
1341
  }
1342
- return _context11.abrupt("continue", 45);
1342
+ return _context11.abrupt("continue", 49);
1343
1343
  case 11:
1344
1344
  if (isEmpty(evt === null || evt === void 0 ? void 0 : evt.payload)) {
1345
1345
  _context11.next = 13;
@@ -1370,46 +1370,71 @@ function _handleExternalEvent() {
1370
1370
  props.projectActions.pushLastSelectedCatalogElementToHistory(element);
1371
1371
  props.projectActions.setIsCabinetDrawing(true);
1372
1372
  case 13:
1373
- return _context11.abrupt("continue", 45);
1373
+ return _context11.abrupt("continue", 49);
1374
1374
  case 14:
1375
1375
  ARRAY_3D_MODES.includes(state.mode) ? props.holesActions.selectToolDrawingHole3D(evt === null || evt === void 0 || (_evt$payload3 = evt.payload) === null || _evt$payload3 === void 0 ? void 0 : _evt$payload3.holeName) : props.holesActions.selectToolDrawingHole(evt === null || evt === void 0 || (_evt$payload4 = evt.payload) === null || _evt$payload4 === void 0 ? void 0 : _evt$payload4.holeName);
1376
- return _context11.abrupt("continue", 45);
1376
+ return _context11.abrupt("continue", 49);
1377
1377
  case 15:
1378
1378
  moveAndRotatePan2D3D(evt.type, props, evt.payload, state);
1379
- return _context11.abrupt("continue", 45);
1379
+ return _context11.abrupt("continue", 49);
1380
1380
  case 16:
1381
1381
  defaulTitle = 'Untitle';
1382
1382
  props.projectActions.newProject();
1383
1383
  props.projectActions.rename(defaulTitle);
1384
- return _context11.abrupt("continue", 45);
1384
+ return _context11.abrupt("continue", 49);
1385
1385
  case 17:
1386
- _evt$payload5 = evt.payload, doorStyle = _evt$payload5.doorStyle, itemCDS = _evt$payload5.itemCDS, isAll = _evt$payload5.isAll; // prepare item data request
1386
+ _evt$payload5 = evt.payload, doorStyle = _evt$payload5.doorStyle, itemCDS = _evt$payload5.itemCDS, applyScope = _evt$payload5.applyScope, _evt$payload5$itemIds = _evt$payload5.itemIds, itemIds = _evt$payload5$itemIds === void 0 ? [] : _evt$payload5$itemIds;
1387
1387
  _layerId = state.getIn(['scene', 'selectedLayer']);
1388
- _cdsItems = [];
1389
1388
  allItems = state.getIn(['scene', 'layers', _layerId, 'items']).toJS();
1390
- selectedItemId = state.getIn(['scene', 'layers', _layerId]).selected.items.toJS()[0];
1391
- _itemKeys = isAll ? (_Object$keys = Object.keys(allItems)) !== null && _Object$keys !== void 0 ? _Object$keys : [] : [selectedItemId];
1389
+ targetItems = []; // Prepare idSet for SINGLE or MULTIPLE
1390
+ idSet = null;
1391
+ if (applyScope === DOORSTYLE_SCOPE_SINGLE) {
1392
+ selectedItemIds = state.getIn(['scene', 'layers', _layerId, 'selected', 'items']).toJS();
1393
+ idSet = new Set(selectedItemIds);
1394
+ }
1395
+ if (applyScope === DOORSTYLE_SCOPE_MULTIPLE) {
1396
+ // itemIds contains item.id (instance IDs)
1397
+ idSet = new Set(itemIds);
1398
+ }
1399
+ _t6 = applyScope;
1400
+ _context11.next = _t6 === DOORSTYLE_SCOPE_ALL ? 18 : _t6 === DOORSTYLE_SCOPE_SINGLE ? 19 : _t6 === DOORSTYLE_SCOPE_MULTIPLE ? 19 : 20;
1401
+ break;
1402
+ case 18:
1403
+ targetItems = Object.values(allItems);
1404
+ return _context11.abrupt("continue", 21);
1405
+ case 19:
1406
+ targetItems = Object.values(allItems).filter(function (item) {
1407
+ var _idSet;
1408
+ return (_idSet = idSet) === null || _idSet === void 0 ? void 0 : _idSet.has(item.id);
1409
+ });
1410
+ return _context11.abrupt("continue", 21);
1411
+ case 20:
1412
+ return _context11.abrupt("continue", 21);
1413
+ case 21:
1414
+ _cdsItems = [];
1392
1415
  _loop7 = /*#__PURE__*/_regeneratorRuntime.mark(function _loop7() {
1393
1416
  var _itemCDS$find;
1394
1417
  var item, cdsId;
1395
1418
  return _regeneratorRuntime.wrap(function (_context10) {
1396
1419
  while (1) switch (_context10.prev = _context10.next) {
1397
1420
  case 0:
1398
- item = allItems[_itemKeys[_i2]];
1421
+ item = targetItems[_i2];
1399
1422
  cdsId = (_itemCDS$find = itemCDS.find(function (itCDS) {
1400
1423
  return itCDS.itemID === item.itemID;
1401
1424
  })) === null || _itemCDS$find === void 0 ? void 0 : _itemCDS$find.cabinet_door_style_id;
1402
1425
  if (cdsId && !_cdsItems.some(function (v) {
1403
1426
  return item.itemID === v.itemID && item.name === v.name && cdsId === v.cdsId;
1404
- })) _cdsItems.push({
1405
- itemID: item.itemID,
1406
- prototype: item.prototype,
1407
- category: item.category,
1408
- name: item.name,
1409
- type: item.type,
1410
- sku_number: item.sku_number,
1411
- cdsId: cdsId
1412
- });
1427
+ })) {
1428
+ _cdsItems.push({
1429
+ itemID: item.itemID,
1430
+ prototype: item.prototype,
1431
+ category: item.category,
1432
+ name: item.name,
1433
+ type: item.type,
1434
+ sku_number: item.sku_number,
1435
+ cdsId: cdsId
1436
+ });
1437
+ }
1413
1438
  case 1:
1414
1439
  case "end":
1415
1440
  return _context10.stop();
@@ -1417,18 +1442,17 @@ function _handleExternalEvent() {
1417
1442
  }, _loop7);
1418
1443
  });
1419
1444
  _i2 = 0;
1420
- case 18:
1421
- if (!(_i2 < _itemKeys.length)) {
1422
- _context11.next = 20;
1445
+ case 22:
1446
+ if (!(_i2 < targetItems.length)) {
1447
+ _context11.next = 24;
1423
1448
  break;
1424
1449
  }
1425
- return _context11.delegateYield(_loop7(), "t1", 19);
1426
- case 19:
1450
+ return _context11.delegateYield(_loop7(), "t1", 23);
1451
+ case 23:
1427
1452
  _i2++;
1428
- _context11.next = 18;
1453
+ _context11.next = 22;
1429
1454
  break;
1430
- case 20:
1431
- // request item catalog data to host app
1455
+ case 24:
1432
1456
  if (_cdsItems.length > 0) {
1433
1457
  (_props$onInternalEven2 = props.onInternalEvent) === null || _props$onInternalEven2 === void 0 || _props$onInternalEven2.call(props, {
1434
1458
  type: INTERNAL_EVENT_ITEMS_CATALOG,
@@ -1455,7 +1479,7 @@ function _handleExternalEvent() {
1455
1479
  _context1.next = 1;
1456
1480
  break;
1457
1481
  case 3:
1458
- props.itemsActions.setDoorStyle(doorStyle, itemCDS, isAll);
1482
+ props.itemsActions.setDoorStyle(doorStyle, itemCDS, applyScope, itemIds);
1459
1483
  case 4:
1460
1484
  case "end":
1461
1485
  return _context1.stop();
@@ -1466,99 +1490,101 @@ function _handleExternalEvent() {
1466
1490
  return _ref4.apply(this, arguments);
1467
1491
  };
1468
1492
  }());
1469
- } else props.itemsActions.setDoorStyle(doorStyle, itemCDS, isAll);
1470
- return _context11.abrupt("continue", 45);
1471
- case 21:
1493
+ } else {
1494
+ props.itemsActions.setDoorStyle(doorStyle, itemCDS, applyScope, itemIds);
1495
+ }
1496
+ return _context11.abrupt("continue", 49);
1497
+ case 25:
1472
1498
  _evt$payload6 = evt.payload, roomShapeType = _evt$payload6.roomShapeType, width = _evt$payload6.width, height = _evt$payload6.height, measurementUnit = _evt$payload6.measurementUnit, _doorStyle = _evt$payload6.doorStyle;
1473
1499
  props.projectActions.createRoomWithShape(roomShapeType, width, height, measurementUnit, _doorStyle);
1474
- return _context11.abrupt("continue", 45);
1475
- case 22:
1500
+ return _context11.abrupt("continue", 49);
1501
+ case 26:
1476
1502
  value = state.getIn(['viewer2D']).toJS();
1477
1503
  value.a += 0.1;
1478
1504
  value.d += 0.1;
1479
1505
  value.e -= value.SVGWidth * 0.1 / 2;
1480
1506
  value.f -= value.SVGHeight * 0.1 / 2;
1481
1507
  updateViwer2D(value, props.viewer2DActions);
1482
- return _context11.abrupt("continue", 45);
1483
- case 23:
1508
+ return _context11.abrupt("continue", 49);
1509
+ case 27:
1484
1510
  _value = state.getIn(['viewer2D']).toJS();
1485
1511
  _value.a -= 0.1;
1486
1512
  _value.d -= 0.1;
1487
1513
  _value.e += _value.SVGWidth * 0.1 / 2;
1488
1514
  _value.f += _value.SVGHeight * 0.1 / 2;
1489
1515
  updateViwer2D(_value, props.viewer2DActions);
1490
- return _context11.abrupt("continue", 45);
1491
- case 24:
1516
+ return _context11.abrupt("continue", 49);
1517
+ case 28:
1492
1518
  centering2D(state, props.viewer2DActions);
1493
- return _context11.abrupt("continue", 45);
1494
- case 25:
1519
+ return _context11.abrupt("continue", 49);
1520
+ case 29:
1495
1521
  props.projectActions.undo();
1496
- return _context11.abrupt("continue", 45);
1497
- case 26:
1522
+ return _context11.abrupt("continue", 49);
1523
+ case 30:
1498
1524
  props.projectActions.redo();
1499
- return _context11.abrupt("continue", 45);
1500
- case 27:
1525
+ return _context11.abrupt("continue", 49);
1526
+ case 31:
1501
1527
  _evt$payload7 = evt.payload, moldingInfo = _evt$payload7.moldingInfo, isGlobal = _evt$payload7.isGlobal;
1502
- _context11.next = 28;
1528
+ _context11.next = 32;
1503
1529
  return loadMoldingSvg(moldingInfo);
1504
- case 28:
1530
+ case 32:
1505
1531
  props.itemsActions.setMolding(moldingInfo, isGlobal);
1506
- return _context11.abrupt("continue", 45);
1507
- case 29:
1532
+ return _context11.abrupt("continue", 49);
1533
+ case 33:
1508
1534
  distElement = getElement(evt.payload, state);
1509
1535
  if (distElement) props.itemsActions.duplicateSelected(distElement, props.onInternalEvent);
1510
- return _context11.abrupt("continue", 45);
1511
- case 30:
1536
+ return _context11.abrupt("continue", 49);
1537
+ case 34:
1512
1538
  _distElement = getElement(evt.payload, state);
1513
1539
  if (_distElement) props.projectActions.remove(_distElement);
1514
- return _context11.abrupt("continue", 45);
1515
- case 31:
1540
+ return _context11.abrupt("continue", 49);
1541
+ case 35:
1516
1542
  _evt$payload8 = evt.payload, option = _evt$payload8.option, _value2 = _evt$payload8.value;
1517
- _t6 = option;
1518
- _context11.next = _t6 === PROJECT_SETTING_OPTION.CHANGE_MEASUREMENT_UNIT ? 32 : _t6 === PROJECT_SETTING_OPTION.UPDATE_CEIL_HEIGHT ? 33 : _t6 === PROJECT_SETTING_OPTION.CHANGE_WALL_LENGTH_MEASURE ? 34 : _t6 === PROJECT_SETTING_OPTION.CHANGE_BASE_CABINET_MEASURE ? 35 : _t6 === PROJECT_SETTING_OPTION.CHANGE_WALL_CABINET_MEASURE ? 36 : _t6 === PROJECT_SETTING_OPTION.CHANGE_WINDOW_DOOR_MEASURE ? 37 : 38;
1543
+ _t7 = option;
1544
+ _context11.next = _t7 === PROJECT_SETTING_OPTION.CHANGE_MEASUREMENT_UNIT ? 36 : _t7 === PROJECT_SETTING_OPTION.UPDATE_CEIL_HEIGHT ? 37 : _t7 === PROJECT_SETTING_OPTION.CHANGE_WALL_LENGTH_MEASURE ? 38 : _t7 === PROJECT_SETTING_OPTION.CHANGE_BASE_CABINET_MEASURE ? 39 : _t7 === PROJECT_SETTING_OPTION.CHANGE_WALL_CABINET_MEASURE ? 40 : _t7 === PROJECT_SETTING_OPTION.CHANGE_WINDOW_DOOR_MEASURE ? 41 : 42;
1519
1545
  break;
1520
- case 32:
1546
+ case 36:
1521
1547
  props.viewer2DActions.updateCeilHeight(convert(layer.ceilHeight).from(layer.unit).to(_value2));
1522
1548
  props.viewer2DActions.updateCeilHeightUnit(_value2);
1523
1549
  props.viewer3DActions.update3DCeilHeightUnit(_value2);
1524
1550
  props.viewer3DActions.update3DCeilHeight(convert(layer.ceilHeight).from(layer.unit).to(_value2));
1525
- return _context11.abrupt("continue", 39);
1526
- case 33:
1551
+ return _context11.abrupt("continue", 43);
1552
+ case 37:
1527
1553
  props.viewer2DActions.updateCeilHeight(_value2);
1528
1554
  props.viewer3DActions.update3DCeilHeight(_value2);
1529
- return _context11.abrupt("continue", 39);
1530
- case 34:
1555
+ return _context11.abrupt("continue", 43);
1556
+ case 38:
1531
1557
  props.viewer2DActions.changeWallLengthMeasure(_value2);
1532
- return _context11.abrupt("continue", 39);
1533
- case 35:
1558
+ return _context11.abrupt("continue", 43);
1559
+ case 39:
1534
1560
  props.viewer2DActions.changeBaseCabinetMeasure(_value2);
1535
- return _context11.abrupt("continue", 39);
1536
- case 36:
1561
+ return _context11.abrupt("continue", 43);
1562
+ case 40:
1537
1563
  props.viewer2DActions.changeWallCabinetMeasure(_value2);
1538
- return _context11.abrupt("continue", 39);
1539
- case 37:
1564
+ return _context11.abrupt("continue", 43);
1565
+ case 41:
1540
1566
  props.viewer2DActions.changeWindowDoorMeasure(_value2);
1541
- return _context11.abrupt("continue", 39);
1542
- case 38:
1543
- return _context11.abrupt("continue", 39);
1544
- case 39:
1545
- return _context11.abrupt("continue", 45);
1546
- case 40:
1567
+ return _context11.abrupt("continue", 43);
1568
+ case 42:
1569
+ return _context11.abrupt("continue", 43);
1570
+ case 43:
1571
+ return _context11.abrupt("continue", 49);
1572
+ case 44:
1547
1573
  _layerId2 = state.getIn(['scene', 'selectedLayer']);
1548
1574
  _layer = state.getIn(['scene', 'layers', _layerId2]);
1549
1575
  _layer$getIn = _layer.getIn(['selected']), selectedLines = _layer$getIn.lines, selectedHoles = _layer$getIn.holes, selectedItems = _layer$getIn.items;
1550
1576
  for (_i4 = 0; _i4 < selectedLines.size; _i4++) (evt === null || evt === void 0 ? void 0 : evt.type) === EXTERNAL_EVENT_UPDATE_ATTRIBUTE ? updateAttributeOfSelectedElement(_layer.getIn(['lines', selectedLines.get(_i4)]), evt.payload, state, _layer, props.catalog, props.projectActions, evt.callback) : updatePropertyOfSelectedElement(_layer.getIn(['lines', selectedLines.get(_i4)]), evt.payload, props.catalog, props.projectActions, evt.callback);
1551
1577
  for (_i5 = 0; _i5 < selectedHoles.size; _i5++) (evt === null || evt === void 0 ? void 0 : evt.type) === EXTERNAL_EVENT_UPDATE_ATTRIBUTE ? updateAttributeOfSelectedElement(_layer.getIn(['holes', selectedHoles.get(_i5)]), evt.payload, state, _layer, props.catalog, props.projectActions, evt.callback) : updatePropertyOfSelectedElement(_layer.getIn(['holes', selectedHoles.get(_i5)]), evt.payload, props.catalog, props.projectActions, evt.callback);
1552
1578
  for (_i6 = 0; _i6 < selectedItems.size; _i6++) (evt === null || evt === void 0 ? void 0 : evt.type) === EXTERNAL_EVENT_UPDATE_ATTRIBUTE ? updateAttributeOfSelectedElement(_layer.getIn(['items', selectedItems.get(_i6)]), evt.payload, state, _layer, props.catalog, props.projectActions, evt.callback) : updatePropertyOfSelectedElement(_layer.getIn(['items', selectedItems.get(_i6)]), evt.payload, props.catalog, props.projectActions, evt.callback);
1553
- return _context11.abrupt("continue", 45);
1554
- case 41:
1579
+ return _context11.abrupt("continue", 49);
1580
+ case 45:
1555
1581
  _layerID = state.scene.selectedLayer;
1556
1582
  _layer2 = state.scene.getIn(['layers', _layerID]).toJS();
1557
1583
  orginalItemInfo = evt === null || evt === void 0 || (_evt$payload9 = evt.payload) === null || _evt$payload9 === void 0 ? void 0 : _evt$payload9.orginalItemInfo;
1558
1584
  originalItem = _layer2 === null || _layer2 === void 0 ? void 0 : _layer2.items[orginalItemInfo.id];
1559
- _context11.next = 42;
1585
+ _context11.next = 46;
1560
1586
  return addItemToCatalog(evt.payload.replaceItemInfo, state, props.catalog, props.projectActions);
1561
- case 42:
1587
+ case 46:
1562
1588
  originalItemPos = {
1563
1589
  rotation: originalItem.rotation,
1564
1590
  selectedItemId: originalItem.id,
@@ -1573,11 +1599,11 @@ function _handleExternalEvent() {
1573
1599
  }
1574
1600
  };
1575
1601
  props.itemsActions.replaceItem(originalItemPos, originalItem, replaceItem);
1576
- return _context11.abrupt("continue", 45);
1577
- case 43:
1602
+ return _context11.abrupt("continue", 49);
1603
+ case 47:
1578
1604
  setFinishing(props, state, evt.payload);
1579
- return _context11.abrupt("continue", 45);
1580
- case 44:
1605
+ return _context11.abrupt("continue", 49);
1606
+ case 48:
1581
1607
  sceneData = state.scene.toJS(); // get molding data for "ReviewForQuote"
1582
1608
  currentTexture = layer.doorStyle !== null || layer.doorStyle !== undefined ? layer.doorStyle : props.state.doorStyle.toJS();
1583
1609
  sceneData.layers[layerId].moldingData = getMoldingDataOfScene2(layer, props.catalog, currentTexture);
@@ -1588,8 +1614,8 @@ function _handleExternalEvent() {
1588
1614
  scene: sceneData
1589
1615
  }
1590
1616
  });
1591
- return _context11.abrupt("continue", 45);
1592
- case 45:
1617
+ return _context11.abrupt("continue", 49);
1618
+ case 49:
1593
1619
  case "end":
1594
1620
  return _context11.stop();
1595
1621
  }
@@ -278,12 +278,13 @@ function updateItemsAltitude(layerID, itemID, value) {
278
278
  value: value
279
279
  };
280
280
  }
281
- function setDoorStyle(doorStyle, itemCDS, isAll) {
281
+ function setDoorStyle(doorStyle, itemCDS, applyScope, itemIds) {
282
282
  return {
283
283
  type: _constants.SET_DOOR_STYLE,
284
284
  doorStyle: doorStyle,
285
285
  itemCDS: itemCDS,
286
- isAll: isAll
286
+ applyScope: applyScope,
287
+ itemIds: itemIds
287
288
  };
288
289
  }
289
290
  function setCounterTop(counterTop) {
package/lib/class/item.js CHANGED
@@ -1168,8 +1168,9 @@ var Item = exports["default"] = /*#__PURE__*/function () {
1168
1168
  }
1169
1169
  }, {
1170
1170
  key: "setDoorStyle",
1171
- value: function setDoorStyle(state, doorStyle, itemCDS, isAll) {
1171
+ value: function setDoorStyle(state, doorStyle, itemCDS, applyScope) {
1172
1172
  var _this2 = this;
1173
+ var targetItemIDs = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
1173
1174
  if ((0, _utils.isEmpty)(doorStyle)) return {
1174
1175
  updatedState: state
1175
1176
  };
@@ -1194,10 +1195,33 @@ var Item = exports["default"] = /*#__PURE__*/function () {
1194
1195
  });
1195
1196
  });
1196
1197
  state = state.setIn(['scene', 'layers', layerID, 'molding'], temp_layer_molding);
1197
- var itemIDs = state.scene.layers.getIn([layerID, 'selected', 'items']).toJS();
1198
+
1199
+ // 🔥 Determine which items to update
1200
+ var items = state.scene.layers.get(layerID).items;
1201
+ var itemsToProcess = [];
1202
+ var idSet = null;
1203
+ if (applyScope === _constants.DOORSTYLE_SCOPE_SINGLE) {
1204
+ var selectedItemIds = state.scene.layers.getIn([layerID, 'selected', 'items']).toJS();
1205
+ idSet = new Set(selectedItemIds);
1206
+ }
1207
+ if (applyScope === _constants.DOORSTYLE_SCOPE_MULTIPLE) {
1208
+ // targetItemIds contains item.id (instance IDs)
1209
+ idSet = new Set(targetItemIDs);
1210
+ }
1211
+ if (applyScope === _constants.DOORSTYLE_SCOPE_ALL) {
1212
+ items.forEach(function (item) {
1213
+ itemsToProcess.push(item);
1214
+ });
1215
+ } else if (idSet) {
1216
+ items.forEach(function (item) {
1217
+ if (idSet.has(item.id)) {
1218
+ itemsToProcess.push(item);
1219
+ }
1220
+ });
1221
+ }
1198
1222
  var setDoorStyleOfItem = function setDoorStyleOfItem(data) {
1199
1223
  var _cds$data;
1200
- if (data.category !== 'cabinet') return; //CDS should effect to cabinets
1224
+ if (data.category !== 'cabinet') return;
1201
1225
  var itemID = data.id;
1202
1226
  var curItem = state.getIn(['scene', 'layers', layerID, 'items', itemID]);
1203
1227
  var layer = state.getIn(['scene', 'layers', layerID]);
@@ -1221,9 +1245,7 @@ var Item = exports["default"] = /*#__PURE__*/function () {
1221
1245
  return element && element.is_euro_cds;
1222
1246
  })) || [];
1223
1247
  var cds_data = cds ? [cds] : [];
1224
- if (
1225
- // doorStyle.door_style_name === 'Euro & Frameless' &&
1226
- euro_cds.length > 0) {
1248
+ if (euro_cds.length > 0) {
1227
1249
  var newProperties = state.scene.getIn(['layers', layerID, 'items', itemID, 'properties']).toJS();
1228
1250
  if (newProperties.hasOwnProperty('depth')) {
1229
1251
  if (!newProperties.hasOwnProperty('oldDepth')) {
@@ -1305,7 +1327,6 @@ var Item = exports["default"] = /*#__PURE__*/function () {
1305
1327
  type: doorStyle.type,
1306
1328
  sku: doorStyle.sku,
1307
1329
  color_sku_alias: doorStyle.color_sku_alias,
1308
- // alias name of color_sku for the current dealer
1309
1330
  install: (0, _utils.getInstallationSuffix)(_constants.INSTALLATION_SUFFIX_TYPE.NAME, doorStyle),
1310
1331
  doorStyles: _objectSpread(_objectSpread({}, tmp), {}, {
1311
1332
  cds: cds_data
@@ -1313,25 +1334,9 @@ var Item = exports["default"] = /*#__PURE__*/function () {
1313
1334
  };
1314
1335
  state = state.mergeIn(['scene', 'layers', layerID, 'items', itemID, 'doorStyle'], (0, _immutable.fromJS)(tmpDS));
1315
1336
  };
1316
- if (isAll) {
1317
- var items = state.scene.layers.get(layerID).items;
1318
- items.forEach(setDoorStyleOfItem);
1319
- } else {
1320
- if (itemIDs.length > 0) {
1321
- var _loop = function _loop() {
1322
- var itemID = itemIDs[i];
1323
- var items = state.scene.layers.get(layerID).items;
1324
- items.forEach(function (data) {
1325
- if (itemID === data.id) {
1326
- setDoorStyleOfItem(data);
1327
- }
1328
- });
1329
- };
1330
- for (var i = 0; i < itemIDs.length; i++) {
1331
- _loop();
1332
- }
1333
- }
1334
- }
1337
+
1338
+ // 🔥 Apply to resolved items
1339
+ itemsToProcess.forEach(setDoorStyleOfItem);
1335
1340
  return {
1336
1341
  updatedState: state
1337
1342
  };
@@ -1613,7 +1618,7 @@ var Item = exports["default"] = /*#__PURE__*/function () {
1613
1618
  }
1614
1619
  });
1615
1620
  var updateSelectItemMolding = function updateSelectItemMolding() {
1616
- var _loop2 = function _loop2() {
1621
+ var _loop = function _loop() {
1617
1622
  // check whether snapped item is same as selected item in layoutpos(Wall, Tall, Base)
1618
1623
  if (_export2.MoldingUtils.isSameMoldingLayoutpos(selectedItem, snappedItemGroup[i])) {
1619
1624
  // check whether snapped item is same in location(same location type and height).
@@ -1635,7 +1640,7 @@ var Item = exports["default"] = /*#__PURE__*/function () {
1635
1640
  }
1636
1641
  };
1637
1642
  for (var i = 0; i < snappedItemGroup.length; i++) {
1638
- _loop2();
1643
+ _loop();
1639
1644
  }
1640
1645
  };
1641
1646
  var emptyMoldingArray = function emptyMoldingArray() {
@@ -48,9 +48,6 @@ var _utils = require("../viewer2d/utils");
48
48
  var _helper = require("../../utils/helper");
49
49
  var _math = require("../../utils/math");
50
50
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
51
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
52
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
53
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
54
51
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
55
52
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
56
53
  var transformBox;
@@ -3049,11 +3046,11 @@ function createBacksplash(item, layer, planData, scene) {
3049
3046
  var wLines = (0, _geometry2.getSnappedWallLines)(item.itemInfo, layer, planData.catalog);
3050
3047
  var curLine = wLines.length > 0 ? wLines[0] : null;
3051
3048
 
3052
- // Get wall items
3049
+ // Get wall items which snapped to the curLine
3053
3050
 
3054
3051
  var i,
3055
3052
  wallItems = [];
3056
- var allWallItems = _export.GeometryUtils.getAllItemSpecified(scene, planData.catalog, _constants.WALL_CABINET_LAYOUTPOS);
3053
+ var allWallItems = _export.GeometryUtils.getAllItemSpecified(scene, planData.catalog, _constants.WALL_CABINET_LAYOUTPOS, curLine === null || curLine === void 0 ? void 0 : curLine.lineRect);
3057
3054
  for (i = 0; i < allWallItems.others.length; i++) wallItems.push(allWallItems.others[i]);
3058
3055
  if (allWallItems.cur) wallItems.push(allWallItems.cur);
3059
3056
 
@@ -3130,37 +3127,37 @@ function createBacksplash(item, layer, planData, scene) {
3130
3127
 
3131
3128
  // Find mergeable other backsplashes
3132
3129
 
3133
- var info, wholeWidth, /** Width factor */factor, distance, halfWidth, /** To get new center */centerFactor;
3134
- var _iterator = _createForOfIteratorHelper(backsplashes),
3135
- _step;
3136
- try {
3137
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
3138
- var back = _step.value;
3139
- info = back.info;
3140
- if (info.height === splashHeight && info.rotY === rotY) {
3141
- factor = Math.cos(rotY) || 1;
3142
- distance = Math.hypot(posX - info.posX, posZ - info.posZ) / factor;
3143
- halfWidth = (info.width + splashWidth) / 2;
3144
- if (Math.abs(distance - halfWidth) < 1e-2) {
3145
- // dispose `back`
3146
- if (info.id) {
3147
- deleteSpecifiedMeshObjects('backsplash' + info.id);
3148
- }
3130
+ // let info,
3131
+ // wholeWidth,
3132
+ // /** Width factor */ factor,
3133
+ // distance,
3134
+ // halfWidth,
3135
+ // /** To get new center */ centerFactor;
3136
+
3137
+ // for (let back of backsplashes) {
3138
+ // info = back.info;
3139
+ // if (info.height === splashHeight && info.rotY === rotY) {
3140
+ // factor = Math.cos(rotY) || 1;
3141
+ // distance = Math.hypot(posX - info.posX, posZ - info.posZ) / factor;
3142
+ // halfWidth = (info.width + splashWidth) / 2;
3143
+
3144
+ // if (Math.abs(distance - halfWidth) < 1e-2) {
3145
+ // // dispose `back`
3146
+ // if (info.id) {
3147
+ // deleteSpecifiedMeshObjects('backsplash' + info.id);
3148
+ // }
3149
+
3150
+ // // Get center position
3151
+ // wholeWidth = info.width + splashWidth;
3152
+ // centerFactor = info.width / wholeWidth;
3153
+ // posX = posX + centerFactor * (info.posX - posX);
3154
+ // posZ = posZ + centerFactor * (info.posZ - posZ);
3155
+
3156
+ // splashWidth = wholeWidth;
3157
+ // }
3158
+ // }
3159
+ // }
3149
3160
 
3150
- // Get center position
3151
- wholeWidth = info.width + splashWidth;
3152
- centerFactor = info.width / wholeWidth;
3153
- posX = posX + centerFactor * (info.posX - posX);
3154
- posZ = posZ + centerFactor * (info.posZ - posZ);
3155
- splashWidth = wholeWidth;
3156
- }
3157
- }
3158
- }
3159
- } catch (err) {
3160
- _iterator.e(err);
3161
- } finally {
3162
- _iterator.f();
3163
- }
3164
3161
  itemToSave.info.posX = posX;
3165
3162
  itemToSave.info.posY = posY;
3166
3163
  itemToSave.info.posZ = posZ;
@@ -3209,9 +3206,9 @@ function createBacksplash(item, layer, planData, scene) {
3209
3206
  }
3210
3207
  itemToSave.info.id = item.itemInfo.id;
3211
3208
  deleteSpecifiedMeshObjects('backsplash' + item.itemInfo.id);
3212
- if (item.rotRad % (Math.PI / 2) === 0) planData.plan.add(backsplash);
3209
+ if (Math.abs(item.rotRad % (Math.PI / 2)) < _constants.EPSILON) planData.plan.add(backsplash);
3213
3210
  backsplash.name = name;
3214
- backsplash.visible = item.itemInfo.get('backsplashVisible') && backsplashApplied && item.rotRad % (Math.PI / 2) === 0;
3211
+ backsplash.visible = item.itemInfo.get('backsplashVisible') && backsplashApplied && Math.abs(item.rotRad % (Math.PI / 2)) < _constants.EPSILON;
3215
3212
 
3216
3213
  // Save to scene graph
3217
3214