@colijnit/homedecorator 262.1.2 → 262.1.3

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.
@@ -82,7 +82,7 @@ import { DecoNodeType } from '@colijnit/configuratorapi/build/enum/deco-node-typ
82
82
  import JSZip from 'jszip';
83
83
  import { Answer } from '@colijnit/configuratorapi/build/model/answer';
84
84
  import { SelectorStructure } from '@colijnit/configuratorapi/build/model/selector-structure.bo';
85
- import { Evaluator, Brush, HOLLOW_SUBTRACTION } from 'three-bvh-csg';
85
+ import { Evaluator, Brush, SUBTRACTION } from 'three-bvh-csg';
86
86
  import { Line2 } from 'three/examples/jsm/lines/Line2.js';
87
87
  import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js';
88
88
  import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js';
@@ -253,8 +253,10 @@ var MessageType;
253
253
  MessageType["ChangeArticleConfigurationType"] = "ChangeArticleConfigurationType";
254
254
  MessageType["RenderUploadProgress"] = "RenderUploadProgress";
255
255
  MessageType["RenderUploadFinished"] = "RenderUploadFinished";
256
+ MessageType["RenderFinished"] = "RenderFinished";
256
257
  MessageType["RemoveSlowConnectionToast"] = "RemoveSlowConnectionToast";
257
258
  MessageType["OpenConfigurator"] = "OpenConfigurator";
259
+ MessageType["LoadConfigurationFromPreset"] = "LoadConfigurationFromPreset";
258
260
  })(MessageType || (MessageType = {}));
259
261
 
260
262
  class Preset {
@@ -3663,6 +3665,7 @@ class HomedecoratorAppEventService {
3663
3665
  this.externalOpen = new Subject();
3664
3666
  this.searchClick = new Subject();
3665
3667
  this.shareProject = new Subject();
3668
+ this.configurationFromPresetLoaded = new BehaviorSubject(false);
3666
3669
  }
3667
3670
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HomedecoratorAppEventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3668
3671
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HomedecoratorAppEventService, providedIn: 'root' }); }
@@ -4372,6 +4375,9 @@ class HomedecoratorConnectorAdapterService {
4372
4375
  return result.resultObject;
4373
4376
  }
4374
4377
  }
4378
+ async initForPreset(presetId, goodId, showLoader = true) {
4379
+ return await this._connector.initForPreset(presetId, goodId, showLoader);
4380
+ }
4375
4381
  // public async addToCart(goodId: number, goodType: GoodType, instanceId: number, sessionId: string, quantity: number = 1): Promise<void> {
4376
4382
  // const json: string = await this._getJSONFromArticleObject(goodId, goodType, instanceId, sessionId, quantity);
4377
4383
  // this._appEventService.addToCart.next({article: json, quantity: 1});
@@ -7209,6 +7215,18 @@ class HomedecoratorConnectorService {
7209
7215
  async getGoogleTranslation(sourceLang, targetLang, list) {
7210
7216
  return await this._connector.getGoogleTranslation(sourceLang, targetLang, list);
7211
7217
  }
7218
+ getExternalSourceFromId(externalSourceId) {
7219
+ return this._connector.getExternalSourceFromId(externalSourceId);
7220
+ }
7221
+ async getGoodIdFromArticleNr(sku) {
7222
+ return await this._connector.getGoodIdFromArticleNr(sku);
7223
+ }
7224
+ async initForPreset(presetId, goodId) {
7225
+ return await this._connector.initForPreset(presetId, goodId);
7226
+ }
7227
+ async getPublicParams(url, upId) {
7228
+ return await this._connector.getPublicParams(url, upId);
7229
+ }
7212
7230
  _prepareSelectionsToDisplayImages() {
7213
7231
  if (this.selectionsToDisplay && this.selectionsToDisplay.length > 0) {
7214
7232
  for (let i = 0; i < this.selectionsToDisplay.length; i++) {
@@ -9841,8 +9859,8 @@ class OutputSettings {
9841
9859
  }
9842
9860
  class SceneSettings {
9843
9861
  }
9844
- let RenderSettings$1 = class RenderSettings {
9845
- };
9862
+ class RenderSettings {
9863
+ }
9846
9864
  class Camera {
9847
9865
  }
9848
9866
  class CameraDOF {
@@ -10047,7 +10065,7 @@ class ApiServiceModule {
10047
10065
  };
10048
10066
  }
10049
10067
  _setRenderSettings(renderParameters) {
10050
- const settings = new RenderSettings$1();
10068
+ const settings = new RenderSettings();
10051
10069
  settings.width = renderParameters.width;
10052
10070
  settings.height = renderParameters.height;
10053
10071
  settings.outputType = OutputType.Jpeg;
@@ -10057,7 +10075,7 @@ class ApiServiceModule {
10057
10075
  return settings;
10058
10076
  }
10059
10077
  _setProductRenderSettings(renderParameters) {
10060
- const settings = new RenderSettings$1();
10078
+ const settings = new RenderSettings();
10061
10079
  settings.width = renderParameters.width;
10062
10080
  settings.height = renderParameters.height;
10063
10081
  settings.outputType = OutputType.Jpeg;
@@ -14822,7 +14840,7 @@ class BaseWall extends Mesh {
14822
14840
  this.remove(item);
14823
14841
  this.onItems = this.onItems.filter(i => i !== item);
14824
14842
  this.itemsChanged = true;
14825
- this._reCreateWallGeometry();
14843
+ // this._reCreateWallGeometry();
14826
14844
  }
14827
14845
  resetRoom() {
14828
14846
  this.oppositeCache.clear();
@@ -15106,12 +15124,26 @@ class BaseWall extends Mesh {
15106
15124
  this.items
15107
15125
  .filter((item) => item.getMaskedGeometry())
15108
15126
  .forEach((item) => {
15109
- const geo = item.getMaskedGeometry();
15127
+ // Subtract the opening as a single material group. A multi-group mask (a BoxGeometry has 6
15128
+ // groups) makes SUBTRACTION emit triangles for only the groups that actually cut the wall,
15129
+ // leaving empty groups that crash the evaluator (assignBufferData reads an absent group).
15130
+ // Clone first so the item's own geometry is never mutated or disposed by the wall.
15131
+ const geo = item.getMaskedGeometry().clone();
15132
+ geo.clearGroups();
15110
15133
  const holesBrush = new Brush(geo);
15134
+ holesBrush.material = this.material[this.frontMaterialIndex];
15111
15135
  holesBrush.position.copy(item.position);
15112
15136
  holesBrush.quaternion.copy(item.quaternion);
15113
15137
  holesBrush.updateMatrixWorld();
15114
- this.brush = this._evaluator.evaluate(this.brush, holesBrush, HOLLOW_SUBTRACTION);
15138
+ try {
15139
+ this.brush = this._evaluator.evaluate(this.brush, holesBrush, SUBTRACTION);
15140
+ }
15141
+ catch (e) {
15142
+ // The mask produced no geometry - it doesn't intersect the wall (e.g. a transient placement
15143
+ // position before the item is positioned on the wall). SUBTRACTION then leaves an empty
15144
+ // material group that the evaluator chokes on. Skip this hole; the cut runs again once the
15145
+ // item is positioned correctly (see InWallItem.placeOnWall). this.brush is left untouched.
15146
+ }
15115
15147
  this._tempHoles.push(holesBrush);
15116
15148
  });
15117
15149
  const newGeometry = this.brush.geometry;
@@ -15149,6 +15181,22 @@ class Wall extends BaseWall {
15149
15181
  this.userData = new Object();
15150
15182
  const cloned = new this.constructor(new Corner(this.start.x, this.start.y), new Corner(this.end.x, this.end.y), this.height, this.thickness, this.frontColor, this.backColor, this.version, this.frontTexture, this.backTexture, false);
15151
15183
  Object3D.prototype.copy.call(cloned, this, recursive);
15184
+ // Object3D.copy does not carry over geometry, so the constructor's plain box (built with an
15185
+ // empty items list, i.e. without window/door openings) would survive. A recursive clone -
15186
+ // such as the scene clone used for GLB export - must preserve the CSG-cut geometry. Use an
15187
+ // owned copy so disposing the export scene cannot free the live wall's geometry. The
15188
+ // non-recursive clone (the intersection wall) intentionally keeps its solid box for raycasting.
15189
+ if (recursive && this.geometry) {
15190
+ const cutGeometry = this.geometry.clone();
15191
+ cloned.geometry = cutGeometry;
15192
+ // The constructor built colour-only materials (createTextures = false), so the live wall's
15193
+ // textures would be missing from the export. Copy the live materials, cloned together with
15194
+ // their textures, so the export scene owns its own copies - disposing that scene must not
15195
+ // free the textures still in use by the live wall.
15196
+ ObjectUtils.DisposeMaterial(cloned.material);
15197
+ const clonedMaterial = ObjectUtils.CloneMaterial(this.material, false);
15198
+ cloned.material = clonedMaterial;
15199
+ }
15152
15200
  cloned.userData = tempUserData;
15153
15201
  this.userData = tempUserData;
15154
15202
  return cloned;
@@ -16990,6 +17038,9 @@ class WallItem extends Item {
16990
17038
  else {
16991
17039
  DistanceUtils.UpdateSideDistances(this.distancesObject, this, this.currentWall, this.worldPosVec.clone(), this.getHalfSize(), this.worldRotation.y);
16992
17040
  }
17041
+ // The arrows are built in the item's x/y plane at z ~= 0 (the item origin). For an in-wall item that
17042
+ // origin is the wall centre, so push the whole group forward to the wall face like the labels.
17043
+ this.distancesObject.position.z = this._measurementZOffset();
16993
17044
  this.add(this.distancesObject);
16994
17045
  return null;
16995
17046
  }
@@ -17031,12 +17082,20 @@ class WallItem extends Item {
17031
17082
  }
17032
17083
  return new Vector3();
17033
17084
  }
17085
+ /**
17086
+ * Local z at which measurement labels/distance arrows are drawn so they sit just in front of the wall.
17087
+ * Surface-mounted items sit on the wall face, so a small offset suffices. In-wall items override this
17088
+ * (they are centred inside the wall, so the offset must clear half the wall thickness).
17089
+ */
17090
+ _measurementZOffset() {
17091
+ return 0.01;
17092
+ }
17034
17093
  _createHeightMeasurement() {
17035
17094
  this.heightMesh = MeasurementUtils.makeHeightTextMesh(this.getHeight(), itemMeasurementsTextColor, itemMeasurementsTextSize, false, true);
17036
17095
  this.heightMesh.geometry.computeBoundingBox();
17037
17096
  const width = this.heightMesh.geometry.boundingBox.max.x - this.heightMesh.geometry.boundingBox.min.x;
17038
17097
  this.heightMesh.name = this.heightMeshName;
17039
- this.heightMesh.position.set(-this.halfSize.x - width, this.showDistances ? this._measurementYPositionOffset : 0, 0.01);
17098
+ this.heightMesh.position.set(-this.halfSize.x - width, this.showDistances ? this._measurementYPositionOffset : 0, this._measurementZOffset());
17040
17099
  this.add(this.heightMesh);
17041
17100
  }
17042
17101
  _createWidthMeasurement() {
@@ -17044,7 +17103,7 @@ class WallItem extends Item {
17044
17103
  this.widthMesh.geometry.computeBoundingBox();
17045
17104
  const width = this.widthMesh.geometry.boundingBox.max.x - this.widthMesh.geometry.boundingBox.min.x;
17046
17105
  this.widthMesh.name = this.widthMeshName;
17047
- this.widthMesh.position.set(0 - (width / 2), this.halfSize.y, 0.01);
17106
+ this.widthMesh.position.set(0 - (width / 2), this.halfSize.y, this._measurementZOffset());
17048
17107
  this.add(this.widthMesh);
17049
17108
  }
17050
17109
  _getMaskedGeometry() {
@@ -17233,6 +17292,8 @@ class InWallItem extends WallItem {
17233
17292
  this._openCloseIndicatorColor = '#606E8C';
17234
17293
  this._frameWidth = 0.07;
17235
17294
  this._frameDepth = 0.1;
17295
+ /** Extra depth added on top of the wall thickness so the dynamically built mask always pierces the wall. */
17296
+ this._maskDepthMargin = 0.1;
17236
17297
  this._isWindow = false;
17237
17298
  this._doorpost = false;
17238
17299
  this._setDefault();
@@ -17256,6 +17317,25 @@ class InWallItem extends WallItem {
17256
17317
  ObjectUtils.DisposeMaterial(this.frameMaterial);
17257
17318
  ObjectUtils.DisposeMaterial(this.doorMaterialFront);
17258
17319
  ObjectUtils.DisposeMaterial(this.windowMaterial);
17320
+ if (this._customMaskGeometry) {
17321
+ this._customMaskGeometry.dispose();
17322
+ this._customMaskGeometry = undefined;
17323
+ }
17324
+ }
17325
+ /**
17326
+ * Custom doors/windows are built at runtime and have no GLB `_mask` mesh, so the base lookup finds
17327
+ * nothing usable. Return the dynamically generated opening mask instead. Build it lazily here so any
17328
+ * instance (incl. clones that never ran createCustomMesh) yields a mask as soon as the wall asks for
17329
+ * one - otherwise the wall is left solid for that item.
17330
+ */
17331
+ getMaskedGeometry() {
17332
+ if (this.isCustom) {
17333
+ if (!this._customMaskGeometry && this.getWidth() > 0 && this.getHeight() > 0) {
17334
+ this._updateCustomMaskGeometry(this.getWidth(), this.getHeight());
17335
+ }
17336
+ return this._customMaskGeometry ? this._customMaskGeometry : null;
17337
+ }
17338
+ return super.getMaskedGeometry();
17259
17339
  }
17260
17340
  updateOpeningObject() {
17261
17341
  if (this.openCloseIndicatorObject) {
@@ -17307,6 +17387,10 @@ class InWallItem extends WallItem {
17307
17387
  this.createCustomMesh(this.getWidth(), this.getHeight());
17308
17388
  }
17309
17389
  super.placeOnWall(wall);
17390
+ // super.placeOnWall positions the item on the wall (_boundMove) only AFTER the initial addItem cut,
17391
+ // and _boundMove itself does not redraw. Re-cut now so the opening is subtracted at the item's final
17392
+ // position (the addItem cut ran at a transient position where the mask may not intersect the wall).
17393
+ this.redrawWall();
17310
17394
  }
17311
17395
  /** */
17312
17396
  getWallOffset() {
@@ -17386,16 +17470,22 @@ class InWallItem extends WallItem {
17386
17470
  return meshes;
17387
17471
  }
17388
17472
  else {
17389
- const visibleMeshes = [];
17390
- if (!this.visible) {
17391
- return [];
17392
- }
17393
- this.traverse(c => {
17394
- if (c.visible && !this.excludedMeshes.includes(c.name) && c instanceof Mesh) {
17395
- visibleMeshes.push(c);
17396
- }
17397
- });
17398
- return visibleMeshes;
17473
+ return super.getVisibleMeshes();
17474
+ // const visibleMeshes: (Mesh)[] = [];
17475
+ // if (!this.visible) {
17476
+ // return [];
17477
+ // }
17478
+ // this.traverse(c => {
17479
+ // if (c.visible &&
17480
+ // !this.excludedMeshes.includes(c.name) &&
17481
+ // !ObjectUtils.ChildOf(c, this.heightMeshName) &&
17482
+ // !ObjectUtils.ChildOf(c, this.widthMeshName) &&
17483
+ // !ObjectUtils.ChildOf(c, this.distancesObjectName) &&
17484
+ // c instanceof Mesh) {
17485
+ // visibleMeshes.push(c);
17486
+ // }
17487
+ // });
17488
+ // return visibleMeshes;
17399
17489
  }
17400
17490
  }
17401
17491
  async createTextureMaterial(options) {
@@ -17438,6 +17528,8 @@ class InWallItem extends WallItem {
17438
17528
  createCustomMesh(width, height) {
17439
17529
  const halfWidth = width / 2;
17440
17530
  const halfFrame = (this._frameWidth / 2);
17531
+ // Rebuild the opening mask on every (re)build so it tracks the current size of the custom item.
17532
+ this._updateCustomMaskGeometry(width, height);
17441
17533
  this.leftFrame = this._createFrameSide(this._frameWidth, this._getHeightFrame(height), this._frameDepth);
17442
17534
  this.leftFrame.rotation.set(this._isWindow ? 180 * (Math.PI / 180) : 0, 0, 0);
17443
17535
  this.leftFrame.position.x = -halfWidth + halfFrame;
@@ -17471,7 +17563,9 @@ class InWallItem extends WallItem {
17471
17563
  }
17472
17564
  this.customMesh = new THREE.Mesh(customGeo, this._isWindow ? this.windowMaterial : this.doorMaterialFront);
17473
17565
  this.customMesh.castShadow = this._isWindow ? false : !this.isGlass;
17474
- this.customMesh.renderOrder = -1;
17566
+ // Windows are transparent glass: let them render in the normal (post-opaque) transparent pass so
17567
+ // you see through the opening. renderOrder -1 (before opaque) is kept for the opaque door panel.
17568
+ this.customMesh.renderOrder = this._isWindow ? 0 : -1;
17475
17569
  this.customMesh.name = 'customMesh';
17476
17570
  if (this._isWindow) {
17477
17571
  this.customMesh.name += 'Window';
@@ -17591,17 +17685,22 @@ class InWallItem extends WallItem {
17591
17685
  this.frameMaterial = new THREE.MeshPhongMaterial({ side: side, name: 'frameMaterial' });
17592
17686
  this.frameMaterial.color = new THREE.Color(this.frameColor);
17593
17687
  if (this._isWindow) {
17594
- this.windowMaterial = new THREE.MeshPhongMaterial({ side: side, color: this.windowColor, name: 'windowMaterial' });
17688
+ // Name must contain 'glass' so MaterialUtils.ShowHideMaterials keeps it transparent when the wall
17689
+ // is shown - otherwise it forces transparent=false/opacity=1 and the pane looks solid.
17690
+ this.windowMaterial = new THREE.MeshPhongMaterial({ side: side, color: this.windowColor, name: 'windowGlassMaterial' });
17595
17691
  this.windowMaterial.transparent = true;
17596
17692
  this.windowMaterial.alphaTest = 0;
17597
17693
  this.windowMaterial.opacity = 0.2;
17598
17694
  this.windowMaterial.map = undefined;
17695
+ // Glass must not write depth, otherwise it occludes the view through the wall opening and the
17696
+ // pane looks solid instead of see-through.
17697
+ this.windowMaterial.depthWrite = false;
17599
17698
  this.windowMaterial.needsUpdate = true;
17600
- this.windowMaterial.side = THREE.FrontSide;
17699
+ // this.windowMaterial.side = THREE.FrontSide;
17601
17700
  this.object.material = [this.frameMaterial, this.windowMaterial];
17602
17701
  }
17603
17702
  else {
17604
- this.doorMaterialFront = new THREE.MeshPhongMaterial({ side: side, name: 'doorMaterialFront' });
17703
+ this.doorMaterialFront = new THREE.MeshPhongMaterial({ side: side, name: 'doorGlassMaterialFront' });
17605
17704
  this.doorMaterialFront.color = new THREE.Color(this.doorColor);
17606
17705
  if (this._doorpost) {
17607
17706
  this.doorMaterialFront.transparent = true;
@@ -17610,6 +17709,22 @@ class InWallItem extends WallItem {
17610
17709
  this.object.material = [this.frameMaterial, this.doorMaterialFront];
17611
17710
  }
17612
17711
  }
17712
+ /**
17713
+ * Builds the geometry used to subtract the opening from the wall. It spans the full width/height of
17714
+ * the custom item and is made deeper than the wall (plus a margin) so the CSG subtraction always
17715
+ * pierces the wall completely. base-wall positions it via the item's own position/quaternion, so the
17716
+ * box is centred on the item origin (the opening centre on the wall plane).
17717
+ */
17718
+ _updateCustomMaskGeometry(width, height) {
17719
+ const wallThickness = this.currentWall ? this.currentWall.thickness : 0.5;
17720
+ const maskDepth = wallThickness + (2 * this._maskDepthMargin);
17721
+ if (this._customMaskGeometry) {
17722
+ this._customMaskGeometry.dispose();
17723
+ }
17724
+ // The wall (base-wall) subtracts this as a single group, so the BoxGeometry's material groups are
17725
+ // irrelevant here - we only need a box of the right opening size and a depth that pierces the wall.
17726
+ this._customMaskGeometry = new BoxGeometry(width, height, maskDepth);
17727
+ }
17613
17728
  _getHeightFrame(height) {
17614
17729
  return height - (this._isWindow ? 2 * (this._frameWidth - 0.02) : this._frameWidth - 0.02);
17615
17730
  }
@@ -17740,6 +17855,13 @@ class InWallItem extends WallItem {
17740
17855
  this._createDepthMeasurement();
17741
17856
  }
17742
17857
  }
17858
+ /**
17859
+ * In-wall items sit centred inside the wall (getWallOffset() === 0), so the labels/arrows must clear
17860
+ * half the wall thickness to end up in front of the wall face instead of buried inside it.
17861
+ */
17862
+ _measurementZOffset() {
17863
+ return (this.currentWall ? this.currentWall.thickness / 2 : 0) + 0.02;
17864
+ }
17743
17865
  _createDepthMeasurement() {
17744
17866
  const depth = this.opening && this.opening.double ? Math.round((this.getWidth() / 2) * 100) / 100 : this.getWidth();
17745
17867
  this.depthMesh = MeasurementUtils.makeDepthTextMesh(depth, 0xFF00FF, 0.08, false, true);
@@ -22951,7 +23073,7 @@ class SceneEventService {
22951
23073
  this._messageBusService.emit(MessageType.SaveState, { action: `3D ${action}` });
22952
23074
  }), this._debouncedSaveState.pipe(debounceTime(200)).subscribe(() => {
22953
23075
  this._hudService.updateLabelMeasurements();
22954
- }), this._viewModeService.viewModeChanged.subscribe(mode => this.setExploreMode(mode === ViewMode.WalkThrough)), this._itemGroupService.objectAdded.subscribe((object) => this.setSelectedObject(object)), this._itemGroupService.grouped.subscribe((object) => this.setSelectedObject(object)), this._itemGroupService.ungrouped.subscribe(() => this.setSelectedObject(null)), this._messageBusService.subscribe(MessageType.ItemRemoved, () => this.setSelectedObject(null)), this._messageBusService.subscribe(MessageType.StartGroupObject, () => this._setGroupingMode(true)));
23076
+ }), this._viewModeService.viewModeChanged.subscribe(mode => this.setExploreMode(mode === ViewMode.WalkThrough)), this._itemGroupService.objectAdded.subscribe((object) => this.setSelectedObject(object)), this._itemGroupService.grouped.subscribe((object) => this.setSelectedObject(object)), this._itemGroupService.ungrouped.subscribe(() => this.setSelectedObject(null)), this._messageBusService.subscribe(MessageType.ItemRemoved, () => this.setSelectedObject(null)), this._messageBusService.subscribe(MessageType.StartGroupObject, () => this._setGroupingMode(true)), this._messageBusService.subscribe(MessageType.CancelGroupObject, () => this._setGroupingMode(false)));
22955
23077
  }
22956
23078
  setExploreMode(on = true) {
22957
23079
  if (on) {
@@ -22998,7 +23120,25 @@ class SceneEventService {
22998
23120
  }
22999
23121
  this._switchState(SceneEventState.DND);
23000
23122
  this._dragAndDropService.draggedStatus.dragEnter();
23001
- const vec3 = z ? new Vector3(x, y, z) : this.intersectingVec3(new Vector2(x, y));
23123
+ let screenPoint = new Vector2(x, y);
23124
+ const useViewportCentre = !z && x === 0 && y === 0 && !!this._element;
23125
+ if (useViewportCentre) {
23126
+ // The object library adds items with a (0,0) sentinel (there is no real cursor). Screen (0,0) is
23127
+ // the top-left corner, so the floor raycast lands at an arbitrary, camera-dependent spot. Use the
23128
+ // viewport centre instead.
23129
+ screenPoint = new Vector2(this._element.clientWidth / 2, this._element.clientHeight / 2);
23130
+ }
23131
+ const vec3 = z ? new Vector3(x, y, z) : this.intersectingVec3(screenPoint);
23132
+ if (useViewportCentre && isWallType(draggedData.type)) {
23133
+ // No cursor was used (library add), so there is no hit wall and getClosestWall() on a floor point
23134
+ // picks an arbitrary wall. Target the wall whose front the camera is looking at instead, and seed
23135
+ // it so the existing _changeWall() flow attaches the item to that wall. getClosestWall() itself is
23136
+ // left untouched (project loading via presets.service relies on it).
23137
+ const facingWall = this._wallMostFacingCamera();
23138
+ if (facingWall) {
23139
+ this._dragAndDropService.intersectedWall = { object: facingWall, point: vec3 ? vec3.clone() : new Vector3() };
23140
+ }
23141
+ }
23002
23142
  if (this._dragAndDropService.draggedItem) {
23003
23143
  this._dragAndDropService.draggedStatus.objectLoaded();
23004
23144
  this._dragAndDropService.updateDraggedPosition(vec3);
@@ -23010,6 +23150,35 @@ class SceneEventService {
23010
23150
  this._dragAndDropService.dragFloorDecoration(this._floorIntersection(this._sceneService.positionInSceneToScreen(vec3)));
23011
23151
  }
23012
23152
  }
23153
+ /**
23154
+ * The wall whose front face the camera is looking at most directly. Used to pick a sensible target
23155
+ * wall when an item is added without a cursor (object library). A wall's front normal is its +Z axis
23156
+ * in world space; the wall most facing the camera maximises frontNormal · (cameraPos - wallPos), which
23157
+ * naturally excludes the transparent near wall (its front points away from the camera).
23158
+ */
23159
+ _wallMostFacingCamera() {
23160
+ const walls = this._wallService.walls;
23161
+ if (!walls || !walls.length) {
23162
+ return null;
23163
+ }
23164
+ const cameraPosition = this._cameraService.camera.position;
23165
+ const wallPosition = new Vector3();
23166
+ const frontNormal = new Vector3();
23167
+ const toCamera = new Vector3();
23168
+ let best = null;
23169
+ let bestDot = -Infinity;
23170
+ for (const wall of walls) {
23171
+ wall.getWorldPosition(wallPosition);
23172
+ wall.getWorldDirection(frontNormal).normalize();
23173
+ toCamera.subVectors(cameraPosition, wallPosition).normalize();
23174
+ const dot = frontNormal.dot(toCamera);
23175
+ if (dot > bestDot) {
23176
+ bestDot = dot;
23177
+ best = wall;
23178
+ }
23179
+ }
23180
+ return best;
23181
+ }
23013
23182
  intersectingVec3(vec2, intersection) {
23014
23183
  if (!intersection) {
23015
23184
  const gIntersections = this._groundIntersections(vec2);
@@ -23443,7 +23612,9 @@ class SceneEventService {
23443
23612
  }
23444
23613
  _setGroupingMode(enableGrouping) {
23445
23614
  this._groupingMode = enableGrouping;
23446
- this._addToItemGroup(this._intersectedObject, this._prevSelectedObject);
23615
+ if (this._groupingMode) {
23616
+ this._addToItemGroup(this._intersectedObject, this._prevSelectedObject);
23617
+ }
23447
23618
  }
23448
23619
  _getDraggedData() {
23449
23620
  return this._dragAndDropService.draggedData;
@@ -28236,64 +28407,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
28236
28407
  type: Injectable
28237
28408
  }], ctorParameters: () => [{ type: ThreedInPhotoBuildService }, { type: ThreedInPhotoViewService }, { type: ThreedInPhotoConnectionService }, { type: ThreedInPhotoSceneService }, { type: ThreedInPhotoRenderService }, { type: i1$2.MatDialog }, { type: SceneEventService }, { type: CameraService }, { type: ViewModeService }] });
28238
28409
 
28239
- var ConnectionStatus;
28240
- (function (ConnectionStatus) {
28241
- ConnectionStatus[ConnectionStatus["IsUndefined"] = 0] = "IsUndefined";
28242
- ConnectionStatus[ConnectionStatus["IsConnected"] = 1] = "IsConnected";
28243
- ConnectionStatus[ConnectionStatus["TryingToConnect"] = 2] = "TryingToConnect";
28244
- ConnectionStatus[ConnectionStatus["IsDisConnected"] = 3] = "IsDisConnected";
28245
- })(ConnectionStatus || (ConnectionStatus = {}));
28246
-
28247
- var RenderStatus;
28248
- (function (RenderStatus) {
28249
- RenderStatus[RenderStatus["IsUndefined"] = 0] = "IsUndefined";
28250
- RenderStatus[RenderStatus["IsRunning"] = 1] = "IsRunning";
28251
- RenderStatus[RenderStatus["IsSuccess"] = 2] = "IsSuccess";
28252
- RenderStatus[RenderStatus["IsStopped"] = 3] = "IsStopped";
28253
- RenderStatus[RenderStatus["IsWaiting"] = 4] = "IsWaiting";
28254
- })(RenderStatus || (RenderStatus = {}));
28255
-
28256
- class RenderQueueItem {
28257
- constructor() {
28258
- this.startDateTime = new Date();
28259
- this.rendered = false;
28260
- this.renderProgress = 0;
28261
- this.renderIterations = 0;
28262
- this.renderStatus = RenderStatus.IsUndefined;
28263
- }
28264
- }
28265
-
28266
- var ToastType;
28267
- (function (ToastType) {
28268
- ToastType[ToastType["Success"] = 0] = "Success";
28269
- ToastType[ToastType["Warning"] = 1] = "Warning";
28270
- ToastType[ToastType["Error"] = 2] = "Error";
28271
- })(ToastType || (ToastType = {}));
28272
-
28273
- class Toast {
28274
- constructor() {
28275
- this.type = ToastType.Success;
28276
- }
28277
- }
28278
-
28279
- class RenderData {
28280
- constructor() {
28281
- this.cameraFOV = 45;
28282
- }
28283
- }
28284
-
28285
- class RenderSettings {
28286
- constructor() {
28287
- this.camRotationX = 0.24;
28288
- this.camRotationY = 0;
28289
- this.environmentName = '';
28290
- this.environmentHdr = '';
28291
- this.environmentRotation = 0;
28292
- this.environmentIntensity = null;
28293
- this.extraLights = [];
28294
- }
28295
- }
28296
-
28297
28410
  class ExportObject {
28298
28411
  }
28299
28412
 
@@ -28385,6 +28498,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
28385
28498
  type: Injectable
28386
28499
  }], ctorParameters: () => [{ type: HomedecoratorSettingsService }, { type: HomedecoratorConnectorAdapterService }, { type: ThreedselectorService }] });
28387
28500
 
28501
+ var RenderStatus;
28502
+ (function (RenderStatus) {
28503
+ RenderStatus[RenderStatus["IsUndefined"] = 0] = "IsUndefined";
28504
+ RenderStatus[RenderStatus["IsRunning"] = 1] = "IsRunning";
28505
+ RenderStatus[RenderStatus["IsSuccess"] = 2] = "IsSuccess";
28506
+ RenderStatus[RenderStatus["IsStopped"] = 3] = "IsStopped";
28507
+ RenderStatus[RenderStatus["IsWaiting"] = 4] = "IsWaiting";
28508
+ })(RenderStatus || (RenderStatus = {}));
28509
+
28510
+ class RenderQueueItem {
28511
+ constructor() {
28512
+ this.startDateTime = new Date();
28513
+ this.rendered = false;
28514
+ this.renderProgress = 0;
28515
+ this.renderIterations = 0;
28516
+ this.renderStatus = RenderStatus.IsUndefined;
28517
+ }
28518
+ }
28519
+
28388
28520
  class ToastService {
28389
28521
  constructor(_dictionaryService) {
28390
28522
  this._dictionaryService = _dictionaryService;
@@ -28401,597 +28533,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
28401
28533
  type: Injectable
28402
28534
  }], ctorParameters: () => [{ type: HomedecoratorDictionaryService }] });
28403
28535
 
28404
- class RenderService {
28405
- static MakeWindowMaterialTransparent(material) {
28406
- // console.log(material);
28407
- material.transparent = true;
28408
- material.opacity = Math.min(material.opacity, 0.4);
28409
- return material;
28410
- }
28411
- constructor(_settingsService, _exportService, _cameraService, _sceneService, _toastService, _messageBusService, _googleTagManager, _roomService, _floorService) {
28412
- this._settingsService = _settingsService;
28413
- this._exportService = _exportService;
28414
- this._cameraService = _cameraService;
28415
- this._sceneService = _sceneService;
28416
- this._toastService = _toastService;
28417
- this._messageBusService = _messageBusService;
28418
- this._googleTagManager = _googleTagManager;
28419
- this._roomService = _roomService;
28420
- this._floorService = _floorService;
28421
- this.renderModes = RenderModes;
28422
- this.streaming = {};
28423
- this.renderedRoomImages = [];
28424
- this.connectionStatus = ConnectionStatus.IsUndefined;
28425
- this.renders = [];
28426
- this.cameraPositions = [];
28427
- this.imageSizes = [
28428
- { id: 1, name: ' 720p (HD)', width: 1280, height: 720 },
28429
- { id: 2, name: '1080P (HD)', width: 1920, height: 1080 },
28430
- { id: 3, name: '1440p (2K)', width: 2560, height: 1440 },
28431
- { id: 4, name: '2160p (4K)', width: 4096, height: 2160 }
28432
- ];
28433
- this.lightnings = [
28434
- { id: 1, name: 'Light', settings: [] },
28435
- { id: 2, name: 'Medium', settings: [] },
28436
- { id: 3, name: 'Heay', settings: [] }
28437
- ];
28438
- this.renderEnvironments = [
28439
- { id: 1, name: 'None', hdrFile: '', intensity: 1.0 },
28440
- { id: 2, name: 'Modern city', hdrFile: 'canary_wharf_2k.hdr', intensity: 2.5 },
28441
- { id: 3, name: 'City park', hdrFile: 'dresden_moat_2k.hdr', intensity: 2.5 },
28442
- { id: 4, name: 'Night in the city', hdrFile: 'hansaplatz_2k.hdr', intensity: 1.0 },
28443
- { id: 5, name: 'Night in the countryside', hdrFile: 'kloppenheim_02_2k.hdr', intensity: 1.0 },
28444
- { id: 6, name: 'Forest', hdrFile: 'nagoya_wall_path_2k.hdr', intensity: 1.0 },
28445
- { id: 7, name: 'Snow', hdrFile: 'snowy_forest_path_01_2k.hdr', intensity: 1.0 },
28446
- { id: 8, name: 'Pasture', hdrFile: 'spruit_sunrise_2k.hdr', intensity: 1.0 },
28447
- { id: 9, name: 'Field', hdrFile: 'sunflowers_2k.hdr', intensity: 1.0 },
28448
- { id: 10, name: 'Old city and canals', hdrFile: 'tears_of_steel_bridge_2k.hdr', intensity: 1.0 },
28449
- { id: 11, name: 'Estate', hdrFile: 'tiergarten_2k.hdr', intensity: 1.0 },
28450
- { id: 12, name: 'Beach', hdrFile: 'umhlanga_sunrise_2k.hdr', intensity: 2.5 },
28451
- { id: 13, name: 'Residential area with park', hdrFile: 'urban_street_01_2k.hdr', intensity: 1.0 },
28452
- { id: 14, name: 'Residential area', hdrFile: 'urban_street_03_2k.hdr', intensity: 1.0 },
28453
- ];
28454
- this.renderScenes = [
28455
- { id: 1, name: 'scene_grass_cycles_MRP', sceneAssetId: 'scene_grass_cycles_MRP' },
28456
- { id: 2, name: 'scene_lake_cycles_MRP', sceneAssetId: 'scene_lake_cycles_MRP' },
28457
- { id: 3, name: 'scene_sky_cycles_MRP', sceneAssetId: 'scene_sky_cycles_MRP' },
28458
- { id: 4, name: 'scene_garden_cycles_MRP', sceneAssetId: 'scene_garden_cycles_MRP' },
28459
- { id: 5, name: 'scene_nature_cycles_MRP', sceneAssetId: 'scene_nature_cycles_MRP' },
28460
- { id: 5, name: 'scene_01', sceneAssetId: 'scene_01' }
28461
- ];
28462
- this._ceilingLightMargin = 0.5;
28463
- this.selectedImageSize = 2;
28464
- this.selectedEnvironment = 1;
28465
- this.selectedRenderScene = this.renderScenes[0].sceneAssetId;
28466
- this.blendFilesRender = this._settingsService.settings.blendFilesRender;
28467
- this.positions = 1;
28468
- this.save = false;
28469
- this.renderRoomImageChanged = new BehaviorSubject('');
28470
- this.renderingStarted = new Subject();
28471
- this.renderImageChanged = new BehaviorSubject('');
28472
- this.renderQueue = [];
28473
- this.currentQueueRenderItem = new RenderQueueItem();
28474
- this.currentProductHash = '';
28475
- this._subs = [];
28476
- this.sceneData = {};
28477
- this._subs.push(this._settingsService.settingsLoaded.subscribe((loaded) => {
28478
- if (loaded) {
28479
- this.serverData = this._settingsService.settings.renderParameters;
28480
- if (this.serverData) {
28481
- this.serverData.setup = false;
28482
- this.checkConnection();
28483
- this._renderServiceHeartBeat();
28484
- }
28485
- }
28486
- }));
28487
- }
28488
- ngOnDestroy() {
28489
- this._subs.forEach(s => s.unsubscribe());
28490
- }
28491
- async checkConnection() {
28492
- //
28493
- // if (this.service.validate() === false) {
28494
- //
28495
- // try {
28496
- //
28497
- // const url = `${(this.serverData.secure ? 'wss' : 'ws')}://${this.serverData.host}:${this.serverData.port}/service/`;
28498
- // await this.service.connect(url).then(() => {
28499
- // this.serverData.setup = true;
28500
- // }).catch((rej) => {
28501
- // });
28502
- //
28503
- // this.service.on('error', async (object) => {
28504
- // this.serverData.setup = false;
28505
- // if (this.connectionStatus !== ConnectionStatus.TryingToConnect) {
28506
- // this.connectionStatus = ConnectionStatus.IsDisConnected;
28507
- // }
28508
- // await this._onRenderError();
28509
- // });
28510
- // this.service.on('close', async (object) => {
28511
- // this.serverData.setup = false;
28512
- // if (this.connectionStatus !== ConnectionStatus.TryingToConnect) {
28513
- // this.connectionStatus = ConnectionStatus.IsDisConnected;
28514
- // }
28515
- // await this._onRenderClose();
28516
- // });
28517
- //
28518
- // } catch (err) {
28519
- //
28520
- // this.serverData.setup = false;
28521
- // }
28522
- // }
28523
- }
28524
- _renderServiceHeartBeat() {
28525
- setInterval(() => {
28526
- if (this.connectionStatus === ConnectionStatus.IsDisConnected) {
28527
- if (this._settingsService.settings.options.showRenderConnectionInfo) {
28528
- const toast = new Toast();
28529
- toast.message = 'CONNECTION_WITH_RENDER_SERVICE_LOST';
28530
- toast.type = ToastType.Error;
28531
- this._toastService.showToast(toast);
28532
- }
28533
- this.connectionStatus = ConnectionStatus.TryingToConnect;
28534
- this.checkConnection();
28535
- }
28536
- else if (this.connectionStatus === ConnectionStatus.TryingToConnect) {
28537
- if (this.serverData.setup === false) {
28538
- this._messageBusService.emit(MessageType.RenderServiceTryToConnect);
28539
- this.checkConnection();
28540
- }
28541
- else {
28542
- if (this._settingsService.settings.options.showRenderConnectionInfo) {
28543
- const toast = new Toast();
28544
- toast.message = 'RE_CONNECTED_WITH_RENDER_SERVICE';
28545
- toast.type = ToastType.Success;
28546
- this._toastService.showToast(toast);
28547
- }
28548
- this.connectionStatus = ConnectionStatus.IsConnected;
28549
- }
28550
- }
28551
- else if (this.connectionStatus === ConnectionStatus.IsConnected) {
28552
- this._messageBusService.emit(MessageType.RenderServiceConnected);
28553
- }
28554
- }, 2000);
28555
- }
28556
- getRenderParameters(type) {
28557
- const params = new RenderData();
28558
- if (type !== RenderModes.RenderIone) {
28559
- const currentImageSize = this.getImageSizeOnId(this.selectedImageSize);
28560
- params.imageWidth = Number(currentImageSize.width);
28561
- params.imageHeight = Number(currentImageSize.height);
28562
- }
28563
- params.configuredItem = this._getConfiguredFurnitureItem();
28564
- params.cameraFOV = this._cameraService.camera.fov;
28565
- params.type = type;
28566
- if (type === this.renderModes.RenderShop) {
28567
- params.cameraFOV = 30;
28568
- if (this._settingsService.settings.renderParameters.settings !== undefined) {
28569
- params.settings = this._settingsService.settings.renderParameters.settings;
28570
- }
28571
- }
28572
- else if (type === this.renderModes.RenderRoom) {
28573
- const renderEnvironment = this.getRenderEnvironmentOnId(this.selectedEnvironment);
28574
- params.settings = new RenderSettings();
28575
- params.settings.environmentHdr = renderEnvironment.hdrFile;
28576
- params.settings.environmentIntensity = renderEnvironment.intensity;
28577
- const floorPlanHasRooms = this._roomService.rooms[0];
28578
- const ceilingOrFloor = floorPlanHasRooms ? this._roomService.rooms[0].ceilingPlane : this._floorService.getFloorPlane();
28579
- const bb = new Box3().setFromObject(ceilingOrFloor);
28580
- const bbSize = new Vector3();
28581
- bb.getSize(bbSize);
28582
- params.settings.extraLights = [
28583
- {
28584
- x1: bb.min.x + this._ceilingLightMargin,
28585
- z1: bb.min.z + this._ceilingLightMargin,
28586
- x2: bb.max.x - this._ceilingLightMargin,
28587
- z2: bb.max.z - this._ceilingLightMargin,
28588
- height: floorPlanHasRooms ? ceilingOrFloor.position.y : 2.6,
28589
- }
28590
- ];
28591
- }
28592
- return params;
28593
- }
28594
- // The GLTFExporter needs lights to be configured like this,
28595
- // otherwise they will all point in the same direction.
28596
- _fixLight(element) {
28597
- element.target.parent = element;
28598
- element.lookAt(element.target.position);
28599
- element.target.position.x = 0;
28600
- element.target.position.y = 0;
28601
- element.target.position.z = -1;
28602
- }
28603
- _elementMustBeRemoved(element) {
28604
- if (element.type === 'PerspectiveCamera') {
28605
- return true;
28606
- }
28607
- if (!element.name) {
28608
- return false;
28609
- }
28610
- const lcName = element.name.toLowerCase();
28611
- // elements with a name starting with c_ are connectors,
28612
- // which should not be visible.
28613
- if (lcName.startsWith('c_')) {
28614
- return true;
28615
- }
28616
- if (element.name.startsWith('snapping-preview-mesh')) {
28617
- return true;
28618
- }
28619
- return false;
28620
- }
28621
- async _exportToGlb() {
28622
- const assetPath = this._settingsService.settings.assetPath;
28623
- // The ground plane looks odd in renders.
28624
- // The hud-ring and hud-circle are the walkthrough mode marker,
28625
- // which is not supposed to be rendered.
28626
- const elementsToRemove = ['ground-plane', 'hud-ring', 'hud-circle'];
28627
- let scene;
28628
- try {
28629
- scene = this._sceneService.scene.clone();
28630
- elementsToRemove.forEach(elementName => {
28631
- const selectedObject = scene.getObjectByName(elementName);
28632
- scene.remove(selectedObject);
28633
- });
28634
- // Using the parents, because scene.remove does not seem to work correctly.
28635
- const parents = [];
28636
- scene.traverse(element => {
28637
- if (element instanceof DirectionalLight || element instanceof SpotLight) {
28638
- this._fixLight(element);
28639
- }
28640
- if (element.visible === false) {
28641
- // console.log("Element " + element.name + " was invisible, making it visible.");
28642
- element.visible = true;
28643
- }
28644
- if (element instanceof Mesh && element.name && element.name.startsWith('customMeshWindow')) {
28645
- let hasCustomTexture = false;
28646
- if (element.material instanceof Material$1) {
28647
- if (element.material instanceof MeshPhongMaterial && element.material.map) {
28648
- hasCustomTexture = true;
28649
- }
28650
- element.material = RenderService.MakeWindowMaterialTransparent(element.material);
28651
- }
28652
- else if (Array.isArray(element.material)) {
28653
- element.material.forEach(function (material, index) {
28654
- if (material instanceof MeshPhongMaterial && material.map) {
28655
- hasCustomTexture = true;
28656
- }
28657
- element.material[index] = RenderService.MakeWindowMaterialTransparent(material);
28658
- });
28659
- }
28660
- if (!hasCustomTexture) {
28661
- element.name = 'glass';
28662
- }
28663
- }
28664
- if (this._elementMustBeRemoved(element)) {
28665
- parents.push(element.parent);
28666
- }
28667
- });
28668
- parents.forEach(parent => {
28669
- for (let i = parent.children.length - 1; i >= 0; i--) {
28670
- if (this._elementMustBeRemoved(parent.children[i])) {
28671
- parent.remove(parent.children[i]);
28672
- }
28673
- }
28674
- });
28675
- scene.add(this._cameraService.camera.clone());
28676
- const options = {
28677
- trs: false,
28678
- onlyVisible: false,
28679
- truncateDrawRange: true,
28680
- binary: true,
28681
- forceIndices: false,
28682
- forcePowerOfTwoTextures: false,
28683
- // maxTextureSize: 500,
28684
- embedImages: true,
28685
- };
28686
- const exporter = new GLTFExporter();
28687
- let filename = '';
28688
- return new Promise((resolve, reject) => {
28689
- exporter.parse(scene, async (exportedScene) => {
28690
- const blob = new Blob([exportedScene], { type: 'application/octet-stream' });
28691
- const result = await FileUtils.SaveGLBFile(blob, assetPath);
28692
- if (result !== false) {
28693
- filename = result.path;
28694
- }
28695
- resolve(filename);
28696
- }, () => {
28697
- }, options);
28698
- });
28699
- }
28700
- catch (e) {
28701
- throw (e);
28702
- }
28703
- }
28704
- async startRendering() {
28705
- if (this.renderQueue.length > 0) {
28706
- await this.checkConnection();
28707
- if (this.renderQueue[0].renderProgress === 0 || this.renderQueue[0].renderProgress === undefined) {
28708
- this.renderQueue[0].renderStatus = RenderStatus.IsRunning;
28709
- this.currentQueueRenderItem = this.renderQueue[0];
28710
- this.renderQueue.shift();
28711
- this.currentQueueRenderItem.params.glbPath = await this._exportToGlb()
28712
- .catch((e) => {
28713
- return Promise.reject(e);
28714
- });
28715
- await this._startRenderLoop();
28716
- }
28717
- }
28718
- }
28719
- async _colijnRenderScene(params) {
28720
- return new Promise((resolve, reject) => {
28721
- const requestParams = [{
28722
- id: 1,
28723
- jsonrpc: '2.0',
28724
- method: 'colijn_render_scene_from_glb',
28725
- params: params
28726
- }];
28727
- const xhr = new XMLHttpRequest();
28728
- xhr.open('POST', this._getRenderServiceUrl());
28729
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
28730
- xhr.onload = () => {
28731
- if (xhr.status >= 200 && xhr.status < 300) {
28732
- resolve(JSON.parse(xhr.responseText));
28733
- }
28734
- else {
28735
- reject(xhr.statusText);
28736
- }
28737
- };
28738
- xhr.onerror = () => reject(xhr.statusText);
28739
- xhr.send(JSON.stringify(requestParams));
28740
- });
28741
- }
28742
- async _startRenderLoop() {
28743
- // temporary solution because large request over websockets are not working because of an error in the software of migenius
28744
- let [info] = await this._colijnRenderScene(this.currentQueueRenderItem.params);
28745
- info = info.result;
28746
- /*
28747
- const [ info ] = await this.service.queue_commands()
28748
- .queue(new Command('colijn_render_scene', this.currentQueueRenderItem.params), true)
28749
- .execute();
28750
- */
28751
- this.currentQueueRenderItem.host = this._settingsService.settings.url;
28752
- this.currentQueueRenderItem.key = info.scene_name;
28753
- this.currentQueueRenderItem.type = this.currentQueueRenderItem.params.type;
28754
- this.currentQueueRenderItem.startDateTime = new Date();
28755
- this.currentQueueRenderItem.imageSize = this.currentQueueRenderItem.params.imageWidth + ' x ' + this.currentQueueRenderItem.params.imageHeight;
28756
- this._setRenderProgress(RenderStatus.IsRunning, 0, 0);
28757
- this.sceneData = info;
28758
- if (!this.sceneData || this.sceneData.error) {
28759
- return;
28760
- }
28761
- if (this.sceneData.image_info && this.sceneData.image_info.needs_render === true) {
28762
- this.currentQueueRenderItem.rendered = true;
28763
- await this._startRenderStream();
28764
- }
28765
- else {
28766
- this._afterRendering();
28767
- }
28768
- }
28769
- async _quitRenderLoop() {
28770
- // if (this.sceneData.loop_name !== undefined && this.service.validate() !== false) {
28771
- // const [] = await this.service.queue_commands()
28772
- // .queue(new Command('render_loop_quit', {
28773
- // render_loop_name: this.sceneData.loop_name
28774
- // }))
28775
- // .execute();
28776
- // this.service.remove_stream(this.sceneData.loop_name);
28777
- // }
28778
- }
28779
- async _startRenderStream() {
28780
- //
28781
- // try {
28782
- //
28783
- // this.streaming.stream = this.service.create_stream();
28784
- // await this.streaming.stream.start({render_loop_name: this.sceneData.loop_name, image_format: 'jpg', quality: '100'});
28785
- //
28786
- // this.streaming.stream.on('image', async (object) => {
28787
- // this._htmlImageDisplay(object, null);
28788
- // const [progress] = await this.service.queue_commands()
28789
- // .queue(new Command('render_loop_get_render_progress', {
28790
- // render_loop_name: this.sceneData.loop_name
28791
- // }), true)
28792
- // .execute();
28793
- //
28794
- // if (progress.progression !== undefined) {
28795
- // this._setRenderProgress(RenderStatus.IsRunning, Math.ceil((progress.progression * 100)), progress.iteration);
28796
- // }
28797
- //
28798
- // if (object.result === 1) {
28799
- //
28800
- // await this.service.queue_commands()
28801
- // .queue(new Command('render_loop_save_to_disk', {
28802
- // render_loop_name: this.sceneData.loop_name,
28803
- // format: 'jpg',
28804
- // quality: 90,
28805
- // path: this.sceneData.image_info.url
28806
- // }), true)
28807
- // .execute();
28808
- //
28809
- // if (this.streaming.stream !== undefined) {
28810
- // this.streaming.stream.stop();
28811
- // }
28812
- // await this._quitRenderLoop();
28813
- // this._afterRendering();
28814
- // return;
28815
- //
28816
- // } else if (object.result < 0) {
28817
- //
28818
- // await this._onRenderError();
28819
- // return;
28820
- // }
28821
- // });
28822
- //
28823
- // } catch (err) {
28824
- //
28825
- // await this._onRenderError();
28826
- // return;
28827
- // }
28828
- }
28829
- _setRenderProgress(status, progress, iterations) {
28830
- if (!this.serverData) {
28831
- return;
28832
- }
28833
- this.currentQueueRenderItem.endDateTime = new Date();
28834
- this.currentQueueRenderItem.renderStatus = status;
28835
- this.currentQueueRenderItem.renderProgress = progress;
28836
- if (iterations > 0) {
28837
- this.currentQueueRenderItem.renderIterations = iterations;
28838
- }
28839
- if (this.serverData.renderMode === RenderModes.RenderIone) {
28840
- const render = this.getRenderOnId(this.currentQueueRenderItem.params.render.id);
28841
- render.status = status;
28842
- render.progress = progress;
28843
- }
28844
- }
28845
- async _onRenderError() {
28846
- this._setRenderProgress(RenderStatus.IsStopped, 0, 0);
28847
- await this._quitRenderLoop();
28848
- }
28849
- async _onRenderClose() {
28850
- this._setRenderProgress(RenderStatus.IsStopped, 0, 0);
28851
- }
28852
- _afterRendering() {
28853
- if (!this.serverData) {
28854
- return;
28855
- }
28856
- this._setRenderProgress(RenderStatus.IsSuccess, 100, 0);
28857
- const imageUrl = this._settingsService.settings.assetPath.replace('content43/', '') + this.sceneData.image_info.url;
28858
- if (this.serverData.renderMode === RenderModes.RenderRoom) {
28859
- this.renderedRoomImages.unshift(imageUrl);
28860
- }
28861
- this.renderImageChanged.next(imageUrl);
28862
- if (this.serverData.renderMode === RenderModes.RenderIone) {
28863
- const render = this.getRenderOnId(this.currentQueueRenderItem.params.render.id);
28864
- render.url = imageUrl;
28865
- }
28866
- const configuredItem = this.currentQueueRenderItem.params.configuredItem;
28867
- const isSingleItem = this.serverData.renderMode !== RenderModes.RenderRoom;
28868
- this._googleTagManager.sendEvent(GoogleTagManagerEvent.Render, {
28869
- 'articleNr': isSingleItem ? configuredItem.sku : 'renderRoom',
28870
- 'product': isSingleItem ? configuredItem.name : 'renderRoom',
28871
- 'dimensions': this.currentQueueRenderItem.imageSize
28872
- });
28873
- this.startRendering();
28874
- }
28875
- _getRenderServiceUrl() {
28876
- return `${(this.serverData.secure ? 'https' : 'http')}://${this.serverData.host}:${this.serverData.port}`;
28877
- }
28878
- forceRenderImage() {
28879
- const floorGroup = this._getFirstCustomFloorItemFromScene();
28880
- if (floorGroup !== null) {
28881
- this._checkVisibleUpdates(floorGroup, true);
28882
- }
28883
- }
28884
- async _checkVisibleUpdates(furniture, forceRender = false) {
28885
- if (!this.serverData) {
28886
- return;
28887
- }
28888
- if (!furniture) {
28889
- return;
28890
- }
28891
- if (this.serverData.renderMode === this.renderModes.RenderIone) {
28892
- const object = this._exportService.getExportObjectFromCustomFloorGroup(furniture);
28893
- this.currentProductHash = object.defaultRenderPath;
28894
- }
28895
- else if (this.serverData.renderMode === this.renderModes.RenderShop) {
28896
- const object = this._exportService.getExportObjectFromCustomFloorGroup(furniture);
28897
- if (!(JSON.stringify(this.prevItem) !== JSON.stringify(object) || forceRender)) {
28898
- return;
28899
- }
28900
- this.renderingStarted.next();
28901
- this.prevItem = object;
28902
- const queueItem = new RenderQueueItem();
28903
- queueItem.params = this.getRenderParameters(this.renderModes.RenderShop);
28904
- queueItem.params.cameraMatrix = this._cameraService.camera.matrixWorldInverse.elements;
28905
- queueItem.params.forceRender = forceRender;
28906
- this.renderQueue = [];
28907
- this.renderQueue.push(queueItem);
28908
- await this.startRendering();
28909
- }
28910
- }
28911
- _htmlImageDisplay(image, urlCreator) {
28912
- try {
28913
- urlCreator = urlCreator || (window ? (window.URL || window.webkitURL) : undefined);
28914
- }
28915
- catch (e) {
28916
- }
28917
- const blob = new Blob([image.image], { type: image.mime_type });
28918
- const url = urlCreator.createObjectURL(blob);
28919
- this.renderRoomImageChanged.next(url);
28920
- }
28921
- getRenderOnId(id) {
28922
- let returnRender = null;
28923
- this.renders.forEach((x) => {
28924
- if (x.id === id) {
28925
- returnRender = x;
28926
- }
28927
- });
28928
- return returnRender;
28929
- }
28930
- getImageSizeOnId(id) {
28931
- let returnSize = null;
28932
- this.imageSizes.forEach((x) => {
28933
- if (x.id === id) {
28934
- returnSize = x;
28935
- }
28936
- });
28937
- return returnSize;
28938
- }
28939
- getRenderEnvironmentOnId(id) {
28940
- let returnEnvironment = null;
28941
- this.renderEnvironments.forEach((renderEnvironment) => {
28942
- if (renderEnvironment.id === id) {
28943
- returnEnvironment = renderEnvironment;
28944
- return;
28945
- }
28946
- });
28947
- return returnEnvironment;
28948
- }
28949
- getLightningOnId(id) {
28950
- let returnLightning = null;
28951
- this.lightnings.forEach((x) => {
28952
- if (x.id === id) {
28953
- returnLightning = x;
28954
- }
28955
- });
28956
- return returnLightning;
28957
- }
28958
- /******************************************** Export functions ********************************************/
28959
- _getFirstCustomFloorItemFromScene() {
28960
- const children = this._sceneService.scene.children;
28961
- if (children.length <= 0) {
28962
- return null;
28963
- }
28964
- for (let a = 0; a < children.length; a++) {
28965
- if (children[a] instanceof CustomFloorItem) {
28966
- return children[a];
28967
- }
28968
- if (children[a] instanceof ItemGroup) {
28969
- const itemGroup = children[a];
28970
- if (itemGroup.items.length > 0) {
28971
- itemGroup.items.forEach((item) => {
28972
- if (item instanceof CustomFloorItem) {
28973
- return item;
28974
- }
28975
- });
28976
- }
28977
- }
28978
- }
28979
- return null;
28980
- }
28981
- _getConfiguredFurnitureItem() {
28982
- const floorgroup = this._getFirstCustomFloorItemFromScene();
28983
- if (floorgroup === null) {
28984
- return null;
28985
- }
28986
- return this._exportService.getExportObjectFromCustomFloorGroup(floorgroup);
28987
- }
28988
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderService, deps: [{ token: HomedecoratorSettingsService }, { token: ExportService }, { token: CameraService }, { token: SceneService }, { token: ToastService }, { token: MessageBusService }, { token: GoogleTagManagerService }, { token: RoomService }, { token: FloorService }], target: i0.ɵɵFactoryTarget.Injectable }); }
28989
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderService }); }
28990
- }
28991
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderService, decorators: [{
28992
- type: Injectable
28993
- }], ctorParameters: () => [{ type: HomedecoratorSettingsService }, { type: ExportService }, { type: CameraService }, { type: SceneService }, { type: ToastService }, { type: MessageBusService }, { type: GoogleTagManagerService }, { type: RoomService }, { type: FloorService }] });
28994
-
28995
28536
  class LoadFurnitureWithoutSceneService extends LoadFurnitureBaseService {
28996
28537
  loadFurniture(furnitureData, shouldCopyInstance, looseOriginalConfiguration, standAlone, fromScratch, fromPreset, loadFromProject) {
28997
28538
  throw new Error('Method not implemented.');
@@ -29034,7 +28575,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
29034
28575
  type: Injectable
29035
28576
  }], ctorParameters: () => [{ type: LoadFurnitureService }, { type: LoadFurnitureWithoutSceneService }, { type: HomedecoratorSettingsService }, { type: HomedecoratorConnectorService }] });
29036
28577
 
29037
- class NewRenderService {
28578
+ class RenderService {
29038
28579
  constructor(messageService, _settingsService, _buildFurnitureService, _cameraService, _sceneService, _ione, _ioneConnectorAdapter, _threedSelectorService, _toastService, _messageBusService, _googleTagManager, _roomService, _floorService, _wallService, _ceilingService, _loadFurnitureService, _utilsService, _presetService, _apiServiceModule, _appEventService, _dictionaryService) {
29039
28580
  this.messageService = messageService;
29040
28581
  this._settingsService = _settingsService;
@@ -29064,9 +28605,14 @@ class NewRenderService {
29064
28605
  this.renderRoomImageChanged = new BehaviorSubject('');
29065
28606
  this.currentQueueRenderItem = new RenderQueueItem();
29066
28607
  this.renderedRoomImages = [];
28608
+ this.blendFilesRender = false;
29067
28609
  this._overWriteTransparency = false;
29068
28610
  this._subs = [];
29069
- this._subs.push(this.messageService.subscribe(MessageType.BlenderRenderFileReady, (file) => this.procesRenderFile(file)));
28611
+ this._subs.push(this.messageService.subscribe(MessageType.BlenderRenderFileReady, (file) => this.procesRenderFile(file)), this._settingsService.settingsLoaded.subscribe((loaded) => {
28612
+ if (loaded) {
28613
+ this.blendFilesRender = this._settingsService.settings.blendFilesRender;
28614
+ }
28615
+ }));
29070
28616
  }
29071
28617
  ngOnDestroy() {
29072
28618
  this._subs.forEach(s => s.unsubscribe());
@@ -29091,7 +28637,14 @@ class NewRenderService {
29091
28637
  }
29092
28638
  }
29093
28639
  async renderRoom(settings, preview = false) {
29094
- const sceneData = await this._exportToGlb();
28640
+ let sceneData;
28641
+ try {
28642
+ sceneData = await this._exportToGlb();
28643
+ }
28644
+ catch (e) {
28645
+ this.renderImageError.next(this._dictionaryService.get(e.message));
28646
+ return;
28647
+ }
29095
28648
  const data = this._getDataForRoomRender(settings);
29096
28649
  data.files = {
29097
28650
  glbData: this._arrayBufferToBase64(sceneData)
@@ -29115,6 +28668,21 @@ class NewRenderService {
29115
28668
  let scene;
29116
28669
  try {
29117
28670
  scene = this._sceneService.scene.clone(true);
28671
+ const masksToRemove = new Map();
28672
+ scene.traverse((child) => {
28673
+ if (child.parent && child instanceof Mesh && child.name && child.name.toLowerCase().indexOf('_mask') > -1) {
28674
+ masksToRemove.set(child.parent.uuid, child.uuid);
28675
+ }
28676
+ });
28677
+ masksToRemove.forEach((maskUuid, parentUuid) => {
28678
+ const parent = scene.getObjectByProperty('uuid', parentUuid);
28679
+ if (parent) {
28680
+ const mask = parent.getObjectByProperty('uuid', maskUuid);
28681
+ if (mask) {
28682
+ parent.remove(mask);
28683
+ }
28684
+ }
28685
+ });
29118
28686
  const lightsToRemove = scene.children.filter(c => c instanceof Light);
29119
28687
  lightsToRemove.forEach(light => {
29120
28688
  if ((light instanceof SpotLight || light instanceof DirectionalLight) && light.target) {
@@ -29135,6 +28703,10 @@ class NewRenderService {
29135
28703
  if (!this._cameraService.isCameraFacingFront(wall) && !wall.orphan && !wall.isInnerWall()) {
29136
28704
  wall.name = 'CULLING_wall';
29137
28705
  }
28706
+ wall.userData = {};
28707
+ // for (let i = wall.children.length; i >= 0; i--) {
28708
+ // wall.remove(wall.children[i]);
28709
+ // }
29138
28710
  });
29139
28711
  const ceilings = scene.children.filter(c => c.name && c.name === this._ceilingService.ceilingName);
29140
28712
  ceilings.forEach(ceiling => {
@@ -29153,7 +28725,9 @@ class NewRenderService {
29153
28725
  embedImages: true,
29154
28726
  };
29155
28727
  scene.name = 'mrp_room_' + scene.uuid;
29156
- const glb = await this._getGlbFromObject(scene, options);
28728
+ const glb = await this._getGlbFromObject(scene, options).catch((error) => {
28729
+ throw (error);
28730
+ });
29157
28731
  // this._utilsService.downloadFile(scene.name + '.glb', new Blob([glb], {type: 'model/gltf-binary'}));
29158
28732
  ObjectUtils.DisposeObject(scene);
29159
28733
  scene = null;
@@ -29168,7 +28742,8 @@ class NewRenderService {
29168
28742
  return new Promise((resolve, reject) => {
29169
28743
  exporter.parse(object, async (exportedScene) => {
29170
28744
  resolve(exportedScene);
29171
- }, () => {
28745
+ }, (error) => {
28746
+ reject(error);
29172
28747
  }, options);
29173
28748
  });
29174
28749
  }
@@ -29287,7 +28862,19 @@ class NewRenderService {
29287
28862
  method: 'POST',
29288
28863
  data: JSON.stringify(data),
29289
28864
  url: `${host}getRenderFromGlb`,
29290
- responseType: 'json'
28865
+ responseType: 'json',
28866
+ onUploadProgress: (progressEvent) => {
28867
+ const total = progressEvent.total ?? 0;
28868
+ if (total > 0) {
28869
+ const percent = Math.round((progressEvent.loaded * 100) / total);
28870
+ this._messageBusService.emit(MessageType.RenderUploadProgress, percent);
28871
+ if (percent >= 100) {
28872
+ this._messageBusService.emit(MessageType.RenderUploadFinished, true);
28873
+ }
28874
+ }
28875
+ }
28876
+ }).catch((error) => {
28877
+ return error;
29291
28878
  });
29292
28879
  if (result.status === 200) {
29293
28880
  // const image = `data:${result.data.fileType};base64,${result.data.image}`;
@@ -29308,7 +28895,12 @@ class NewRenderService {
29308
28895
  this.renderImageError.next(this._dictionaryService.get('BLENDER_PRODUCT_RENDER_ERROR'));
29309
28896
  }
29310
28897
  // Remove the loading indicator.
29311
- this._messageBusService.emit(MessageType.RenderUploadFinished, true);
28898
+ this._messageBusService.emit(MessageType.RenderFinished, true);
28899
+ }
28900
+ else {
28901
+ this.renderImageChanged.next('');
28902
+ this.renderImageError.next(this._dictionaryService.get('BLENDER_PRODUCT_RENDER_ERROR'));
28903
+ this._messageBusService.emit(MessageType.RenderFinished, true);
29312
28904
  }
29313
28905
  }
29314
28906
  }
@@ -29627,10 +29219,10 @@ class NewRenderService {
29627
29219
  this._overWriteTransparency = true;
29628
29220
  }
29629
29221
  }
29630
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: NewRenderService, deps: [{ token: MessageBusService }, { token: HomedecoratorSettingsService }, { token: SwitchBuildFurnitureService }, { token: CameraService }, { token: SceneService }, { token: HomedecoratorConnectorService }, { token: HomedecoratorConnectorAdapterService }, { token: ThreedselectorService }, { token: ToastService }, { token: MessageBusService }, { token: GoogleTagManagerService }, { token: RoomService }, { token: FloorService }, { token: WallService }, { token: CeilingService }, { token: SwitchLoadFurnitureService }, { token: UtilsService }, { token: PresetsService }, { token: ApiServiceModule }, { token: HomedecoratorAppEventService }, { token: HomedecoratorDictionaryService }], target: i0.ɵɵFactoryTarget.Injectable }); }
29631
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: NewRenderService }); }
29222
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderService, deps: [{ token: MessageBusService }, { token: HomedecoratorSettingsService }, { token: SwitchBuildFurnitureService }, { token: CameraService }, { token: SceneService }, { token: HomedecoratorConnectorService }, { token: HomedecoratorConnectorAdapterService }, { token: ThreedselectorService }, { token: ToastService }, { token: MessageBusService }, { token: GoogleTagManagerService }, { token: RoomService }, { token: FloorService }, { token: WallService }, { token: CeilingService }, { token: SwitchLoadFurnitureService }, { token: UtilsService }, { token: PresetsService }, { token: ApiServiceModule }, { token: HomedecoratorAppEventService }, { token: HomedecoratorDictionaryService }], target: i0.ɵɵFactoryTarget.Injectable }); }
29223
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderService }); }
29632
29224
  }
29633
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: NewRenderService, decorators: [{
29225
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderService, decorators: [{
29634
29226
  type: Injectable
29635
29227
  }], ctorParameters: () => [{ type: MessageBusService }, { type: HomedecoratorSettingsService }, { type: SwitchBuildFurnitureService }, { type: CameraService }, { type: SceneService }, { type: HomedecoratorConnectorService }, { type: HomedecoratorConnectorAdapterService }, { type: ThreedselectorService }, { type: ToastService }, { type: MessageBusService }, { type: GoogleTagManagerService }, { type: RoomService }, { type: FloorService }, { type: WallService }, { type: CeilingService }, { type: SwitchLoadFurnitureService }, { type: UtilsService }, { type: PresetsService }, { type: ApiServiceModule }, { type: HomedecoratorAppEventService }, { type: HomedecoratorDictionaryService }] });
29636
29228
 
@@ -30521,6 +30113,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
30521
30113
  type: Injectable
30522
30114
  }], ctorParameters: () => [{ type: HomedecoratorSettingsService }, { type: HomedecoratorConnectorService }] });
30523
30115
 
30116
+ var ToastType;
30117
+ (function (ToastType) {
30118
+ ToastType[ToastType["Success"] = 0] = "Success";
30119
+ ToastType[ToastType["Warning"] = 1] = "Warning";
30120
+ ToastType[ToastType["Error"] = 2] = "Error";
30121
+ })(ToastType || (ToastType = {}));
30122
+
30123
+ class Toast {
30124
+ constructor() {
30125
+ this.type = ToastType.Success;
30126
+ }
30127
+ }
30128
+
30524
30129
  class ConnectionHeathService {
30525
30130
  constructor(_http, _settingService, _toastService, _messageService) {
30526
30131
  this._http = _http;
@@ -31542,6 +31147,100 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
31542
31147
  type: Injectable
31543
31148
  }] });
31544
31149
 
31150
+ class ConfigurationPresetLoadService {
31151
+ set sku(value) {
31152
+ this._sku = value;
31153
+ }
31154
+ get sku() {
31155
+ return this._sku;
31156
+ }
31157
+ set instanceId(value) {
31158
+ this._instanceId = value;
31159
+ }
31160
+ get instanceId() {
31161
+ return this._instanceId;
31162
+ }
31163
+ set externalSourceId(value) {
31164
+ this._externalSourceId = value;
31165
+ }
31166
+ get externalSourceId() {
31167
+ return this._externalSourceId;
31168
+ }
31169
+ set showConfigurationLoad(value) {
31170
+ this._showConfigurationLoad = value;
31171
+ }
31172
+ get showConfigurationLoad() {
31173
+ return this._showConfigurationLoad;
31174
+ }
31175
+ constructor(_homedecoratorConnectorService, _settingsService, _homedecoratorConnectorAdapterService, _messageService, _homedecoratorEventService) {
31176
+ this._homedecoratorConnectorService = _homedecoratorConnectorService;
31177
+ this._settingsService = _settingsService;
31178
+ this._homedecoratorConnectorAdapterService = _homedecoratorConnectorAdapterService;
31179
+ this._messageService = _messageService;
31180
+ this._homedecoratorEventService = _homedecoratorEventService;
31181
+ this._showConfigurationLoad = false;
31182
+ this._subs = [];
31183
+ this._subs.push(this._messageService.subscribe(MessageType.ViewModeChanged, (mode) => this._updateMode(mode)));
31184
+ }
31185
+ ngOnDestroy() {
31186
+ this.reset();
31187
+ this._subs.forEach(sub => sub.unsubscribe());
31188
+ }
31189
+ async LoadPreset() {
31190
+ // Loading is a bitch
31191
+ // Init it for the preset (just java prod conf things)
31192
+ // Then tell it to load.
31193
+ if (this.goodId) {
31194
+ const initResponse = await this._homedecoratorConnectorService.initForPreset(this.instanceId, this.goodId);
31195
+ if (initResponse && initResponse.validationResult && initResponse.validationResult.success) {
31196
+ this._messageService.emit(MessageType.LoadConfigurationFromPreset, {
31197
+ sku: this.sku,
31198
+ instanceId: this.instanceId,
31199
+ settings: this._externalSourceOptions
31200
+ });
31201
+ this.reset();
31202
+ }
31203
+ }
31204
+ }
31205
+ async loadArticleDataForPreset() {
31206
+ if (this.sku && this.instanceId) {
31207
+ if (this.externalSourceId) {
31208
+ // Even if we define externalSourceId as a number, we got a string.
31209
+ const externalSource = this._homedecoratorConnectorService.getExternalSourceFromId(+this.externalSourceId);
31210
+ if (externalSource) {
31211
+ const params = await this._homedecoratorConnectorService.getPublicParams(externalSource.url, parseInt(externalSource.schema));
31212
+ const homeDecoSettings = Object.assign(JSON.parse(params.homeDecoSettings ? params.homeDecoSettings : params.catalogSettings), new HomedecoratorSettings());
31213
+ this._externalSourceOptions = homeDecoSettings;
31214
+ this._externalSourceOptions.externalSourceId = this._externalSourceId;
31215
+ await this._homedecoratorConnectorAdapterService.initConnector(homeDecoSettings ? homeDecoSettings : this._settingsService.settings, undefined, false, this.externalSourceId ? this.externalSourceId : undefined);
31216
+ }
31217
+ }
31218
+ this.goodId = await this._homedecoratorConnectorService.getGoodIdFromArticleNr(this.sku);
31219
+ this.article = await this._homedecoratorConnectorService.getArticle(this.sku, this._settingsService.settings.branch);
31220
+ this.showConfigurationLoad = true;
31221
+ }
31222
+ }
31223
+ reset() {
31224
+ this.article = undefined;
31225
+ this.goodId = undefined;
31226
+ this.sku = undefined;
31227
+ this.instanceId = undefined;
31228
+ this.externalSourceId = undefined;
31229
+ this._showConfigurationLoad = false;
31230
+ this._homedecoratorEventService.configurationFromPresetLoaded.next(true);
31231
+ }
31232
+ _updateMode(value) {
31233
+ if (value === ViewMode.RoomPlan3D) {
31234
+ this.loadArticleDataForPreset();
31235
+ }
31236
+ }
31237
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ConfigurationPresetLoadService, deps: [{ token: HomedecoratorConnectorService }, { token: HomedecoratorSettingsService }, { token: HomedecoratorConnectorAdapterService }, { token: MessageBusService }, { token: HomedecoratorAppEventService }], target: i0.ɵɵFactoryTarget.Injectable }); }
31238
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ConfigurationPresetLoadService }); }
31239
+ }
31240
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ConfigurationPresetLoadService, decorators: [{
31241
+ type: Injectable
31242
+ }], ctorParameters: () => [{ type: HomedecoratorConnectorService }, { type: HomedecoratorSettingsService }, { type: HomedecoratorConnectorAdapterService }, { type: MessageBusService }, { type: HomedecoratorAppEventService }] });
31243
+
31545
31244
  const APPLICATION_SERVICES_PROVIDERS = [
31546
31245
  HomedecoratorService,
31547
31246
  HomedecoratorAppService,
@@ -31605,9 +31304,8 @@ const APPLICATION_SERVICES_PROVIDERS = [
31605
31304
  DynamicCameraService,
31606
31305
  ThreedInPhotoInitializerService,
31607
31306
  ThreedInPhotoBuildService,
31608
- RenderService,
31609
31307
  ExportService,
31610
- NewRenderService,
31308
+ RenderService,
31611
31309
  AppInitializerService,
31612
31310
  JsonUtilsService,
31613
31311
  RalService,
@@ -31626,7 +31324,8 @@ const APPLICATION_SERVICES_PROVIDERS = [
31626
31324
  FloorplanCoordinatesService,
31627
31325
  FloorplanRenderService,
31628
31326
  CornerService,
31629
- FloorplanModeService
31327
+ FloorplanModeService,
31328
+ ConfigurationPresetLoadService
31630
31329
  ];
31631
31330
 
31632
31331
  class ProgressBarComponent {
@@ -33852,108 +33551,142 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
33852
33551
  class BlenderRenderSettings {
33853
33552
  }
33854
33553
 
33855
- class RenderProgressComponent {
33856
- set show(show) {
33857
- this._show = show;
33858
- if (show) {
33859
- this._progressService.progressBarType = ProgressType.Upload;
33860
- this._progressService.total = 100;
33554
+ // A pipe for appending strings to other strings in view templates.
33555
+ class AppendPipe {
33556
+ transform(value, append) {
33557
+ if (!value) {
33558
+ return '';
33861
33559
  }
33862
- else {
33863
- this._progressService.progressBarType = ProgressType.Download;
33864
- this._progressService.total = 0;
33560
+ if (!append) {
33561
+ return value;
33865
33562
  }
33563
+ return value + append;
33866
33564
  }
33867
- get show() {
33868
- return this._show;
33869
- }
33870
- get progressValue() {
33871
- return this.progress + '/ 100%';
33872
- }
33873
- constructor(_messageService, _progressService) {
33565
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppendPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
33566
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: AppendPipe, isStandalone: false, name: "append" }); }
33567
+ }
33568
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppendPipe, decorators: [{
33569
+ type: Pipe,
33570
+ args: [{
33571
+ name: 'append',
33572
+ standalone: false
33573
+ }]
33574
+ }] });
33575
+
33576
+ class RenderProgressComponent {
33577
+ constructor(_messageService) {
33874
33578
  this._messageService = _messageService;
33875
- this._progressService = _progressService;
33579
+ this.title = 'UPLOADING_ROOM';
33876
33580
  this.progress = 0;
33581
+ this.rendering = false;
33877
33582
  this._subs = [];
33878
- this._show = false;
33879
- this._subs.push(this._messageService.subscribe(MessageType.RenderUploadProgress, (progress) => this.updateProgress(progress)));
33583
+ this._subs.push(this._messageService.subscribe(MessageType.RenderUploadFinished, (ready) => {
33584
+ if (ready) {
33585
+ this.title = 'RENDERING_ROOM';
33586
+ this.rendering = true;
33587
+ }
33588
+ }), this._messageService.subscribe(MessageType.RenderUploadProgress, (progress) => this.updateProgress(progress)));
33880
33589
  }
33881
33590
  ngOnDestroy() {
33882
33591
  this._subs.forEach(sub => sub.unsubscribe());
33883
33592
  }
33884
33593
  updateProgress(progress) {
33885
- this.progress = progress;
33886
- this._progressService.progress = progress;
33594
+ this.progress = Math.max(0, Math.min(100, progress));
33887
33595
  }
33888
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderProgressComponent, deps: [{ token: MessageBusService }, { token: ProgressService }], target: i0.ɵɵFactoryTarget.Component }); }
33889
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: RenderProgressComponent, isStandalone: false, selector: "rp-render-progress", inputs: { show: "show", title: "title" }, ngImport: i0, template: `
33890
- @if (show) {
33596
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderProgressComponent, deps: [{ token: MessageBusService }], target: i0.ɵɵFactoryTarget.Component }); }
33597
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: RenderProgressComponent, isStandalone: false, selector: "rp-render-progress", ngImport: i0, template: `
33891
33598
  <div class="render-progress-model">
33892
33599
  <div class="model">
33893
33600
  <div class="model-header-container">
33894
- <h3 class="model-header" [textContent]="title"></h3>
33895
- <div class="close" (click)="show = false">
33896
- <mat-icon class="homedecorator-material-icons">cancel</mat-icon>
33897
- </div>
33601
+ <h3 class="model-header" [textContent]="title | localize"></h3>
33602
+ <!--
33603
+ <div class="close" (click)="show = false">
33604
+ <mat-icon class="homedecorator-material-icons">cancel</mat-icon>
33605
+ </div>
33606
+ -->
33898
33607
  </div>
33899
33608
  <div class="model-content-container">
33900
- <span class="progress-text" [textContent]="progressValue"></span>
33609
+ @if (!rendering) {
33610
+ <div class="progress-bar" role="progressbar" [attr.aria-valuenow]="progress" aria-valuemin="0" aria-valuemax="100">
33611
+ <div class="progress-bar-fill" [style.width.%]="progress"></div>
33612
+ <span class="progress-bar-text" [textContent]="progress.toString() | append:'%'"></span>
33613
+ </div>
33614
+ } @else {
33615
+ <span class="loading-dots" aria-hidden="true">
33616
+ <span></span>
33617
+ <span></span>
33618
+ <span></span>
33619
+ </span>
33620
+ }
33901
33621
  </div>
33902
33622
  </div>
33903
33623
  </div>
33904
- }
33905
- `, isInline: true, styles: [".render-progress-model{position:fixed;inset:0;z-index:100;background-color:#0003}.render-progress-model .model{width:400px;position:relative;top:20%;left:50%;margin-left:-200px;background:#fff;border-radius:10px;box-sizing:border-box;box-shadow:1px 0 20px #0000001f}.render-progress-model .model .model-header-container{display:flex;justify-content:space-between;border-bottom:1px solid #c5c3c6;padding:20px 20px 10px;align-items:center}.render-progress-model .model .model-header-container .close mat-icon{fill:#c5c3c6;color:#c5c3c6;cursor:pointer;transition:all .2s ease}.render-progress-model .model .model-header-container .close:hover mat-icon{fill:#46494c;color:#46494c}.render-progress-model .model .model-content-container{padding:20px}.render-progress-model .model .model-content-container .progress-text{text-align:center;margin-top:10px;display:block}.render-progress-model .model .model-content-container .progress-container{width:100%;height:25px;background-color:#e0e0e0;border-radius:12px;overflow:hidden}.render-progress-model .model .model-content-container .progress-fill{height:100%;background-color:#da9803;transition:width .3s ease-in-out}\n"], dependencies: [{ kind: "component", type: i3$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
33624
+ `, isInline: true, styles: [".render-progress-model{position:fixed;inset:0;z-index:100;background-color:#0003}.render-progress-model .model{width:400px;position:relative;top:20%;left:50%;margin-left:-200px;background:#fff;border-radius:10px;box-sizing:border-box;box-shadow:1px 0 20px #0000001f}.render-progress-model .model .model-header-container{display:flex;justify-content:space-between;border-bottom:1px solid #c5c3c6;padding:20px 20px 10px;align-items:center}.render-progress-model .model .model-header-container .close mat-icon{fill:#c5c3c6;color:#c5c3c6;cursor:pointer;transition:all .2s ease}.render-progress-model .model .model-header-container .close:hover mat-icon{fill:#46494c;color:#46494c}.render-progress-model .model .model-content-container{display:flex;justify-content:center;padding:20px}.render-progress-model .model .model-content-container .progress-container{width:100%;height:25px;background-color:#e0e0e0;border-radius:12px;overflow:hidden}.render-progress-model .model .model-content-container .progress-bar{position:relative;width:100%;height:18px;overflow:hidden;border-radius:999px;background-color:#e5e7eb}.render-progress-model .model .model-content-container .progress-bar-text{position:absolute;inset:0;color:#171721;display:flex;align-items:center;justify-content:center}.render-progress-model .model .model-content-container .progress-bar-fill{height:100%;width:0;background:linear-gradient(90deg,#da9803,#fff);transition:width .3s ease}.render-progress-model .model .model-content-container .loading-dots{display:inline-flex;gap:2px;margin-left:4px}.render-progress-model .model .model-content-container .loading-dots span{width:4px;height:4px;border-radius:50%;background-color:#171721;opacity:.25;animation:loading-dot 1.2s infinite ease-in-out}.render-progress-model .model .model-content-container .loading-dots span:nth-child(2){animation-delay:.2s}.render-progress-model .model .model-content-container .loading-dots span:nth-child(3){animation-delay:.4s}@keyframes loading-dot{0%,80%,to{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}\n"], dependencies: [{ kind: "pipe", type: LocalizePipe, name: "localize" }, { kind: "pipe", type: AppendPipe, name: "append" }] }); }
33906
33625
  }
33907
33626
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderProgressComponent, decorators: [{
33908
33627
  type: Component,
33909
33628
  args: [{ selector: 'rp-render-progress', template: `
33910
- @if (show) {
33911
33629
  <div class="render-progress-model">
33912
33630
  <div class="model">
33913
33631
  <div class="model-header-container">
33914
- <h3 class="model-header" [textContent]="title"></h3>
33915
- <div class="close" (click)="show = false">
33916
- <mat-icon class="homedecorator-material-icons">cancel</mat-icon>
33917
- </div>
33632
+ <h3 class="model-header" [textContent]="title | localize"></h3>
33633
+ <!--
33634
+ <div class="close" (click)="show = false">
33635
+ <mat-icon class="homedecorator-material-icons">cancel</mat-icon>
33636
+ </div>
33637
+ -->
33918
33638
  </div>
33919
33639
  <div class="model-content-container">
33920
- <span class="progress-text" [textContent]="progressValue"></span>
33640
+ @if (!rendering) {
33641
+ <div class="progress-bar" role="progressbar" [attr.aria-valuenow]="progress" aria-valuemin="0" aria-valuemax="100">
33642
+ <div class="progress-bar-fill" [style.width.%]="progress"></div>
33643
+ <span class="progress-bar-text" [textContent]="progress.toString() | append:'%'"></span>
33644
+ </div>
33645
+ } @else {
33646
+ <span class="loading-dots" aria-hidden="true">
33647
+ <span></span>
33648
+ <span></span>
33649
+ <span></span>
33650
+ </span>
33651
+ }
33921
33652
  </div>
33922
33653
  </div>
33923
33654
  </div>
33924
- }
33925
- `, standalone: false, styles: [".render-progress-model{position:fixed;inset:0;z-index:100;background-color:#0003}.render-progress-model .model{width:400px;position:relative;top:20%;left:50%;margin-left:-200px;background:#fff;border-radius:10px;box-sizing:border-box;box-shadow:1px 0 20px #0000001f}.render-progress-model .model .model-header-container{display:flex;justify-content:space-between;border-bottom:1px solid #c5c3c6;padding:20px 20px 10px;align-items:center}.render-progress-model .model .model-header-container .close mat-icon{fill:#c5c3c6;color:#c5c3c6;cursor:pointer;transition:all .2s ease}.render-progress-model .model .model-header-container .close:hover mat-icon{fill:#46494c;color:#46494c}.render-progress-model .model .model-content-container{padding:20px}.render-progress-model .model .model-content-container .progress-text{text-align:center;margin-top:10px;display:block}.render-progress-model .model .model-content-container .progress-container{width:100%;height:25px;background-color:#e0e0e0;border-radius:12px;overflow:hidden}.render-progress-model .model .model-content-container .progress-fill{height:100%;background-color:#da9803;transition:width .3s ease-in-out}\n"] }]
33926
- }], ctorParameters: () => [{ type: MessageBusService }, { type: ProgressService }], propDecorators: { show: [{
33927
- type: Input
33928
- }], title: [{
33929
- type: Input
33930
- }] } });
33655
+ `, standalone: false, styles: [".render-progress-model{position:fixed;inset:0;z-index:100;background-color:#0003}.render-progress-model .model{width:400px;position:relative;top:20%;left:50%;margin-left:-200px;background:#fff;border-radius:10px;box-sizing:border-box;box-shadow:1px 0 20px #0000001f}.render-progress-model .model .model-header-container{display:flex;justify-content:space-between;border-bottom:1px solid #c5c3c6;padding:20px 20px 10px;align-items:center}.render-progress-model .model .model-header-container .close mat-icon{fill:#c5c3c6;color:#c5c3c6;cursor:pointer;transition:all .2s ease}.render-progress-model .model .model-header-container .close:hover mat-icon{fill:#46494c;color:#46494c}.render-progress-model .model .model-content-container{display:flex;justify-content:center;padding:20px}.render-progress-model .model .model-content-container .progress-container{width:100%;height:25px;background-color:#e0e0e0;border-radius:12px;overflow:hidden}.render-progress-model .model .model-content-container .progress-bar{position:relative;width:100%;height:18px;overflow:hidden;border-radius:999px;background-color:#e5e7eb}.render-progress-model .model .model-content-container .progress-bar-text{position:absolute;inset:0;color:#171721;display:flex;align-items:center;justify-content:center}.render-progress-model .model .model-content-container .progress-bar-fill{height:100%;width:0;background:linear-gradient(90deg,#da9803,#fff);transition:width .3s ease}.render-progress-model .model .model-content-container .loading-dots{display:inline-flex;gap:2px;margin-left:4px}.render-progress-model .model .model-content-container .loading-dots span{width:4px;height:4px;border-radius:50%;background-color:#171721;opacity:.25;animation:loading-dot 1.2s infinite ease-in-out}.render-progress-model .model .model-content-container .loading-dots span:nth-child(2){animation-delay:.2s}.render-progress-model .model .model-content-container .loading-dots span:nth-child(3){animation-delay:.4s}@keyframes loading-dot{0%,80%,to{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}\n"] }]
33656
+ }], ctorParameters: () => [{ type: MessageBusService }] });
33931
33657
 
33932
33658
  class RenderControlsComponent {
33933
33659
  get disablePictureButton() {
33934
- return this._newRenderService.currentQueueRenderItem.renderStatus === this.renderStatus.IsRunning;
33660
+ return this.renderService.currentQueueRenderItem.renderStatus === this.renderStatus.IsRunning;
33935
33661
  }
33936
- constructor(renderService, messageService, viewModeService, settingsService, iconService, _dialog, _sceneService, _cameraService, _configurationService, _settingsService, _newRenderService, _utilsService, _roomService, _wallMeasurementsService, _connectionHealthService, _dictionaryService) {
33937
- this.renderService = renderService;
33662
+ constructor(messageService, viewModeService, settingsService, iconService, renderService, _dialog, _sceneService, _cameraService, _configurationService, _settingsService, _utilsService, _roomService, _wallMeasurementsService, _connectionHealthService, _dictionaryService, _dialogService) {
33938
33663
  this.messageService = messageService;
33939
33664
  this.viewModeService = viewModeService;
33940
33665
  this.settingsService = settingsService;
33941
33666
  this.iconService = iconService;
33667
+ this.renderService = renderService;
33942
33668
  this._dialog = _dialog;
33943
33669
  this._sceneService = _sceneService;
33944
33670
  this._cameraService = _cameraService;
33945
33671
  this._configurationService = _configurationService;
33946
33672
  this._settingsService = _settingsService;
33947
- this._newRenderService = _newRenderService;
33948
33673
  this._utilsService = _utilsService;
33949
33674
  this._roomService = _roomService;
33950
33675
  this._wallMeasurementsService = _wallMeasurementsService;
33951
33676
  this._connectionHealthService = _connectionHealthService;
33952
33677
  this._dictionaryService = _dictionaryService;
33678
+ this._dialogService = _dialogService;
33953
33679
  this.viewModes = ViewMode;
33954
33680
  this.renderStatus = RenderStatus;
33955
33681
  this.icons = IconEnum;
33956
33682
  this.renderModes = RenderModes;
33683
+ this.imageSizes = [
33684
+ { id: 1, name: ' 720p (HD)', width: 1280, height: 720 },
33685
+ { id: 2, name: '1080P (HD)', width: 1920, height: 1080 },
33686
+ { id: 3, name: '1440p (2K)', width: 2560, height: 1440 },
33687
+ { id: 4, name: '2160p (4K)', width: 4096, height: 2160 }
33688
+ ];
33689
+ this.selectedImageSize = this.imageSizes[1];
33957
33690
  this.hdriIntensity = 1;
33958
33691
  this.hdriRotation = 0;
33959
33692
  this.lightingExposure = 1;
@@ -33966,14 +33699,22 @@ class RenderControlsComponent {
33966
33699
  this.showCullingErrorDialog = false;
33967
33700
  this.startUploading = false;
33968
33701
  this._subs = [];
33969
- this._subs.push(this.messageService.subscribe(MessageType.BlenderRenderPreviewReady, (file) => this.showPreview(file)), this.messageService.subscribe(MessageType.RenderUploadFinished, (ready) => this.hideUploadDialog(ready)), this.messageService.subscribe(MessageType.RenderError, () => this.hideUploadDialog(true)), this._cameraService.cameraMovementChanged.subscribe(() => {
33702
+ this._subs.push(this.messageService.subscribe(MessageType.BlenderRenderPreviewReady, (file) => this.showPreview(file)), this.messageService.subscribe(MessageType.RenderFinished, (ready) => this.hideUploadDialog(ready)), this.messageService.subscribe(MessageType.RenderError, () => this.hideUploadDialog(true)), this._cameraService.cameraMovementChanged.subscribe(() => {
33970
33703
  this._validateRenderPosition();
33971
33704
  // Make sure when the camera moves, we recheck the position and if we still need to show the render warning.
33705
+ }), this.renderService.renderImageError.subscribe((error) => {
33706
+ if (error) {
33707
+ this.hideUploadDialog(true);
33708
+ this._dialogService.showDialog({ data: { title: 'Error', messages: [{ message: error }], type: 'error' } });
33709
+ }
33972
33710
  }));
33973
33711
  }
33974
33712
  ngOnInit() {
33975
33713
  this.getRenderScenesFromSettings();
33976
33714
  }
33715
+ ngOnDestroy() {
33716
+ this._subs.forEach((sub) => sub.unsubscribe());
33717
+ }
33977
33718
  showRenderForm(event) {
33978
33719
  this.inPictureMode = !this.inPictureMode;
33979
33720
  this._validateRenderPosition();
@@ -33987,16 +33728,14 @@ class RenderControlsComponent {
33987
33728
  this.startUploading = false;
33988
33729
  }
33989
33730
  }
33990
- createBlenderRender() {
33731
+ createBlenderRender(preview = false) {
33991
33732
  if (!this.showCullingErrorDialog) {
33992
33733
  if (this.viewModeService.isTopViewActive()) {
33993
33734
  this._wallMeasurementsService.prepMeasurementsForRender();
33994
33735
  }
33995
- this.messageService.emit(MessageType.ShowLoadingIndicator, { title: this._dictionaryService.get('PREPARE_TO_RENDER') });
33996
33736
  this.startUploading = true;
33997
33737
  // only render when the showCullingErrorDialog is false
33998
33738
  // this.messageService.emit(MessageType.ShowLoadingIndicator, {title: 'Uploading...'});
33999
- const renderSize = this.renderService.getImageSizeOnId(this.renderService.selectedImageSize);
34000
33739
  const renderSceneAssetId = this.selectedRenderScene;
34001
33740
  if (this.lightingExposure < 1) {
34002
33741
  this.lightingExposure = 1;
@@ -34004,15 +33743,15 @@ class RenderControlsComponent {
34004
33743
  this._validateRenderPosition(); // Check the camera position
34005
33744
  const allowCulling = this._allowCulling(this.hasError);
34006
33745
  const renderInput = new BlenderRenderSettings();
34007
- renderInput.height = renderSize.height;
34008
- renderInput.width = renderSize.width;
33746
+ renderInput.height = preview ? 150 : this.selectedImageSize.height;
33747
+ renderInput.width = preview ? 275 : this.selectedImageSize.width;
34009
33748
  renderInput.sceneAsset = renderSceneAssetId;
34010
33749
  renderInput.hdriIntensity = this.hdriIntensity;
34011
33750
  renderInput.hdriRotation = this.hdriRotation;
34012
33751
  renderInput.lightingExposure = this.lightingExposure;
34013
33752
  renderInput.allowCulling = allowCulling;
34014
33753
  // this._utilsService.prepRoomForRender(false, renderInput);
34015
- this._newRenderService.renderRoom(renderInput);
33754
+ this.renderService.renderRoom(renderInput, preview);
34016
33755
  if (this.viewModeService.isTopViewActive()) {
34017
33756
  this._wallMeasurementsService.restoreMeasurementsAfterRender();
34018
33757
  }
@@ -34040,35 +33779,6 @@ class RenderControlsComponent {
34040
33779
  this._cameraService.camera.position.set(movingPosition.x, movingPosition.y, movingPosition.z);
34041
33780
  this._cameraService.cameraMovementChanged.next();
34042
33781
  }
34043
- createPreviewRender() {
34044
- if (!this.showCullingErrorDialog) {
34045
- if (this.viewModeService.isTopViewActive()) {
34046
- this._wallMeasurementsService.prepMeasurementsForRender();
34047
- }
34048
- const renderSceneAssetId = this.selectedRenderScene;
34049
- // this.messageService.emit(MessageType.ShowLoadingIndicator, {title: 'Uploading...'});
34050
- // this.messageService.emit(MessageType.ShowLoadingIndicator, {title: this._dictionaryService.get('PREPARE_TO_RENDER')});
34051
- this.startUploading = true;
34052
- if (this.lightingExposure < 1) {
34053
- this.lightingExposure = 1;
34054
- }
34055
- this._validateRenderPosition(); // Check the camera position
34056
- const allowCulling = this._allowCulling(this.hasError);
34057
- const renderInput = new BlenderRenderSettings();
34058
- renderInput.height = 150;
34059
- renderInput.width = 275;
34060
- renderInput.sceneAsset = renderSceneAssetId;
34061
- renderInput.hdriIntensity = this.hdriIntensity;
34062
- renderInput.hdriRotation = this.hdriRotation;
34063
- renderInput.lightingExposure = this.lightingExposure;
34064
- renderInput.allowCulling = allowCulling;
34065
- // this._utilsService.prepRoomForRender(false, renderInput, true);
34066
- this._newRenderService.renderRoom(renderInput, true);
34067
- if (this.viewModeService.isTopViewActive()) {
34068
- this._wallMeasurementsService.restoreMeasurementsAfterRender();
34069
- }
34070
- }
34071
- }
34072
33782
  showPreview(image) {
34073
33783
  this.blenderPreviewRender = image;
34074
33784
  }
@@ -34153,465 +33863,413 @@ class RenderControlsComponent {
34153
33863
  // }
34154
33864
  // return allowCulling;
34155
33865
  }
34156
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderControlsComponent, deps: [{ token: RenderService }, { token: MessageBusService }, { token: ViewModeService }, { token: HomedecoratorSettingsService }, { token: HomedecoratorIconCacheService }, { token: i1$2.MatDialog }, { token: SceneService }, { token: CameraService }, { token: ConfigurationService }, { token: HomedecoratorSettingsService }, { token: NewRenderService }, { token: UtilsService }, { token: RoomService }, { token: WallMeasurementsService }, { token: ConnectionHeathService }, { token: HomedecoratorDictionaryService }], target: i0.ɵɵFactoryTarget.Component }); }
33866
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderControlsComponent, deps: [{ token: MessageBusService }, { token: ViewModeService }, { token: HomedecoratorSettingsService }, { token: HomedecoratorIconCacheService }, { token: RenderService }, { token: i1$2.MatDialog }, { token: SceneService }, { token: CameraService }, { token: ConfigurationService }, { token: HomedecoratorSettingsService }, { token: UtilsService }, { token: RoomService }, { token: WallMeasurementsService }, { token: ConnectionHeathService }, { token: HomedecoratorDictionaryService }, { token: DialogService }], target: i0.ɵɵFactoryTarget.Component }); }
34157
33867
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: RenderControlsComponent, isStandalone: false, selector: "rp-render-controls", viewQueries: [{ propertyName: "renderButton", first: true, predicate: ["renderButton"], descendants: true }], ngImport: i0, template: `
34158
- @if (renderService.serverData && renderService.serverData.renderMode !== renderService.renderModes.RenderShop) {
34159
- <div class="render-container"
34160
- >
34161
- @if (renderService.currentQueueRenderItem.renderStatus === renderStatus.IsRunning || renderService.currentQueueRenderItem.renderStatus === renderStatus.IsSuccess) {
34162
- <div class="render-progress"
34163
- >
34164
- {{ (renderService.currentQueueRenderItem.renderStatus === renderStatus.IsSuccess && renderService.currentQueueRenderItem.renderProgress === 100 ? "RENDER_READY" : "") | localize }}
34165
- {{ (renderService.currentQueueRenderItem.renderStatus === renderStatus.IsSuccess && renderService.currentQueueRenderItem.renderProgress !== 100 ? "RENDER_STOPPED" : "") | localize }}
34166
- {{ (renderService.currentQueueRenderItem.renderStatus === renderStatus.IsRunning) ? renderService.currentQueueRenderItem.renderProgress + "%" : "" }}
34167
- </div>
34168
- }
34169
- <!-- the Yellow render indicators -->
34170
- @if (inPictureMode) {
34171
- <div class="render-indicators">
34172
- <div class="render-indicator-top-left"></div>
34173
- <div class="render-indicator-top-right"></div>
34174
- <div class="render-indicator-bottom-left"></div>
34175
- <div class="render-indicator-bottom-right"></div>
34176
- </div>
34177
- }
34178
- @if (inPictureMode) {
34179
- <div class="render-popup-container">
34180
- <div class="render-popup-header">
34181
- <h3>
34182
- <span>{{ 'PICTURE_MODE' | localize }}</span>
34183
- @if (hasError) {
34184
- <co-icon class="renderErrorIcon" [iconData]="iconService.getIcon(icons.TriangleExclamation)"
34185
- [matTooltip]="'BLENDER_RENDER_ERROR' | localize"></co-icon>
34186
- }
34187
- </h3>
34188
- <button
34189
- class="close-popup-container"
34190
- (click)="resetBlenderRenderScene()">
34191
- <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
34192
- </button>
34193
- </div>
34194
- <div class="render-popup-preview">
34195
- @if (blenderPreviewRender) {
34196
- <img [src]="blenderPreviewRender" alt="">
34197
- }
34198
- @if (!blenderPreviewRender) {
34199
- <div class="render-popup-preview-placeholder">
34200
- <span>{{ 'PREVIEW' | localize }}</span>
34201
- </div>
34202
- }
34203
- <button
34204
- class="render-popup-refresh-preview"
34205
- (click)="createPreviewRender()"
34206
- >
34207
- <co-icon [iconData]="iconService.getIcon(icons.RetryButton)"></co-icon>
34208
- </button>
34209
- </div>
34210
- @if (renderService.blendFilesRender) {
34211
- <div class="render-popup-dropdown">
34212
- <div class="toggleable" (click)="toggleRenderSettings()">
34213
- <p>
34214
- @if (!showRenderSettings) {
34215
- <span [textContent]="'RENDER_ADVANCED_SETTINGS_SHOW' | localize"></span>
34216
- }
34217
- @if (showRenderSettings) {
34218
- <span [textContent]="'RENDER_ADVANCED_SETTINGS_HIDE' | localize"></span>
34219
- }
34220
- </p>
34221
- <co-icon [ngClass]="{'icon-rotate': showRenderSettings}"
34222
- [iconData]="iconService.getIcon(icons.ArrowPointDown)"></co-icon>
34223
- </div>
34224
- @if (showRenderSettings) {
34225
- <div class="advanced-render-settings">
34226
- <div class="setting-part-container">
34227
- @if (renderService.serverData.renderMode === renderModes.RenderRoom) {
34228
- <mat-form-field
34229
- class="face-select-form"
34230
- >
34231
- <mat-label>{{ "ENVIRONMENT" | localize }}</mat-label>
34232
- <mat-select [(ngModel)]="selectedRenderScene" (selectionChange)="updateBlenderSceneSettings($event)">
34233
- @for (scene of sceneList; track scene) {
34234
- <mat-option
34235
- [value]="scene">{{ scene.name }}
34236
- </mat-option>
34237
- }
34238
- </mat-select>
34239
- </mat-form-field>
33868
+ <div class="render-container">
33869
+ @if (startUploading) {
33870
+ <rp-render-progress></rp-render-progress>
33871
+ }
33872
+ <!-- the Yellow render indicators -->
33873
+ @if (inPictureMode) {
33874
+ <div class="render-indicators">
33875
+ <div class="render-indicator-top-left"></div>
33876
+ <div class="render-indicator-top-right"></div>
33877
+ <div class="render-indicator-bottom-left"></div>
33878
+ <div class="render-indicator-bottom-right"></div>
33879
+ </div>
33880
+ <div class="render-popup-container">
33881
+ <div class="render-popup-header">
33882
+ <h3>
33883
+ <span>{{ 'PICTURE_MODE' | localize }}</span>
33884
+ @if (hasError) {
33885
+ <co-icon class="renderErrorIcon" [iconData]="iconService.getIcon(icons.TriangleExclamation)"
33886
+ [matTooltip]="'BLENDER_RENDER_ERROR' | localize"></co-icon>
33887
+ }
33888
+ </h3>
33889
+ <button
33890
+ class="close-popup-container"
33891
+ (click)="resetBlenderRenderScene()">
33892
+ <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
33893
+ </button>
33894
+ </div>
33895
+ <div class="render-popup-preview">
33896
+ @if (blenderPreviewRender) {
33897
+ <img [src]="blenderPreviewRender" alt="">
34240
33898
  }
34241
- </div>
34242
- <div class="setting-part-container">
34243
- <mat-form-field class="third-width">
34244
- <mat-label [textContent]="'ENVIRONMENT_LIGHT' | localize"></mat-label>
34245
- <input
34246
- [type]="'number'"
34247
- matInput
34248
- [(ngModel)]="hdriIntensity"
34249
- (ngModelChange)="hdriIntensity = +$event">
34250
- </mat-form-field>
34251
- <div class="setting-part-buttons">
34252
- <button class="amount-button" (click)="hdriIntensity = +hdriIntensity - 1">
34253
- <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
34254
- </button>
34255
- <button class="amount-button" (click)="hdriIntensity = +hdriIntensity + 1">
34256
- <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
34257
- </button>
34258
- </div>
34259
- <div class="setting-part-slider">
34260
- <mat-slider class="value" min="1" max="20" step="1" [(ngModel)]="hdriIntensity"></mat-slider>
34261
- </div>
34262
- </div>
34263
- <div class="setting-part-container">
34264
- <mat-form-field class="third-width">
34265
- <mat-label [textContent]="'ROTATION' | localize"></mat-label>
34266
- <input
34267
- [type]="'number'"
34268
- matInput
34269
- [(ngModel)]="hdriRotation"
34270
- (ngModelChange)="hdriRotation = +$event">
34271
- </mat-form-field>
34272
- <div class="setting-part-buttons">
34273
- <button class="amount-button" (click)="hdriRotation = +hdriRotation - 1">
34274
- <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
34275
- </button>
34276
- <button class="amount-button" (click)="hdriRotation = +hdriRotation + 1">
34277
- <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
34278
- </button>
34279
- </div>
34280
- <div class="setting-part-slider">
34281
- <mat-slider class="value" min="0" max="360" step="1" [(ngModel)]="hdriRotation"></mat-slider>
33899
+ @if (!blenderPreviewRender) {
33900
+ <div class="render-popup-preview-placeholder">
33901
+ <span>{{ 'PREVIEW' | localize }}</span>
34282
33902
  </div>
34283
- </div>
34284
- <div class="setting-part-container">
34285
- <mat-form-field class="third-width">
34286
- <mat-label [textContent]="'LIGHTS' | localize"></mat-label>
34287
- <input
34288
- [type]="'number'"
34289
- matInput
34290
- [(ngModel)]="lightingExposure"
34291
- (ngModelChange)="lightingExposure = +$event">
34292
- </mat-form-field>
34293
- <div class="setting-part-buttons">
34294
- <button class="amount-button" (click)="lightingExposure = +lightingExposure - 1">
34295
- <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
34296
- </button>
34297
- <button class="amount-button" (click)="lightingExposure = +lightingExposure + 1">
34298
- <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
34299
- </button>
34300
- </div>
34301
- <div class="setting-part-slider">
34302
- <mat-slider class="value" min="1" max="10" step="1" [(ngModel)]="lightingExposure"></mat-slider>
34303
- </div>
34304
- </div>
34305
- </div>
34306
33903
  }
34307
- </div>
33904
+ <button class="render-popup-refresh-preview" (click)="createBlenderRender(true)">
33905
+ <co-icon [iconData]="iconService.getIcon(icons.RetryButton)"></co-icon>
33906
+ </button>
33907
+ </div>
33908
+ @if (renderService.blendFilesRender) {
33909
+ <div class="render-popup-dropdown">
33910
+ <div class="toggleable" (click)="toggleRenderSettings()">
33911
+ <p>
33912
+ @if (!showRenderSettings) {
33913
+ <span [textContent]="'RENDER_ADVANCED_SETTINGS_SHOW' | localize"></span>
33914
+ }
33915
+ @if (showRenderSettings) {
33916
+ <span [textContent]="'RENDER_ADVANCED_SETTINGS_HIDE' | localize"></span>
33917
+ }
33918
+ </p>
33919
+ <co-icon [ngClass]="{'icon-rotate': showRenderSettings}"
33920
+ [iconData]="iconService.getIcon(icons.ArrowPointDown)"></co-icon>
33921
+ </div>
33922
+ @if (showRenderSettings) {
33923
+ <div class="advanced-render-settings">
33924
+ <div class="setting-part-container">
33925
+ <mat-form-field
33926
+ class="face-select-form"
33927
+ >
33928
+ <mat-label>{{ "ENVIRONMENT" | localize }}</mat-label>
33929
+ <mat-select [(ngModel)]="selectedRenderScene" (selectionChange)="updateBlenderSceneSettings($event)">
33930
+ @for (scene of sceneList; track scene) {
33931
+ <mat-option
33932
+ [value]="scene">{{ scene.name }}
33933
+ </mat-option>
33934
+ }
33935
+ </mat-select>
33936
+ </mat-form-field>
33937
+ </div>
33938
+ <div class="setting-part-container">
33939
+ <mat-form-field class="third-width">
33940
+ <mat-label [textContent]="'ENVIRONMENT_LIGHT' | localize"></mat-label>
33941
+ <input
33942
+ [type]="'number'"
33943
+ matInput
33944
+ [(ngModel)]="hdriIntensity"
33945
+ (ngModelChange)="hdriIntensity = +$event">
33946
+ </mat-form-field>
33947
+ <div class="setting-part-buttons">
33948
+ <button class="amount-button" (click)="hdriIntensity = +hdriIntensity - 1">
33949
+ <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
33950
+ </button>
33951
+ <button class="amount-button" (click)="hdriIntensity = +hdriIntensity + 1">
33952
+ <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
33953
+ </button>
33954
+ </div>
33955
+ <div class="setting-part-slider">
33956
+ <mat-slider class="value" min="1" max="20" step="1" [(ngModel)]="hdriIntensity"></mat-slider>
33957
+ </div>
33958
+ </div>
33959
+ <div class="setting-part-container">
33960
+ <mat-form-field class="third-width">
33961
+ <mat-label [textContent]="'ROTATION' | localize"></mat-label>
33962
+ <input
33963
+ [type]="'number'"
33964
+ matInput
33965
+ [(ngModel)]="hdriRotation"
33966
+ (ngModelChange)="hdriRotation = +$event">
33967
+ </mat-form-field>
33968
+ <div class="setting-part-buttons">
33969
+ <button class="amount-button" (click)="hdriRotation = +hdriRotation - 1">
33970
+ <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
33971
+ </button>
33972
+ <button class="amount-button" (click)="hdriRotation = +hdriRotation + 1">
33973
+ <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
33974
+ </button>
33975
+ </div>
33976
+ <div class="setting-part-slider">
33977
+ <mat-slider class="value" min="0" max="360" step="1" [(ngModel)]="hdriRotation"></mat-slider>
33978
+ </div>
33979
+ </div>
33980
+ <div class="setting-part-container">
33981
+ <mat-form-field class="third-width">
33982
+ <mat-label [textContent]="'LIGHTS' | localize"></mat-label>
33983
+ <input
33984
+ [type]="'number'"
33985
+ matInput
33986
+ [(ngModel)]="lightingExposure"
33987
+ (ngModelChange)="lightingExposure = +$event">
33988
+ </mat-form-field>
33989
+ <div class="setting-part-buttons">
33990
+ <button class="amount-button" (click)="lightingExposure = +lightingExposure - 1">
33991
+ <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
33992
+ </button>
33993
+ <button class="amount-button" (click)="lightingExposure = +lightingExposure + 1">
33994
+ <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
33995
+ </button>
33996
+ </div>
33997
+ <div class="setting-part-slider">
33998
+ <mat-slider class="value" min="1" max="10" step="1" [(ngModel)]="lightingExposure"></mat-slider>
33999
+ </div>
34000
+ </div>
34001
+ </div>
34002
+ }
34003
+ </div>
34308
34004
  }
34309
- @if (renderService.serverData.renderMode === renderModes.RenderRoom) {
34310
- <div class="render-popup-dropdown">
34005
+ <div class="render-popup-dropdown">
34311
34006
  <mat-form-field class="face-select-form">
34312
- <mat-label>{{ "IMAGE_SIZE" | localize }}</mat-label>
34313
- <mat-select [(ngModel)]="renderService.selectedImageSize">
34314
- @for (size of renderService.imageSizes; track size) {
34315
- <mat-option [value]="size.id">{{ size.name }} {{ size.width }}
34316
- x{{ size.height }}
34317
- </mat-option>
34318
- }
34319
- </mat-select>
34007
+ <mat-label>{{ "IMAGE_SIZE" | localize }}</mat-label>
34008
+ <mat-select [(value)]="selectedImageSize">
34009
+ @for (size of imageSizes; track size) {
34010
+ <mat-option [value]="size">{{ size.name }} {{ size.width }}
34011
+ x{{ size.height }}
34012
+ </mat-option>
34013
+ }
34014
+ </mat-select>
34320
34015
  </mat-form-field>
34321
- </div>
34322
- }
34016
+ </div>
34323
34017
  <div class="render-popup-button-container">
34324
- <button class="render-popup-button photo-button"
34325
- (click)="createBlenderRender()"
34326
- title="{{'MAKE_A_PICTURE' | localize}}"
34327
- [disabled]="disablePictureButton">
34328
- <co-icon [iconData]="iconService.getIcon(icons.CircleCheck)"></co-icon>
34329
- {{ 'MAKE_A_PICTURE' | localize }}
34330
- </button>
34331
- <button
34332
- class="render-popup-button cancel-button"
34333
- (click)="resetBlenderRenderScene()">
34334
- <co-icon [iconData]="iconService.getIcon(icons.CircleXmark)"></co-icon>
34335
- {{ 'CLOSE_PHOTO_MODE' | localize }}
34336
- </button>
34018
+ <button class="render-popup-button photo-button"
34019
+ (click)="createBlenderRender()"
34020
+ title="{{'MAKE_A_PICTURE' | localize}}"
34021
+ [disabled]="disablePictureButton">
34022
+ <co-icon [iconData]="iconService.getIcon(icons.CircleCheck)"></co-icon>
34023
+ {{ 'MAKE_A_PICTURE' | localize }}
34024
+ </button>
34025
+ <button
34026
+ class="render-popup-button cancel-button"
34027
+ (click)="resetBlenderRenderScene()">
34028
+ <co-icon [iconData]="iconService.getIcon(icons.CircleXmark)"></co-icon>
34029
+ {{ 'CLOSE_PHOTO_MODE' | localize }}
34030
+ </button>
34337
34031
  </div>
34338
- </div>
34339
- }
34340
- @if (showCullingErrorDialog) {
34341
- <div class="render-warning">
34032
+ </div>
34033
+ }
34034
+ @if (showCullingErrorDialog) {
34035
+ <div class="render-warning">
34342
34036
  <div class="render-warming-header">
34343
- <h2>{{ 'BLENDER_RENDER_ERROR_TITLE' | localize }}</h2>
34344
- <div class="render-warning-close" (click)="showCullingErrorDialog = false">
34345
- <mat-icon class="homedecorator-material-icons">cancel</mat-icon>
34346
- </div>
34037
+ <h2>{{ 'BLENDER_RENDER_ERROR_TITLE' | localize }}</h2>
34038
+ <div class="render-warning-close" (click)="showCullingErrorDialog = false">
34039
+ <mat-icon class="homedecorator-material-icons">cancel</mat-icon>
34040
+ </div>
34347
34041
  </div>
34348
34042
  <div class="render-warning-body">
34349
- <p>{{ 'BLENDER_RENDER_WARNING_CULLING' | localize }}</p>
34043
+ <p>{{ 'BLENDER_RENDER_WARNING_CULLING' | localize }}</p>
34350
34044
  </div>
34351
34045
  <div class="render-warning-footer">
34352
- <button
34353
- class="render-popup-button cancel-button"
34354
- (click)="showCullingErrorDialog = false">
34355
- <co-icon [iconData]="iconService.getIcon(icons.CircleXmark)"></co-icon>
34356
- {{ 'CLOSE' | localize }}
34357
- </button>
34046
+ <button
34047
+ class="render-popup-button cancel-button"
34048
+ (click)="showCullingErrorDialog = false">
34049
+ <co-icon [iconData]="iconService.getIcon(icons.CircleXmark)"></co-icon>
34050
+ {{ 'CLOSE' | localize }}
34051
+ </button>
34358
34052
  </div>
34359
- </div>
34360
- }
34361
- <rp-render-progress
34362
- [title]="'PREPARE_TO_RENDER' | localize"
34363
- [show]="startUploading"
34364
- >
34365
- </rp-render-progress>
34366
- <button
34367
- #renderButton
34368
- mat-raised-button
34369
- matTooltip="{{'RENDER_TAKE_A_PICTURE' | localize}}"
34370
- [id]="'standalone_render_picture'"
34371
- [class.active]="(
34372
- (renderService.serverData.renderMode === renderService.renderModes.RenderRoom && viewModeService.viewMode === viewModes.WalkThrough) ||
34373
- (renderService.serverData.renderMode === renderService.renderModes.RenderIone))"
34374
- (click)="showRenderForm($event)"
34375
- >
34376
- <mat-icon class="icon homedecorator-material-icons"
34377
- aria-hidden="true">{{ (renderService.currentQueueRenderItem.renderStatus === renderStatus.IsRunning ? 'open_in_browser' : 'photo_camera') }}
34378
- </mat-icon>
34379
- </button>
34380
- </div>
34053
+ </div>
34381
34054
  }
34382
-
34383
- `, isInline: true, styles: [".render-container{position:relative}.render-container .render-popup-container{background:#ffffffb3;padding:10px 25px 25px;border-radius:5px;box-shadow:0 1px 5px #0000001f}.render-container .render-popup-container .render-popup-header{display:flex;justify-content:space-between;font-family:inherit}.render-container .render-popup-container .render-popup-header h3{display:flex;justify-content:space-between}.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon{width:20px;height:20px;margin-left:20px}.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon svg,.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon svg polygon{fill:#dc143c}.render-container .render-popup-container .render-popup-header .close-popup-container{cursor:pointer;border:none;background:none;float:none;height:auto;width:auto}.render-container .render-popup-container .render-popup-button-container{display:flex;justify-content:space-between;font-family:inherit}.render-container .render-popup-container .render-popup-button-container .render-popup-button{float:none;width:100%;max-width:130px;border-radius:3px;cursor:pointer;border:none;display:flex;height:40px;align-items:center;justify-content:space-evenly}.render-container .render-popup-container .render-popup-button-container .render-popup-button ::ng-deep co-icon{display:inline-block;height:18px;width:18px}.render-container .render-popup-container .render-popup-button-container .render-popup-button ::ng-deep co-icon svg path{fill:#fff}.render-container .render-popup-container .render-popup-button-container .photo-button{color:#fff;background-color:#dda73f}.render-container .render-popup-container .render-popup-button-container .cancel-button{color:#fff;background-color:#5b6875}.render-container .render-popup-container .render-popup-preview{background-color:#fff;min-height:150px;min-width:275px;margin:5px 0;position:relative;width:275px;height:150px}.render-container .render-popup-container .render-popup-preview .render-popup-preview-placeholder{background-color:#fff;display:flex;justify-content:space-around;align-items:center;vertical-align:middle;min-height:150px;border:1px solid #ddd;color:#ddd;font-size:14px}.render-container .render-popup-container .render-popup-preview .render-popup-refresh-preview{position:absolute;bottom:0;right:0;cursor:pointer;border-radius:0;border:none;height:30px;width:30px;background-color:#dda73f;color:#fff;margin:0}.render-container .render-popup-container .render-popup-preview .render-popup-refresh-preview ::ng-deep co-icon svg path{fill:#fff}.render-container .render-popup-container .render-popup-dropdown{margin:5px 0;width:100%}.render-container .render-popup-container .render-popup-dropdown .toggleable{cursor:pointer;display:flex;justify-content:right;align-content:center}.render-container .render-popup-container .render-popup-dropdown .toggleable p{padding:0;margin:0;font-size:12px;line-height:30px}.render-container .render-popup-container .render-popup-dropdown .toggleable .icon-rotate{transform:rotate(180deg)}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field{width:100%;font-size:14px}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-flex{background-color:#fff;color:#000;padding:3px 6px;border:1px solid #ddd}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-underline{display:none}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-wrapper{padding-bottom:0}.render-container .render-popup-container .render-popup-dropdown .setting-part-container{display:flex;justify-content:space-between;align-items:center;margin-bottom:5px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .third-width{width:32%}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button{float:none;box-sizing:border-box;padding:2px;background:none;cursor:pointer;border:none;width:25px;height:25px;margin:0 5px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button co-icon{display:block;width:25px;height:25px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button co-icon ::ng-deep svg{fill:#5b6875}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-slider .mat-slider-horizontal{min-width:110px;height:28px}.render-container .render-progress{float:left;min-width:50px;border-radius:25px;line-height:50px;text-align:center;padding:0 60px 0 20px;background:#fff;color:#74b77f;font-weight:700;margin:0 -50px 0 0}.render-container .render-input-container{float:right}.render-container .render-input-container input{width:100px;height:24px;margin:5px 0;padding:0 10px;font-size:14px}.render-container button{pointer-events:all;width:50px;height:50px;float:right;border-radius:100%;position:relative;z-index:2;margin-bottom:10px}.render-container button.active{background:#74b77f;color:#fff}.render-container button>*{pointer-events:none}.render-indicators div{position:fixed;width:100px;height:100px}.render-indicators .render-indicator-top-left{left:5vw;top:10vh;border-left:10px solid #dda73f;border-top:10px solid #dda73f;border-top-left-radius:20px}.render-indicators .render-indicator-top-right{right:5vw;top:10vh;border-right:10px solid #dda73f;border-top:10px solid #dda73f;border-top-right-radius:20px}.render-indicators .render-indicator-bottom-left{left:5vw;bottom:5vh;border-left:10px solid #dda73f;border-bottom:10px solid #dda73f;border-bottom-left-radius:20px}.render-indicators .render-indicator-bottom-right{right:5vw;bottom:5vh;border-right:10px solid #dda73f;border-bottom:10px solid #dda73f;border-bottom-right-radius:20px}.render-warning{width:500px;position:fixed;top:20%;left:calc(50% - 250px);border-radius:15px;box-sizing:border-box;background-color:#fff;box-shadow:1px 0 20px #0000001f}.render-warning .render-warming-header{display:flex;justify-content:space-between;border-bottom:1px solid #c5c3c6;padding:20px 20px 10px;align-items:center}.render-warning .render-warming-header h2{padding:0;margin:0}.render-warning .render-warming-header .render-warning-close mat-icon{fill:#c5c3c6;color:#c5c3c6;cursor:pointer;transition:all .2s ease}.render-warning .render-warming-header .render-warning-close:hover mat-icon{fill:#46494c;color:#46494c}.render-warning .render-warning-body{padding:10px 20px}.render-warning .render-warning-footer{display:flex;justify-content:center;padding:0 20px 10px}.render-warning .render-warning-footer .render-popup-button{float:none;width:110px;border-radius:3px;cursor:pointer;border:none;display:flex;height:40px;align-items:center;justify-content:space-evenly;color:#fff;background-color:#5b6875}.render-warning .render-warning-footer .render-popup-button ::ng-deep co-icon{display:inline-block;height:18px;width:18px}.render-warning .render-warning-footer .render-popup-button ::ng-deep co-icon svg path{fill:#fff}\n"], dependencies: [{ kind: "directive", type: i2$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i2$3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i2$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$3.MatLabel, selector: "mat-label" }, { kind: "component", type: i3$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: i3$3.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "component", type: RenderProgressComponent, selector: "rp-render-progress", inputs: ["show", "title"] }, { kind: "pipe", type: LocalizePipe, name: "localize" }] }); }
34055
+ <button
34056
+ #renderButton
34057
+ mat-raised-button
34058
+ matTooltip="{{'RENDER_TAKE_A_PICTURE' | localize}}"
34059
+ [id]="'standalone_render_picture'"
34060
+ [class.active]="viewModeService.viewMode === viewModes.WalkThrough"
34061
+ (click)="showRenderForm($event)">
34062
+ <mat-icon class="icon homedecorator-material-icons"
34063
+ aria-hidden="true">{{ 'photo_camera' }}
34064
+ </mat-icon>
34065
+ </button>
34066
+ </div>
34067
+ `, isInline: true, styles: [".render-container{position:relative}.render-container .render-popup-container{background:#ffffffb3;padding:10px 25px 25px;border-radius:5px;box-shadow:0 1px 5px #0000001f}.render-container .render-popup-container .render-popup-header{display:flex;justify-content:space-between;font-family:inherit}.render-container .render-popup-container .render-popup-header h3{display:flex;justify-content:space-between}.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon{width:20px;height:20px;margin-left:20px}.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon svg,.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon svg polygon{fill:#dc143c}.render-container .render-popup-container .render-popup-header .close-popup-container{cursor:pointer;border:none;background:none;float:none;height:auto;width:auto}.render-container .render-popup-container .render-popup-button-container{display:flex;justify-content:space-between;font-family:inherit}.render-container .render-popup-container .render-popup-button-container .render-popup-button{float:none;width:100%;max-width:130px;border-radius:3px;cursor:pointer;border:none;display:flex;height:40px;align-items:center;justify-content:space-evenly}.render-container .render-popup-container .render-popup-button-container .render-popup-button ::ng-deep co-icon{display:inline-block;height:18px;width:18px}.render-container .render-popup-container .render-popup-button-container .render-popup-button ::ng-deep co-icon svg path{fill:#fff}.render-container .render-popup-container .render-popup-button-container .photo-button{color:#fff;background-color:#dda73f}.render-container .render-popup-container .render-popup-button-container .cancel-button{color:#fff;background-color:#5b6875}.render-container .render-popup-container .render-popup-preview{background-color:#fff;min-height:150px;min-width:275px;margin:5px 0;position:relative;width:275px;height:150px}.render-container .render-popup-container .render-popup-preview .render-popup-preview-placeholder{background-color:#fff;display:flex;justify-content:space-around;align-items:center;vertical-align:middle;min-height:150px;border:1px solid #ddd;color:#ddd;font-size:14px}.render-container .render-popup-container .render-popup-preview .render-popup-refresh-preview{position:absolute;bottom:0;right:0;cursor:pointer;border-radius:0;border:none;height:30px;width:30px;background-color:#dda73f;color:#fff;margin:0}.render-container .render-popup-container .render-popup-preview .render-popup-refresh-preview ::ng-deep co-icon svg path{fill:#fff}.render-container .render-popup-container .render-popup-dropdown{margin:5px 0;width:100%}.render-container .render-popup-container .render-popup-dropdown .toggleable{cursor:pointer;display:flex;justify-content:right;align-content:center}.render-container .render-popup-container .render-popup-dropdown .toggleable p{padding:0;margin:0;font-size:12px;line-height:30px}.render-container .render-popup-container .render-popup-dropdown .toggleable .icon-rotate{transform:rotate(180deg)}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field{width:100%;font-size:14px}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-flex{background-color:#fff;color:#000;padding:3px 6px;border:1px solid #ddd}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-underline{display:none}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-wrapper{padding-bottom:0}.render-container .render-popup-container .render-popup-dropdown .setting-part-container{display:flex;justify-content:space-between;align-items:center;margin-bottom:5px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .third-width{width:32%}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button{float:none;box-sizing:border-box;padding:2px;background:none;cursor:pointer;border:none;width:25px;height:25px;margin:0 5px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button co-icon{display:block;width:25px;height:25px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button co-icon ::ng-deep svg{fill:#5b6875}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-slider .mat-slider-horizontal{min-width:110px;height:28px}.render-container .render-progress{float:left;min-width:50px;border-radius:25px;line-height:50px;text-align:center;padding:0 60px 0 20px;background:#fff;color:#74b77f;font-weight:700;margin:0 -50px 0 0}.render-container .render-input-container{float:right}.render-container .render-input-container input{width:100px;height:24px;margin:5px 0;padding:0 10px;font-size:14px}.render-container button{pointer-events:all;width:50px;height:50px;float:right;border-radius:100%;position:relative;z-index:2;margin-bottom:10px}.render-container button.active{background:#74b77f;color:#fff}.render-container button>*{pointer-events:none}.render-indicators div{position:fixed;width:100px;height:100px}.render-indicators .render-indicator-top-left{left:5vw;top:10vh;border-left:10px solid #dda73f;border-top:10px solid #dda73f;border-top-left-radius:20px}.render-indicators .render-indicator-top-right{right:5vw;top:10vh;border-right:10px solid #dda73f;border-top:10px solid #dda73f;border-top-right-radius:20px}.render-indicators .render-indicator-bottom-left{left:5vw;bottom:5vh;border-left:10px solid #dda73f;border-bottom:10px solid #dda73f;border-bottom-left-radius:20px}.render-indicators .render-indicator-bottom-right{right:5vw;bottom:5vh;border-right:10px solid #dda73f;border-bottom:10px solid #dda73f;border-bottom-right-radius:20px}.render-warning{width:500px;position:fixed;top:20%;left:calc(50% - 250px);border-radius:15px;box-sizing:border-box;background-color:#fff;box-shadow:1px 0 20px #0000001f}.render-warning .render-warming-header{display:flex;justify-content:space-between;border-bottom:1px solid #c5c3c6;padding:20px 20px 10px;align-items:center}.render-warning .render-warming-header h2{padding:0;margin:0}.render-warning .render-warming-header .render-warning-close mat-icon{fill:#c5c3c6;color:#c5c3c6;cursor:pointer;transition:all .2s ease}.render-warning .render-warming-header .render-warning-close:hover mat-icon{fill:#46494c;color:#46494c}.render-warning .render-warning-body{padding:10px 20px}.render-warning .render-warning-footer{display:flex;justify-content:center;padding:0 20px 10px}.render-warning .render-warning-footer .render-popup-button{float:none;width:110px;border-radius:3px;cursor:pointer;border:none;display:flex;height:40px;align-items:center;justify-content:space-evenly;color:#fff;background-color:#5b6875}.render-warning .render-warning-footer .render-popup-button ::ng-deep co-icon{display:inline-block;height:18px;width:18px}.render-warning .render-warning-footer .render-popup-button ::ng-deep co-icon svg path{fill:#fff}\n"], dependencies: [{ kind: "directive", type: i2$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i2$3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i2$3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$3.MatLabel, selector: "mat-label" }, { kind: "component", type: i3$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i3$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: i3$3.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "component", type: RenderProgressComponent, selector: "rp-render-progress" }, { kind: "pipe", type: LocalizePipe, name: "localize" }] }); }
34384
34068
  }
34385
34069
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RenderControlsComponent, decorators: [{
34386
34070
  type: Component,
34387
34071
  args: [{ selector: 'rp-render-controls', template: `
34388
- @if (renderService.serverData && renderService.serverData.renderMode !== renderService.renderModes.RenderShop) {
34389
- <div class="render-container"
34390
- >
34391
- @if (renderService.currentQueueRenderItem.renderStatus === renderStatus.IsRunning || renderService.currentQueueRenderItem.renderStatus === renderStatus.IsSuccess) {
34392
- <div class="render-progress"
34393
- >
34394
- {{ (renderService.currentQueueRenderItem.renderStatus === renderStatus.IsSuccess && renderService.currentQueueRenderItem.renderProgress === 100 ? "RENDER_READY" : "") | localize }}
34395
- {{ (renderService.currentQueueRenderItem.renderStatus === renderStatus.IsSuccess && renderService.currentQueueRenderItem.renderProgress !== 100 ? "RENDER_STOPPED" : "") | localize }}
34396
- {{ (renderService.currentQueueRenderItem.renderStatus === renderStatus.IsRunning) ? renderService.currentQueueRenderItem.renderProgress + "%" : "" }}
34397
- </div>
34398
- }
34399
- <!-- the Yellow render indicators -->
34400
- @if (inPictureMode) {
34401
- <div class="render-indicators">
34402
- <div class="render-indicator-top-left"></div>
34403
- <div class="render-indicator-top-right"></div>
34404
- <div class="render-indicator-bottom-left"></div>
34405
- <div class="render-indicator-bottom-right"></div>
34406
- </div>
34407
- }
34408
- @if (inPictureMode) {
34409
- <div class="render-popup-container">
34410
- <div class="render-popup-header">
34411
- <h3>
34412
- <span>{{ 'PICTURE_MODE' | localize }}</span>
34413
- @if (hasError) {
34414
- <co-icon class="renderErrorIcon" [iconData]="iconService.getIcon(icons.TriangleExclamation)"
34415
- [matTooltip]="'BLENDER_RENDER_ERROR' | localize"></co-icon>
34416
- }
34417
- </h3>
34418
- <button
34419
- class="close-popup-container"
34420
- (click)="resetBlenderRenderScene()">
34421
- <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
34422
- </button>
34423
- </div>
34424
- <div class="render-popup-preview">
34425
- @if (blenderPreviewRender) {
34426
- <img [src]="blenderPreviewRender" alt="">
34427
- }
34428
- @if (!blenderPreviewRender) {
34429
- <div class="render-popup-preview-placeholder">
34430
- <span>{{ 'PREVIEW' | localize }}</span>
34431
- </div>
34432
- }
34433
- <button
34434
- class="render-popup-refresh-preview"
34435
- (click)="createPreviewRender()"
34436
- >
34437
- <co-icon [iconData]="iconService.getIcon(icons.RetryButton)"></co-icon>
34438
- </button>
34439
- </div>
34440
- @if (renderService.blendFilesRender) {
34441
- <div class="render-popup-dropdown">
34442
- <div class="toggleable" (click)="toggleRenderSettings()">
34443
- <p>
34444
- @if (!showRenderSettings) {
34445
- <span [textContent]="'RENDER_ADVANCED_SETTINGS_SHOW' | localize"></span>
34446
- }
34447
- @if (showRenderSettings) {
34448
- <span [textContent]="'RENDER_ADVANCED_SETTINGS_HIDE' | localize"></span>
34449
- }
34450
- </p>
34451
- <co-icon [ngClass]="{'icon-rotate': showRenderSettings}"
34452
- [iconData]="iconService.getIcon(icons.ArrowPointDown)"></co-icon>
34453
- </div>
34454
- @if (showRenderSettings) {
34455
- <div class="advanced-render-settings">
34456
- <div class="setting-part-container">
34457
- @if (renderService.serverData.renderMode === renderModes.RenderRoom) {
34458
- <mat-form-field
34459
- class="face-select-form"
34460
- >
34461
- <mat-label>{{ "ENVIRONMENT" | localize }}</mat-label>
34462
- <mat-select [(ngModel)]="selectedRenderScene" (selectionChange)="updateBlenderSceneSettings($event)">
34463
- @for (scene of sceneList; track scene) {
34464
- <mat-option
34465
- [value]="scene">{{ scene.name }}
34466
- </mat-option>
34467
- }
34468
- </mat-select>
34469
- </mat-form-field>
34072
+ <div class="render-container">
34073
+ @if (startUploading) {
34074
+ <rp-render-progress></rp-render-progress>
34075
+ }
34076
+ <!-- the Yellow render indicators -->
34077
+ @if (inPictureMode) {
34078
+ <div class="render-indicators">
34079
+ <div class="render-indicator-top-left"></div>
34080
+ <div class="render-indicator-top-right"></div>
34081
+ <div class="render-indicator-bottom-left"></div>
34082
+ <div class="render-indicator-bottom-right"></div>
34083
+ </div>
34084
+ <div class="render-popup-container">
34085
+ <div class="render-popup-header">
34086
+ <h3>
34087
+ <span>{{ 'PICTURE_MODE' | localize }}</span>
34088
+ @if (hasError) {
34089
+ <co-icon class="renderErrorIcon" [iconData]="iconService.getIcon(icons.TriangleExclamation)"
34090
+ [matTooltip]="'BLENDER_RENDER_ERROR' | localize"></co-icon>
34091
+ }
34092
+ </h3>
34093
+ <button
34094
+ class="close-popup-container"
34095
+ (click)="resetBlenderRenderScene()">
34096
+ <co-icon [iconData]="iconService.getIcon(icons.Cross)"></co-icon>
34097
+ </button>
34098
+ </div>
34099
+ <div class="render-popup-preview">
34100
+ @if (blenderPreviewRender) {
34101
+ <img [src]="blenderPreviewRender" alt="">
34470
34102
  }
34471
- </div>
34472
- <div class="setting-part-container">
34473
- <mat-form-field class="third-width">
34474
- <mat-label [textContent]="'ENVIRONMENT_LIGHT' | localize"></mat-label>
34475
- <input
34476
- [type]="'number'"
34477
- matInput
34478
- [(ngModel)]="hdriIntensity"
34479
- (ngModelChange)="hdriIntensity = +$event">
34480
- </mat-form-field>
34481
- <div class="setting-part-buttons">
34482
- <button class="amount-button" (click)="hdriIntensity = +hdriIntensity - 1">
34483
- <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
34484
- </button>
34485
- <button class="amount-button" (click)="hdriIntensity = +hdriIntensity + 1">
34486
- <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
34487
- </button>
34488
- </div>
34489
- <div class="setting-part-slider">
34490
- <mat-slider class="value" min="1" max="20" step="1" [(ngModel)]="hdriIntensity"></mat-slider>
34491
- </div>
34492
- </div>
34493
- <div class="setting-part-container">
34494
- <mat-form-field class="third-width">
34495
- <mat-label [textContent]="'ROTATION' | localize"></mat-label>
34496
- <input
34497
- [type]="'number'"
34498
- matInput
34499
- [(ngModel)]="hdriRotation"
34500
- (ngModelChange)="hdriRotation = +$event">
34501
- </mat-form-field>
34502
- <div class="setting-part-buttons">
34503
- <button class="amount-button" (click)="hdriRotation = +hdriRotation - 1">
34504
- <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
34505
- </button>
34506
- <button class="amount-button" (click)="hdriRotation = +hdriRotation + 1">
34507
- <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
34508
- </button>
34509
- </div>
34510
- <div class="setting-part-slider">
34511
- <mat-slider class="value" min="0" max="360" step="1" [(ngModel)]="hdriRotation"></mat-slider>
34512
- </div>
34513
- </div>
34514
- <div class="setting-part-container">
34515
- <mat-form-field class="third-width">
34516
- <mat-label [textContent]="'LIGHTS' | localize"></mat-label>
34517
- <input
34518
- [type]="'number'"
34519
- matInput
34520
- [(ngModel)]="lightingExposure"
34521
- (ngModelChange)="lightingExposure = +$event">
34522
- </mat-form-field>
34523
- <div class="setting-part-buttons">
34524
- <button class="amount-button" (click)="lightingExposure = +lightingExposure - 1">
34525
- <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
34526
- </button>
34527
- <button class="amount-button" (click)="lightingExposure = +lightingExposure + 1">
34528
- <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
34529
- </button>
34530
- </div>
34531
- <div class="setting-part-slider">
34532
- <mat-slider class="value" min="1" max="10" step="1" [(ngModel)]="lightingExposure"></mat-slider>
34533
- </div>
34103
+ @if (!blenderPreviewRender) {
34104
+ <div class="render-popup-preview-placeholder">
34105
+ <span>{{ 'PREVIEW' | localize }}</span>
34534
34106
  </div>
34535
- </div>
34536
34107
  }
34537
- </div>
34108
+ <button class="render-popup-refresh-preview" (click)="createBlenderRender(true)">
34109
+ <co-icon [iconData]="iconService.getIcon(icons.RetryButton)"></co-icon>
34110
+ </button>
34111
+ </div>
34112
+ @if (renderService.blendFilesRender) {
34113
+ <div class="render-popup-dropdown">
34114
+ <div class="toggleable" (click)="toggleRenderSettings()">
34115
+ <p>
34116
+ @if (!showRenderSettings) {
34117
+ <span [textContent]="'RENDER_ADVANCED_SETTINGS_SHOW' | localize"></span>
34118
+ }
34119
+ @if (showRenderSettings) {
34120
+ <span [textContent]="'RENDER_ADVANCED_SETTINGS_HIDE' | localize"></span>
34121
+ }
34122
+ </p>
34123
+ <co-icon [ngClass]="{'icon-rotate': showRenderSettings}"
34124
+ [iconData]="iconService.getIcon(icons.ArrowPointDown)"></co-icon>
34125
+ </div>
34126
+ @if (showRenderSettings) {
34127
+ <div class="advanced-render-settings">
34128
+ <div class="setting-part-container">
34129
+ <mat-form-field
34130
+ class="face-select-form"
34131
+ >
34132
+ <mat-label>{{ "ENVIRONMENT" | localize }}</mat-label>
34133
+ <mat-select [(ngModel)]="selectedRenderScene" (selectionChange)="updateBlenderSceneSettings($event)">
34134
+ @for (scene of sceneList; track scene) {
34135
+ <mat-option
34136
+ [value]="scene">{{ scene.name }}
34137
+ </mat-option>
34138
+ }
34139
+ </mat-select>
34140
+ </mat-form-field>
34141
+ </div>
34142
+ <div class="setting-part-container">
34143
+ <mat-form-field class="third-width">
34144
+ <mat-label [textContent]="'ENVIRONMENT_LIGHT' | localize"></mat-label>
34145
+ <input
34146
+ [type]="'number'"
34147
+ matInput
34148
+ [(ngModel)]="hdriIntensity"
34149
+ (ngModelChange)="hdriIntensity = +$event">
34150
+ </mat-form-field>
34151
+ <div class="setting-part-buttons">
34152
+ <button class="amount-button" (click)="hdriIntensity = +hdriIntensity - 1">
34153
+ <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
34154
+ </button>
34155
+ <button class="amount-button" (click)="hdriIntensity = +hdriIntensity + 1">
34156
+ <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
34157
+ </button>
34158
+ </div>
34159
+ <div class="setting-part-slider">
34160
+ <mat-slider class="value" min="1" max="20" step="1" [(ngModel)]="hdriIntensity"></mat-slider>
34161
+ </div>
34162
+ </div>
34163
+ <div class="setting-part-container">
34164
+ <mat-form-field class="third-width">
34165
+ <mat-label [textContent]="'ROTATION' | localize"></mat-label>
34166
+ <input
34167
+ [type]="'number'"
34168
+ matInput
34169
+ [(ngModel)]="hdriRotation"
34170
+ (ngModelChange)="hdriRotation = +$event">
34171
+ </mat-form-field>
34172
+ <div class="setting-part-buttons">
34173
+ <button class="amount-button" (click)="hdriRotation = +hdriRotation - 1">
34174
+ <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
34175
+ </button>
34176
+ <button class="amount-button" (click)="hdriRotation = +hdriRotation + 1">
34177
+ <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
34178
+ </button>
34179
+ </div>
34180
+ <div class="setting-part-slider">
34181
+ <mat-slider class="value" min="0" max="360" step="1" [(ngModel)]="hdriRotation"></mat-slider>
34182
+ </div>
34183
+ </div>
34184
+ <div class="setting-part-container">
34185
+ <mat-form-field class="third-width">
34186
+ <mat-label [textContent]="'LIGHTS' | localize"></mat-label>
34187
+ <input
34188
+ [type]="'number'"
34189
+ matInput
34190
+ [(ngModel)]="lightingExposure"
34191
+ (ngModelChange)="lightingExposure = +$event">
34192
+ </mat-form-field>
34193
+ <div class="setting-part-buttons">
34194
+ <button class="amount-button" (click)="lightingExposure = +lightingExposure - 1">
34195
+ <co-icon [iconData]="iconService.getIcon(icons.CircleMinusLight)"></co-icon>
34196
+ </button>
34197
+ <button class="amount-button" (click)="lightingExposure = +lightingExposure + 1">
34198
+ <co-icon [iconData]="iconService.getIcon(icons.CirclePlusLight)"></co-icon>
34199
+ </button>
34200
+ </div>
34201
+ <div class="setting-part-slider">
34202
+ <mat-slider class="value" min="1" max="10" step="1" [(ngModel)]="lightingExposure"></mat-slider>
34203
+ </div>
34204
+ </div>
34205
+ </div>
34206
+ }
34207
+ </div>
34538
34208
  }
34539
- @if (renderService.serverData.renderMode === renderModes.RenderRoom) {
34540
- <div class="render-popup-dropdown">
34209
+ <div class="render-popup-dropdown">
34541
34210
  <mat-form-field class="face-select-form">
34542
- <mat-label>{{ "IMAGE_SIZE" | localize }}</mat-label>
34543
- <mat-select [(ngModel)]="renderService.selectedImageSize">
34544
- @for (size of renderService.imageSizes; track size) {
34545
- <mat-option [value]="size.id">{{ size.name }} {{ size.width }}
34546
- x{{ size.height }}
34547
- </mat-option>
34548
- }
34549
- </mat-select>
34211
+ <mat-label>{{ "IMAGE_SIZE" | localize }}</mat-label>
34212
+ <mat-select [(value)]="selectedImageSize">
34213
+ @for (size of imageSizes; track size) {
34214
+ <mat-option [value]="size">{{ size.name }} {{ size.width }}
34215
+ x{{ size.height }}
34216
+ </mat-option>
34217
+ }
34218
+ </mat-select>
34550
34219
  </mat-form-field>
34551
- </div>
34552
- }
34220
+ </div>
34553
34221
  <div class="render-popup-button-container">
34554
- <button class="render-popup-button photo-button"
34555
- (click)="createBlenderRender()"
34556
- title="{{'MAKE_A_PICTURE' | localize}}"
34557
- [disabled]="disablePictureButton">
34558
- <co-icon [iconData]="iconService.getIcon(icons.CircleCheck)"></co-icon>
34559
- {{ 'MAKE_A_PICTURE' | localize }}
34560
- </button>
34561
- <button
34562
- class="render-popup-button cancel-button"
34563
- (click)="resetBlenderRenderScene()">
34564
- <co-icon [iconData]="iconService.getIcon(icons.CircleXmark)"></co-icon>
34565
- {{ 'CLOSE_PHOTO_MODE' | localize }}
34566
- </button>
34222
+ <button class="render-popup-button photo-button"
34223
+ (click)="createBlenderRender()"
34224
+ title="{{'MAKE_A_PICTURE' | localize}}"
34225
+ [disabled]="disablePictureButton">
34226
+ <co-icon [iconData]="iconService.getIcon(icons.CircleCheck)"></co-icon>
34227
+ {{ 'MAKE_A_PICTURE' | localize }}
34228
+ </button>
34229
+ <button
34230
+ class="render-popup-button cancel-button"
34231
+ (click)="resetBlenderRenderScene()">
34232
+ <co-icon [iconData]="iconService.getIcon(icons.CircleXmark)"></co-icon>
34233
+ {{ 'CLOSE_PHOTO_MODE' | localize }}
34234
+ </button>
34567
34235
  </div>
34568
- </div>
34569
- }
34570
- @if (showCullingErrorDialog) {
34571
- <div class="render-warning">
34236
+ </div>
34237
+ }
34238
+ @if (showCullingErrorDialog) {
34239
+ <div class="render-warning">
34572
34240
  <div class="render-warming-header">
34573
- <h2>{{ 'BLENDER_RENDER_ERROR_TITLE' | localize }}</h2>
34574
- <div class="render-warning-close" (click)="showCullingErrorDialog = false">
34575
- <mat-icon class="homedecorator-material-icons">cancel</mat-icon>
34576
- </div>
34241
+ <h2>{{ 'BLENDER_RENDER_ERROR_TITLE' | localize }}</h2>
34242
+ <div class="render-warning-close" (click)="showCullingErrorDialog = false">
34243
+ <mat-icon class="homedecorator-material-icons">cancel</mat-icon>
34244
+ </div>
34577
34245
  </div>
34578
34246
  <div class="render-warning-body">
34579
- <p>{{ 'BLENDER_RENDER_WARNING_CULLING' | localize }}</p>
34247
+ <p>{{ 'BLENDER_RENDER_WARNING_CULLING' | localize }}</p>
34580
34248
  </div>
34581
34249
  <div class="render-warning-footer">
34582
- <button
34583
- class="render-popup-button cancel-button"
34584
- (click)="showCullingErrorDialog = false">
34585
- <co-icon [iconData]="iconService.getIcon(icons.CircleXmark)"></co-icon>
34586
- {{ 'CLOSE' | localize }}
34587
- </button>
34250
+ <button
34251
+ class="render-popup-button cancel-button"
34252
+ (click)="showCullingErrorDialog = false">
34253
+ <co-icon [iconData]="iconService.getIcon(icons.CircleXmark)"></co-icon>
34254
+ {{ 'CLOSE' | localize }}
34255
+ </button>
34588
34256
  </div>
34589
- </div>
34590
- }
34591
- <rp-render-progress
34592
- [title]="'PREPARE_TO_RENDER' | localize"
34593
- [show]="startUploading"
34594
- >
34595
- </rp-render-progress>
34596
- <button
34597
- #renderButton
34598
- mat-raised-button
34599
- matTooltip="{{'RENDER_TAKE_A_PICTURE' | localize}}"
34600
- [id]="'standalone_render_picture'"
34601
- [class.active]="(
34602
- (renderService.serverData.renderMode === renderService.renderModes.RenderRoom && viewModeService.viewMode === viewModes.WalkThrough) ||
34603
- (renderService.serverData.renderMode === renderService.renderModes.RenderIone))"
34604
- (click)="showRenderForm($event)"
34605
- >
34606
- <mat-icon class="icon homedecorator-material-icons"
34607
- aria-hidden="true">{{ (renderService.currentQueueRenderItem.renderStatus === renderStatus.IsRunning ? 'open_in_browser' : 'photo_camera') }}
34608
- </mat-icon>
34609
- </button>
34610
- </div>
34257
+ </div>
34611
34258
  }
34612
-
34613
- `, standalone: false, styles: [".render-container{position:relative}.render-container .render-popup-container{background:#ffffffb3;padding:10px 25px 25px;border-radius:5px;box-shadow:0 1px 5px #0000001f}.render-container .render-popup-container .render-popup-header{display:flex;justify-content:space-between;font-family:inherit}.render-container .render-popup-container .render-popup-header h3{display:flex;justify-content:space-between}.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon{width:20px;height:20px;margin-left:20px}.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon svg,.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon svg polygon{fill:#dc143c}.render-container .render-popup-container .render-popup-header .close-popup-container{cursor:pointer;border:none;background:none;float:none;height:auto;width:auto}.render-container .render-popup-container .render-popup-button-container{display:flex;justify-content:space-between;font-family:inherit}.render-container .render-popup-container .render-popup-button-container .render-popup-button{float:none;width:100%;max-width:130px;border-radius:3px;cursor:pointer;border:none;display:flex;height:40px;align-items:center;justify-content:space-evenly}.render-container .render-popup-container .render-popup-button-container .render-popup-button ::ng-deep co-icon{display:inline-block;height:18px;width:18px}.render-container .render-popup-container .render-popup-button-container .render-popup-button ::ng-deep co-icon svg path{fill:#fff}.render-container .render-popup-container .render-popup-button-container .photo-button{color:#fff;background-color:#dda73f}.render-container .render-popup-container .render-popup-button-container .cancel-button{color:#fff;background-color:#5b6875}.render-container .render-popup-container .render-popup-preview{background-color:#fff;min-height:150px;min-width:275px;margin:5px 0;position:relative;width:275px;height:150px}.render-container .render-popup-container .render-popup-preview .render-popup-preview-placeholder{background-color:#fff;display:flex;justify-content:space-around;align-items:center;vertical-align:middle;min-height:150px;border:1px solid #ddd;color:#ddd;font-size:14px}.render-container .render-popup-container .render-popup-preview .render-popup-refresh-preview{position:absolute;bottom:0;right:0;cursor:pointer;border-radius:0;border:none;height:30px;width:30px;background-color:#dda73f;color:#fff;margin:0}.render-container .render-popup-container .render-popup-preview .render-popup-refresh-preview ::ng-deep co-icon svg path{fill:#fff}.render-container .render-popup-container .render-popup-dropdown{margin:5px 0;width:100%}.render-container .render-popup-container .render-popup-dropdown .toggleable{cursor:pointer;display:flex;justify-content:right;align-content:center}.render-container .render-popup-container .render-popup-dropdown .toggleable p{padding:0;margin:0;font-size:12px;line-height:30px}.render-container .render-popup-container .render-popup-dropdown .toggleable .icon-rotate{transform:rotate(180deg)}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field{width:100%;font-size:14px}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-flex{background-color:#fff;color:#000;padding:3px 6px;border:1px solid #ddd}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-underline{display:none}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-wrapper{padding-bottom:0}.render-container .render-popup-container .render-popup-dropdown .setting-part-container{display:flex;justify-content:space-between;align-items:center;margin-bottom:5px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .third-width{width:32%}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button{float:none;box-sizing:border-box;padding:2px;background:none;cursor:pointer;border:none;width:25px;height:25px;margin:0 5px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button co-icon{display:block;width:25px;height:25px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button co-icon ::ng-deep svg{fill:#5b6875}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-slider .mat-slider-horizontal{min-width:110px;height:28px}.render-container .render-progress{float:left;min-width:50px;border-radius:25px;line-height:50px;text-align:center;padding:0 60px 0 20px;background:#fff;color:#74b77f;font-weight:700;margin:0 -50px 0 0}.render-container .render-input-container{float:right}.render-container .render-input-container input{width:100px;height:24px;margin:5px 0;padding:0 10px;font-size:14px}.render-container button{pointer-events:all;width:50px;height:50px;float:right;border-radius:100%;position:relative;z-index:2;margin-bottom:10px}.render-container button.active{background:#74b77f;color:#fff}.render-container button>*{pointer-events:none}.render-indicators div{position:fixed;width:100px;height:100px}.render-indicators .render-indicator-top-left{left:5vw;top:10vh;border-left:10px solid #dda73f;border-top:10px solid #dda73f;border-top-left-radius:20px}.render-indicators .render-indicator-top-right{right:5vw;top:10vh;border-right:10px solid #dda73f;border-top:10px solid #dda73f;border-top-right-radius:20px}.render-indicators .render-indicator-bottom-left{left:5vw;bottom:5vh;border-left:10px solid #dda73f;border-bottom:10px solid #dda73f;border-bottom-left-radius:20px}.render-indicators .render-indicator-bottom-right{right:5vw;bottom:5vh;border-right:10px solid #dda73f;border-bottom:10px solid #dda73f;border-bottom-right-radius:20px}.render-warning{width:500px;position:fixed;top:20%;left:calc(50% - 250px);border-radius:15px;box-sizing:border-box;background-color:#fff;box-shadow:1px 0 20px #0000001f}.render-warning .render-warming-header{display:flex;justify-content:space-between;border-bottom:1px solid #c5c3c6;padding:20px 20px 10px;align-items:center}.render-warning .render-warming-header h2{padding:0;margin:0}.render-warning .render-warming-header .render-warning-close mat-icon{fill:#c5c3c6;color:#c5c3c6;cursor:pointer;transition:all .2s ease}.render-warning .render-warming-header .render-warning-close:hover mat-icon{fill:#46494c;color:#46494c}.render-warning .render-warning-body{padding:10px 20px}.render-warning .render-warning-footer{display:flex;justify-content:center;padding:0 20px 10px}.render-warning .render-warning-footer .render-popup-button{float:none;width:110px;border-radius:3px;cursor:pointer;border:none;display:flex;height:40px;align-items:center;justify-content:space-evenly;color:#fff;background-color:#5b6875}.render-warning .render-warning-footer .render-popup-button ::ng-deep co-icon{display:inline-block;height:18px;width:18px}.render-warning .render-warning-footer .render-popup-button ::ng-deep co-icon svg path{fill:#fff}\n"] }]
34614
- }], ctorParameters: () => [{ type: RenderService }, { type: MessageBusService }, { type: ViewModeService }, { type: HomedecoratorSettingsService }, { type: HomedecoratorIconCacheService }, { type: i1$2.MatDialog }, { type: SceneService }, { type: CameraService }, { type: ConfigurationService }, { type: HomedecoratorSettingsService }, { type: NewRenderService }, { type: UtilsService }, { type: RoomService }, { type: WallMeasurementsService }, { type: ConnectionHeathService }, { type: HomedecoratorDictionaryService }], propDecorators: { renderButton: [{
34259
+ <button
34260
+ #renderButton
34261
+ mat-raised-button
34262
+ matTooltip="{{'RENDER_TAKE_A_PICTURE' | localize}}"
34263
+ [id]="'standalone_render_picture'"
34264
+ [class.active]="viewModeService.viewMode === viewModes.WalkThrough"
34265
+ (click)="showRenderForm($event)">
34266
+ <mat-icon class="icon homedecorator-material-icons"
34267
+ aria-hidden="true">{{ 'photo_camera' }}
34268
+ </mat-icon>
34269
+ </button>
34270
+ </div>
34271
+ `, standalone: false, styles: [".render-container{position:relative}.render-container .render-popup-container{background:#ffffffb3;padding:10px 25px 25px;border-radius:5px;box-shadow:0 1px 5px #0000001f}.render-container .render-popup-container .render-popup-header{display:flex;justify-content:space-between;font-family:inherit}.render-container .render-popup-container .render-popup-header h3{display:flex;justify-content:space-between}.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon{width:20px;height:20px;margin-left:20px}.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon svg,.render-container .render-popup-container .render-popup-header h3 ::ng-deep .renderErrorIcon svg polygon{fill:#dc143c}.render-container .render-popup-container .render-popup-header .close-popup-container{cursor:pointer;border:none;background:none;float:none;height:auto;width:auto}.render-container .render-popup-container .render-popup-button-container{display:flex;justify-content:space-between;font-family:inherit}.render-container .render-popup-container .render-popup-button-container .render-popup-button{float:none;width:100%;max-width:130px;border-radius:3px;cursor:pointer;border:none;display:flex;height:40px;align-items:center;justify-content:space-evenly}.render-container .render-popup-container .render-popup-button-container .render-popup-button ::ng-deep co-icon{display:inline-block;height:18px;width:18px}.render-container .render-popup-container .render-popup-button-container .render-popup-button ::ng-deep co-icon svg path{fill:#fff}.render-container .render-popup-container .render-popup-button-container .photo-button{color:#fff;background-color:#dda73f}.render-container .render-popup-container .render-popup-button-container .cancel-button{color:#fff;background-color:#5b6875}.render-container .render-popup-container .render-popup-preview{background-color:#fff;min-height:150px;min-width:275px;margin:5px 0;position:relative;width:275px;height:150px}.render-container .render-popup-container .render-popup-preview .render-popup-preview-placeholder{background-color:#fff;display:flex;justify-content:space-around;align-items:center;vertical-align:middle;min-height:150px;border:1px solid #ddd;color:#ddd;font-size:14px}.render-container .render-popup-container .render-popup-preview .render-popup-refresh-preview{position:absolute;bottom:0;right:0;cursor:pointer;border-radius:0;border:none;height:30px;width:30px;background-color:#dda73f;color:#fff;margin:0}.render-container .render-popup-container .render-popup-preview .render-popup-refresh-preview ::ng-deep co-icon svg path{fill:#fff}.render-container .render-popup-container .render-popup-dropdown{margin:5px 0;width:100%}.render-container .render-popup-container .render-popup-dropdown .toggleable{cursor:pointer;display:flex;justify-content:right;align-content:center}.render-container .render-popup-container .render-popup-dropdown .toggleable p{padding:0;margin:0;font-size:12px;line-height:30px}.render-container .render-popup-container .render-popup-dropdown .toggleable .icon-rotate{transform:rotate(180deg)}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field{width:100%;font-size:14px}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-flex{background-color:#fff;color:#000;padding:3px 6px;border:1px solid #ddd}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-underline{display:none}.render-container .render-popup-container .render-popup-dropdown .mat-mdc-form-field ::ng-deep .mat-mdc-form-field-wrapper{padding-bottom:0}.render-container .render-popup-container .render-popup-dropdown .setting-part-container{display:flex;justify-content:space-between;align-items:center;margin-bottom:5px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .third-width{width:32%}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button{float:none;box-sizing:border-box;padding:2px;background:none;cursor:pointer;border:none;width:25px;height:25px;margin:0 5px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button co-icon{display:block;width:25px;height:25px}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-buttons .amount-button co-icon ::ng-deep svg{fill:#5b6875}.render-container .render-popup-container .render-popup-dropdown .setting-part-container .setting-part-slider .mat-slider-horizontal{min-width:110px;height:28px}.render-container .render-progress{float:left;min-width:50px;border-radius:25px;line-height:50px;text-align:center;padding:0 60px 0 20px;background:#fff;color:#74b77f;font-weight:700;margin:0 -50px 0 0}.render-container .render-input-container{float:right}.render-container .render-input-container input{width:100px;height:24px;margin:5px 0;padding:0 10px;font-size:14px}.render-container button{pointer-events:all;width:50px;height:50px;float:right;border-radius:100%;position:relative;z-index:2;margin-bottom:10px}.render-container button.active{background:#74b77f;color:#fff}.render-container button>*{pointer-events:none}.render-indicators div{position:fixed;width:100px;height:100px}.render-indicators .render-indicator-top-left{left:5vw;top:10vh;border-left:10px solid #dda73f;border-top:10px solid #dda73f;border-top-left-radius:20px}.render-indicators .render-indicator-top-right{right:5vw;top:10vh;border-right:10px solid #dda73f;border-top:10px solid #dda73f;border-top-right-radius:20px}.render-indicators .render-indicator-bottom-left{left:5vw;bottom:5vh;border-left:10px solid #dda73f;border-bottom:10px solid #dda73f;border-bottom-left-radius:20px}.render-indicators .render-indicator-bottom-right{right:5vw;bottom:5vh;border-right:10px solid #dda73f;border-bottom:10px solid #dda73f;border-bottom-right-radius:20px}.render-warning{width:500px;position:fixed;top:20%;left:calc(50% - 250px);border-radius:15px;box-sizing:border-box;background-color:#fff;box-shadow:1px 0 20px #0000001f}.render-warning .render-warming-header{display:flex;justify-content:space-between;border-bottom:1px solid #c5c3c6;padding:20px 20px 10px;align-items:center}.render-warning .render-warming-header h2{padding:0;margin:0}.render-warning .render-warming-header .render-warning-close mat-icon{fill:#c5c3c6;color:#c5c3c6;cursor:pointer;transition:all .2s ease}.render-warning .render-warming-header .render-warning-close:hover mat-icon{fill:#46494c;color:#46494c}.render-warning .render-warning-body{padding:10px 20px}.render-warning .render-warning-footer{display:flex;justify-content:center;padding:0 20px 10px}.render-warning .render-warning-footer .render-popup-button{float:none;width:110px;border-radius:3px;cursor:pointer;border:none;display:flex;height:40px;align-items:center;justify-content:space-evenly;color:#fff;background-color:#5b6875}.render-warning .render-warning-footer .render-popup-button ::ng-deep co-icon{display:inline-block;height:18px;width:18px}.render-warning .render-warning-footer .render-popup-button ::ng-deep co-icon svg path{fill:#fff}\n"] }]
34272
+ }], ctorParameters: () => [{ type: MessageBusService }, { type: ViewModeService }, { type: HomedecoratorSettingsService }, { type: HomedecoratorIconCacheService }, { type: RenderService }, { type: i1$2.MatDialog }, { type: SceneService }, { type: CameraService }, { type: ConfigurationService }, { type: HomedecoratorSettingsService }, { type: UtilsService }, { type: RoomService }, { type: WallMeasurementsService }, { type: ConnectionHeathService }, { type: HomedecoratorDictionaryService }, { type: DialogService }], propDecorators: { renderButton: [{
34615
34273
  type: ViewChild,
34616
34274
  args: ['renderButton']
34617
34275
  }] } });
@@ -42827,6 +42485,88 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
42827
42485
  type: Output
42828
42486
  }] } });
42829
42487
 
42488
+ class ConfigurationPresetLoaderComponent {
42489
+ showClass() {
42490
+ return true;
42491
+ }
42492
+ constructor(configurationPresetService, iconService, _homedecoratorConnectorService, _messageService) {
42493
+ this.configurationPresetService = configurationPresetService;
42494
+ this.iconService = iconService;
42495
+ this._homedecoratorConnectorService = _homedecoratorConnectorService;
42496
+ this._messageService = _messageService;
42497
+ this.icon = IconEnum;
42498
+ }
42499
+ ngOnInit() {
42500
+ // TODO REMOVE MOCK
42501
+ // Own source, good ol' instanbull
42502
+ // this.configurationPresetService.sku = '1000610952';
42503
+ // this.configurationPresetService.instanceId = '67483';
42504
+ // IMG extern
42505
+ // this.configurationPresetService.sku = '70000107';
42506
+ // this.configurationPresetService.instanceId = '354490';
42507
+ // this.configurationPresetService.externalSourceId = 171;
42508
+ }
42509
+ handleCloseClick() {
42510
+ this.configurationPresetService.reset();
42511
+ }
42512
+ handleLoadPreset() {
42513
+ this.configurationPresetService.LoadPreset();
42514
+ }
42515
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ConfigurationPresetLoaderComponent, deps: [{ token: ConfigurationPresetLoadService }, { token: HomedecoratorIconCacheService }, { token: HomedecoratorConnectorService }, { token: MessageBusService }], target: i0.ɵɵFactoryTarget.Component }); }
42516
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: ConfigurationPresetLoaderComponent, isStandalone: false, selector: "co-configurator-preset-loader", host: { properties: { "class.co-configurator-preset-loader": "this.showClass" } }, ngImport: i0, template: `
42517
+
42518
+ @if (configurationPresetService.showConfigurationLoad) {
42519
+ <div class="configurator-preset-loader-container">
42520
+ <div class="configurator-preset-icon">
42521
+ <co-icon [iconData]="iconService.getIcon(icon.Check)"></co-icon>
42522
+ </div>
42523
+ <div class="configurator-preset-info">
42524
+ <div class="preset-head" [textContent]="'LOAD_CONFIGURATION_PRESET' | localize"></div>
42525
+ <div class="preset-sku" [textContent]="configurationPresetService.article.description"></div>
42526
+ <div class="preset-text-link" [textContent]="'CLICK_LOAD_PRESET' | localize" (click)="handleLoadPreset()"></div>
42527
+ </div>
42528
+
42529
+ <div class="configurator-preset-close">
42530
+ <co-button
42531
+ [iconData]="iconService.getIcon(icon.Cross)"
42532
+ (onClick)="handleCloseClick()"
42533
+ ></co-button>
42534
+ </div>
42535
+ </div>
42536
+ }
42537
+
42538
+ `, isInline: true, styles: [".co-configurator-preset-loader .configurator-preset-loader-container{position:fixed;background:#fff;right:50px;bottom:50px;width:100%;max-width:400px;min-height:40px;box-sizing:border-box;padding:15px 5px;display:flex;justify-content:space-between;align-items:center;border-radius:15px;box-shadow:1px 1px 4px #0003;pointer-events:all;z-index:102}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-icon{background:#4e9b7e;border-radius:50%;width:30px;height:30px}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-icon .co-icon svg polygon{fill:#fff}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-info .preset-head{text-transform:uppercase;font-size:12px}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-info .preset-sku{font-size:18px;font-weight:700;margin:5px 0 15px}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-info .preset-text-link{font-size:14px;cursor:pointer;color:#4e9b7e;text-align:center}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-info .preset-text-link:hover{text-decoration:underline}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-close .co-button{background:none}\n"], dependencies: [{ kind: "component", type: i5.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: i5.ButtonComponent, selector: "co-button", inputs: ["label", "iconData", "iconDataRight", "isToggleButton", "isToggled", "hidden", "disabled"], outputs: ["onClick", "clickedWhileDisabled", "isToggledChange"] }, { kind: "pipe", type: LocalizePipe, name: "localize" }], encapsulation: i0.ViewEncapsulation.None }); }
42539
+ }
42540
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ConfigurationPresetLoaderComponent, decorators: [{
42541
+ type: Component,
42542
+ args: [{ selector: 'co-configurator-preset-loader', template: `
42543
+
42544
+ @if (configurationPresetService.showConfigurationLoad) {
42545
+ <div class="configurator-preset-loader-container">
42546
+ <div class="configurator-preset-icon">
42547
+ <co-icon [iconData]="iconService.getIcon(icon.Check)"></co-icon>
42548
+ </div>
42549
+ <div class="configurator-preset-info">
42550
+ <div class="preset-head" [textContent]="'LOAD_CONFIGURATION_PRESET' | localize"></div>
42551
+ <div class="preset-sku" [textContent]="configurationPresetService.article.description"></div>
42552
+ <div class="preset-text-link" [textContent]="'CLICK_LOAD_PRESET' | localize" (click)="handleLoadPreset()"></div>
42553
+ </div>
42554
+
42555
+ <div class="configurator-preset-close">
42556
+ <co-button
42557
+ [iconData]="iconService.getIcon(icon.Cross)"
42558
+ (onClick)="handleCloseClick()"
42559
+ ></co-button>
42560
+ </div>
42561
+ </div>
42562
+ }
42563
+
42564
+ `, standalone: false, encapsulation: ViewEncapsulation.None, styles: [".co-configurator-preset-loader .configurator-preset-loader-container{position:fixed;background:#fff;right:50px;bottom:50px;width:100%;max-width:400px;min-height:40px;box-sizing:border-box;padding:15px 5px;display:flex;justify-content:space-between;align-items:center;border-radius:15px;box-shadow:1px 1px 4px #0003;pointer-events:all;z-index:102}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-icon{background:#4e9b7e;border-radius:50%;width:30px;height:30px}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-icon .co-icon svg polygon{fill:#fff}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-info .preset-head{text-transform:uppercase;font-size:12px}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-info .preset-sku{font-size:18px;font-weight:700;margin:5px 0 15px}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-info .preset-text-link{font-size:14px;cursor:pointer;color:#4e9b7e;text-align:center}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-info .preset-text-link:hover{text-decoration:underline}.co-configurator-preset-loader .configurator-preset-loader-container .configurator-preset-close .co-button{background:none}\n"] }]
42565
+ }], ctorParameters: () => [{ type: ConfigurationPresetLoadService }, { type: HomedecoratorIconCacheService }, { type: HomedecoratorConnectorService }, { type: MessageBusService }], propDecorators: { showClass: [{
42566
+ type: HostBinding,
42567
+ args: ['class.co-configurator-preset-loader']
42568
+ }] } });
42569
+
42830
42570
  class RoomPlannerComponent {
42831
42571
  constructor(iconService, viewModeService, modelsService, itemService, settingsService, _presetsService, _appService, _screenAnalysis, _cd, _utilsService, _messageService, _dialog, _configurationService, _bluePrintService, _sceneService, _hudService, _roomService, _cameraService, _itemService, _itemSerializationService, _lightsService, _arService, _googleTagManager, _permanentStoreService, _appEventService, _connectorService, _wallService, _connectorAdapterService, _loadFurnitureService, _floorService, _sanitizer, _dictionary, _modelCreationService) {
42832
42572
  this.iconService = iconService;
@@ -43095,6 +42835,10 @@ class RoomPlannerComponent {
43095
42835
  this.unselectAll();
43096
42836
  this.showGroupMenu = false;
43097
42837
  this.showGroupEditMenuButtons = false;
42838
+ if (this.userIsGrouping) {
42839
+ // When the user was grouping, let everything know that we stopped with that aswell
42840
+ this._messageService.emit(MessageType.CancelGroupObject);
42841
+ }
43098
42842
  }
43099
42843
  updateSelectedObjectHud() {
43100
42844
  this._hudService.updateSelectedItemHud();
@@ -43957,6 +43701,9 @@ class RoomPlannerComponent {
43957
43701
  (onZoomReset)="zoomReset()"
43958
43702
  (onZoomOut)="zoomOut()"
43959
43703
  ></rp-zoom-controls>
43704
+
43705
+
43706
+ <co-configurator-preset-loader></co-configurator-preset-loader>
43960
43707
 
43961
43708
  <ng-template #toolbarIconSettings>
43962
43709
  <span class="toolbar__divider"></span>
@@ -44179,7 +43926,7 @@ class RoomPlannerComponent {
44179
43926
  }
44180
43927
  }
44181
43928
 
44182
- `, isInline: true, styles: [".with-scrollable-section{overflow:hidden;height:100%}.with-scrollable-section section{overflow-y:auto}.RoomPlanner{width:inherit;height:inherit;pointer-events:none}.RoomPlanner>*{pointer-events:all}.sidebar-toggles .mat-mdc-raised-button{width:110px;text-align:left}.logo-menu{position:absolute;top:20px;left:20px;z-index:2}.logo-menu-2nd{position:absolute;top:140px;left:84px}.logo-menu-4th{position:absolute;top:180px;left:84px}.sidebar{position:absolute;left:0;top:0;height:100vh;max-width:30%;width:400px;background:#fff;padding:0 20px;box-shadow:0 0 20px #00000040}.flex-wrap{display:flex;flex-flow:column nowrap;height:100%}.solid-background>canvas{fill:#fff;background:#fff}.toolbar__divider{border-bottom:2px solid rgba(199,195,195,.5411764706);width:70%;margin:5px 0}.toolbar__divider.context-menu{border-color:#c7c3c38a;width:100%}.show-inner-wall-measurement-button ::ng-deep .co-icon{transform:rotate(180deg)}.on-top{z-index:3}.rp-item-context-menu-wrap{color:#fff;background:#17253391;border-radius:5px;box-sizing:border-box;padding:10px;position:relative}.rp-item-context-menu-wrap .rp-item-context-menu-item{cursor:pointer;flex-direction:row;display:flex;padding:5px;border-radius:5px}.rp-item-context-menu-wrap .rp-item-context-menu-item span,.rp-item-context-menu-wrap .rp-item-context-menu-item label{display:flex;flex-direction:column;line-height:20px;font-size:12px;font-weight:lighter;vertical-align:middle}.rp-item-context-menu-wrap .rp-item-context-menu-item .label{width:150px}.rp-item-context-menu-wrap .rp-item-context-menu-item .icon{width:20px;margin-right:10px}.rp-item-context-menu-wrap .rp-item-context-menu-item .icon svg,.rp-item-context-menu-wrap .rp-item-context-menu-item .icon co-icon,.rp-item-context-menu-wrap .rp-item-context-menu-item .icon .mat-icon{height:15px;width:15px;font-size:18px}.rp-item-context-menu-wrap .rp-item-context-menu-item:hover{background:#dcdcdc80}.rp-item-context-menu-wrap .rp-item-context-menu-item-highlight{color:#da9803}.rp-item-context-menu-wrap .rp-item-context-menu-item-highlight svg{fill:#da9803}.rp-item-context-menu-wrap .conversion-button-selected .icon-selected{color:#009a6d}.rp-item-context-menu-wrap .rp-item-context-menu-header{border-bottom:2px solid rgba(199,195,195,.5411764706);margin-bottom:10px;padding-left:5px;padding-right:25px;max-width:160px;overflow:hidden}.rp-item-context-menu-wrap .rp-item-context-menu-header p{color:#da9803;font-size:13px;margin:0;padding:5px 0 10px}.rp-item-context-menu-wrap .rp-item-context-menu-close{position:absolute;right:7px;top:5px;z-index:2;cursor:pointer;width:15px;height:15px}.rp-item-context-menu-wrap .rp-item-context-menu-close .close-icon co-icon{height:15px;width:15px;font-size:18px}.rp-right-context-menu-wrap{color:#fff;background:#17253391;border-radius:5px 0 0 5px;box-sizing:border-box;padding:5px;position:relative}.rp-right-context-menu-wrap .rp-right-context-menu-item{cursor:pointer;flex-direction:row;display:flex;padding:10px;justify-content:center;border-bottom:2px solid rgba(199,195,195,.5411764706)}.rp-right-context-menu-wrap .rp-right-context-menu-item:last-child{border-bottom:none}.rp-right-context-menu-wrap .rp-right-context-menu-item span,.rp-right-context-menu-wrap .rp-right-context-menu-item label{display:flex;flex-direction:column;font-weight:lighter;vertical-align:middle}.rp-right-context-menu-wrap .rp-right-context-menu-item .icon{width:auto;margin-right:0}.rp-right-context-menu-wrap .rp-right-context-menu-item .icon svg,.rp-right-context-menu-wrap .rp-right-context-menu-item .icon co-icon,.rp-right-context-menu-wrap .rp-right-context-menu-item .icon .mat-icon{height:20px;width:20px;font-size:20px}.rp-right-context-menu-wrap .rp-right-context-menu-item:hover{background:#dcdcdc80}.rp-right-context-menu-wrap .rp-right-context-menu-item-highlight{color:#da9803}.rp-right-context-menu-wrap .rp-right-context-menu-item-highlight svg{fill:#da9803}.rp-right-context-menu-wrap .conversion-button-selected .icon-selected{color:#009a6d}::ng-deep .mat-mdc-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:#da9803}::ng-deep .mat-mdc-slide-toggle.mat-checked .mat-slide-toggle-bar .mat-slide-toggle-thumb-container .mat-slide-toggle-thumb{background-color:#fff}::ng-deep .mat-mdc-slide-toggle.mat-checked .mat-slide-toggle-bar:hover .mat-ripple-element{background-color:#da9803}::ng-deep .mat-mdc-slide-toggle .mat-slide-toggle-bar{width:40px;height:20px;border-radius:15px}::ng-deep .mat-mdc-slide-toggle .mat-slide-toggle-bar .mat-slide-toggle-thumb-container{width:17px;height:17px;top:2px;left:5px}::ng-deep .mat-mdc-slide-toggle .mat-slide-toggle-bar .mat-slide-toggle-thumb-container .mat-slide-toggle-thumb{height:16px;width:16px}::ng-deep mat-slider{height:24px}::ng-deep mat-slider .mat-slider-wrapper .mat-slider-track-wrapper{overflow:visible}::ng-deep mat-slider .mat-slider-wrapper .mat-slider-track-fill{background-color:#da9803}::ng-deep mat-slider .mat-slider-wrapper .mat-slider-thumb-container .mat-slider-thumb,::ng-deep mat-slider .mat-slider-wrapper .mat-slider-thumb-container .mat-slider-thumb-label{background-color:#da9803}::ng-deep mat-list .mat-mdc-list-item{border-bottom:1px solid #9bb0d0}.mrp-save-grouping{pointer-events:all;position:absolute;bottom:10%;left:50%}\n"], dependencies: [{ kind: "component", type: CategoryLibraryComponent, selector: "rp-category-library", inputs: ["categories"], outputs: ["categoryClick"] }, { kind: "directive", type: i2$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ContextMenuComponent, selector: "rp-context-menu", inputs: ["openMouseEvent"] }, { kind: "component", type: ItemContextMenuComponent, selector: "rp-item-context-menu", inputs: ["item"], outputs: ["deletePressed"] }, { kind: "component", type: RightContextMenuComponent, selector: "rp-right-context-menu", inputs: ["item"], outputs: ["deletePressed"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ToolbarIconComponent, selector: "rp-toolbar-icon", inputs: ["matIcon", "svgIcon", "tooltip", "disabled", "showLabel"], outputs: ["onClick"] }, { kind: "component", type: ZoomControlsComponent, selector: "rp-zoom-controls", inputs: ["visible"], outputs: ["onZoomIn", "onZoomReset", "onZoomOut"] }, { kind: "directive", type: i14.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i14.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i7$1.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i5.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: ButtonElevationComponent, selector: "button-elevation", inputs: ["item"] }, { kind: "component", type: ObjectLibraryComponent, selector: "rp-object-library", inputs: ["objects"], outputs: ["setDragged", "releaseDragged", "onObjectClick"] }, { kind: "component", type: FloorplannerComponent, selector: "floor-planner", outputs: ["selectedWallChange"] }, { kind: "component", type: SelectedFloorComponent, selector: "rp-selected-floor", inputs: ["floor", "texturePlane", "color"], outputs: ["setTexture", "setColor"] }, { kind: "component", type: SelectedObjectComponent, selector: "rp-selected-object", inputs: ["object"], outputs: ["onSelectedObjectChange"] }, { kind: "component", type: SelectedThreedObjectComponent, selector: "rp-selected-threed-object", inputs: ["object", "showCopy", "showDelete", "showLock"], outputs: ["onSelectedObjectChange"] }, { kind: "component", type: SelectedWallComponent, selector: "rp-selected-wall", inputs: ["wall", "texturePlane", "color", "minWallHeight", "maxWallHeight", "maxWallThickness", "maxWallLength", "minWallLength"], outputs: ["remove", "setLength", "setHeight", "setThickness", "selectCorner", "setTexture", "setColor"] }, { kind: "component", type: SettingsComponent, selector: "rp-settings", inputs: ["minWallHeight", "placeCameraDisabled"], outputs: ["onWallsHeightUpdate"] }, { kind: "component", type: CustomShapeCreatorComponent, selector: "rp-custom-shape-creator", inputs: ["shape"] }, { kind: "component", type: CustomCylinderCreatorComponent, selector: "custom-cylinder-creator", inputs: ["shape"] }, { kind: "component", type: SelectedObjectScaleComponent, selector: "rp-selected-object-scale", inputs: ["object"], outputs: ["objectChange"] }, { kind: "pipe", type: LocalizePipe, name: "localize" }] }); }
43929
+ `, isInline: true, styles: [".with-scrollable-section{overflow:hidden;height:100%}.with-scrollable-section section{overflow-y:auto}.RoomPlanner{width:inherit;height:inherit;pointer-events:none}.RoomPlanner>*{pointer-events:all}.sidebar-toggles .mat-mdc-raised-button{width:110px;text-align:left}.logo-menu{position:absolute;top:20px;left:20px;z-index:2}.logo-menu-2nd{position:absolute;top:140px;left:84px}.logo-menu-4th{position:absolute;top:180px;left:84px}.sidebar{position:absolute;left:0;top:0;height:100vh;max-width:30%;width:400px;background:#fff;padding:0 20px;box-shadow:0 0 20px #00000040}.flex-wrap{display:flex;flex-flow:column nowrap;height:100%}.solid-background>canvas{fill:#fff;background:#fff}.toolbar__divider{border-bottom:2px solid rgba(199,195,195,.5411764706);width:70%;margin:5px 0}.toolbar__divider.context-menu{border-color:#c7c3c38a;width:100%}.show-inner-wall-measurement-button ::ng-deep .co-icon{transform:rotate(180deg)}.on-top{z-index:3}.rp-item-context-menu-wrap{color:#fff;background:#17253391;border-radius:5px;box-sizing:border-box;padding:10px;position:relative}.rp-item-context-menu-wrap .rp-item-context-menu-item{cursor:pointer;flex-direction:row;display:flex;padding:5px;border-radius:5px}.rp-item-context-menu-wrap .rp-item-context-menu-item span,.rp-item-context-menu-wrap .rp-item-context-menu-item label{display:flex;flex-direction:column;line-height:20px;font-size:12px;font-weight:lighter;vertical-align:middle}.rp-item-context-menu-wrap .rp-item-context-menu-item .label{width:150px}.rp-item-context-menu-wrap .rp-item-context-menu-item .icon{width:20px;margin-right:10px}.rp-item-context-menu-wrap .rp-item-context-menu-item .icon svg,.rp-item-context-menu-wrap .rp-item-context-menu-item .icon co-icon,.rp-item-context-menu-wrap .rp-item-context-menu-item .icon .mat-icon{height:15px;width:15px;font-size:18px}.rp-item-context-menu-wrap .rp-item-context-menu-item:hover{background:#dcdcdc80}.rp-item-context-menu-wrap .rp-item-context-menu-item-highlight{color:#da9803}.rp-item-context-menu-wrap .rp-item-context-menu-item-highlight svg{fill:#da9803}.rp-item-context-menu-wrap .conversion-button-selected .icon-selected{color:#009a6d}.rp-item-context-menu-wrap .rp-item-context-menu-header{border-bottom:2px solid rgba(199,195,195,.5411764706);margin-bottom:10px;padding-left:5px;padding-right:25px;max-width:160px;overflow:hidden}.rp-item-context-menu-wrap .rp-item-context-menu-header p{color:#da9803;font-size:13px;margin:0;padding:5px 0 10px}.rp-item-context-menu-wrap .rp-item-context-menu-close{position:absolute;right:7px;top:5px;z-index:2;cursor:pointer;width:15px;height:15px}.rp-item-context-menu-wrap .rp-item-context-menu-close .close-icon co-icon{height:15px;width:15px;font-size:18px}.rp-right-context-menu-wrap{color:#fff;background:#17253391;border-radius:5px 0 0 5px;box-sizing:border-box;padding:5px;position:relative}.rp-right-context-menu-wrap .rp-right-context-menu-item{cursor:pointer;flex-direction:row;display:flex;padding:10px;justify-content:center;border-bottom:2px solid rgba(199,195,195,.5411764706)}.rp-right-context-menu-wrap .rp-right-context-menu-item:last-child{border-bottom:none}.rp-right-context-menu-wrap .rp-right-context-menu-item span,.rp-right-context-menu-wrap .rp-right-context-menu-item label{display:flex;flex-direction:column;font-weight:lighter;vertical-align:middle}.rp-right-context-menu-wrap .rp-right-context-menu-item .icon{width:auto;margin-right:0}.rp-right-context-menu-wrap .rp-right-context-menu-item .icon svg,.rp-right-context-menu-wrap .rp-right-context-menu-item .icon co-icon,.rp-right-context-menu-wrap .rp-right-context-menu-item .icon .mat-icon{height:20px;width:20px;font-size:20px}.rp-right-context-menu-wrap .rp-right-context-menu-item:hover{background:#dcdcdc80}.rp-right-context-menu-wrap .rp-right-context-menu-item-highlight{color:#da9803}.rp-right-context-menu-wrap .rp-right-context-menu-item-highlight svg{fill:#da9803}.rp-right-context-menu-wrap .conversion-button-selected .icon-selected{color:#009a6d}::ng-deep .mat-mdc-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:#da9803}::ng-deep .mat-mdc-slide-toggle.mat-checked .mat-slide-toggle-bar .mat-slide-toggle-thumb-container .mat-slide-toggle-thumb{background-color:#fff}::ng-deep .mat-mdc-slide-toggle.mat-checked .mat-slide-toggle-bar:hover .mat-ripple-element{background-color:#da9803}::ng-deep .mat-mdc-slide-toggle .mat-slide-toggle-bar{width:40px;height:20px;border-radius:15px}::ng-deep .mat-mdc-slide-toggle .mat-slide-toggle-bar .mat-slide-toggle-thumb-container{width:17px;height:17px;top:2px;left:5px}::ng-deep .mat-mdc-slide-toggle .mat-slide-toggle-bar .mat-slide-toggle-thumb-container .mat-slide-toggle-thumb{height:16px;width:16px}::ng-deep mat-slider{height:24px}::ng-deep mat-slider .mat-slider-wrapper .mat-slider-track-wrapper{overflow:visible}::ng-deep mat-slider .mat-slider-wrapper .mat-slider-track-fill{background-color:#da9803}::ng-deep mat-slider .mat-slider-wrapper .mat-slider-thumb-container .mat-slider-thumb,::ng-deep mat-slider .mat-slider-wrapper .mat-slider-thumb-container .mat-slider-thumb-label{background-color:#da9803}::ng-deep mat-list .mat-mdc-list-item{border-bottom:1px solid #9bb0d0}.mrp-save-grouping{pointer-events:all;position:absolute;bottom:10%;left:50%}\n"], dependencies: [{ kind: "component", type: CategoryLibraryComponent, selector: "rp-category-library", inputs: ["categories"], outputs: ["categoryClick"] }, { kind: "directive", type: i2$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ContextMenuComponent, selector: "rp-context-menu", inputs: ["openMouseEvent"] }, { kind: "component", type: ItemContextMenuComponent, selector: "rp-item-context-menu", inputs: ["item"], outputs: ["deletePressed"] }, { kind: "component", type: RightContextMenuComponent, selector: "rp-right-context-menu", inputs: ["item"], outputs: ["deletePressed"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ToolbarIconComponent, selector: "rp-toolbar-icon", inputs: ["matIcon", "svgIcon", "tooltip", "disabled", "showLabel"], outputs: ["onClick"] }, { kind: "component", type: ZoomControlsComponent, selector: "rp-zoom-controls", inputs: ["visible"], outputs: ["onZoomIn", "onZoomReset", "onZoomOut"] }, { kind: "directive", type: i14.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i14.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i7$1.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i5.IconComponent, selector: "co-icon", inputs: ["icon", "iconData"] }, { kind: "component", type: ButtonElevationComponent, selector: "button-elevation", inputs: ["item"] }, { kind: "component", type: ObjectLibraryComponent, selector: "rp-object-library", inputs: ["objects"], outputs: ["setDragged", "releaseDragged", "onObjectClick"] }, { kind: "component", type: FloorplannerComponent, selector: "floor-planner", outputs: ["selectedWallChange"] }, { kind: "component", type: SelectedFloorComponent, selector: "rp-selected-floor", inputs: ["floor", "texturePlane", "color"], outputs: ["setTexture", "setColor"] }, { kind: "component", type: SelectedObjectComponent, selector: "rp-selected-object", inputs: ["object"], outputs: ["onSelectedObjectChange"] }, { kind: "component", type: SelectedThreedObjectComponent, selector: "rp-selected-threed-object", inputs: ["object", "showCopy", "showDelete", "showLock"], outputs: ["onSelectedObjectChange"] }, { kind: "component", type: SelectedWallComponent, selector: "rp-selected-wall", inputs: ["wall", "texturePlane", "color", "minWallHeight", "maxWallHeight", "maxWallThickness", "maxWallLength", "minWallLength"], outputs: ["remove", "setLength", "setHeight", "setThickness", "selectCorner", "setTexture", "setColor"] }, { kind: "component", type: SettingsComponent, selector: "rp-settings", inputs: ["minWallHeight", "placeCameraDisabled"], outputs: ["onWallsHeightUpdate"] }, { kind: "component", type: CustomShapeCreatorComponent, selector: "rp-custom-shape-creator", inputs: ["shape"] }, { kind: "component", type: CustomCylinderCreatorComponent, selector: "custom-cylinder-creator", inputs: ["shape"] }, { kind: "component", type: SelectedObjectScaleComponent, selector: "rp-selected-object-scale", inputs: ["object"], outputs: ["objectChange"] }, { kind: "component", type: ConfigurationPresetLoaderComponent, selector: "co-configurator-preset-loader" }, { kind: "pipe", type: LocalizePipe, name: "localize" }] }); }
44183
43930
  }
44184
43931
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: RoomPlannerComponent, decorators: [{
44185
43932
  type: Component,
@@ -44455,6 +44202,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
44455
44202
  (onZoomReset)="zoomReset()"
44456
44203
  (onZoomOut)="zoomOut()"
44457
44204
  ></rp-zoom-controls>
44205
+
44206
+
44207
+ <co-configurator-preset-loader></co-configurator-preset-loader>
44458
44208
 
44459
44209
  <ng-template #toolbarIconSettings>
44460
44210
  <span class="toolbar__divider"></span>
@@ -45989,7 +45739,7 @@ class ThreedselectorComponent {
45989
45739
  this.showProgressBar = this._settingsService.settings.options.showProgressBar;
45990
45740
  this.showProgressText = this._settingsService.settings.options.showProgressText;
45991
45741
  }
45992
- }), this._messageService.subscribe(MessageType.OpenConfigurator, (item) => this.configureFurniture(item)));
45742
+ }), this._messageService.subscribe(MessageType.OpenConfigurator, (item) => this.configureFurniture(item)), this._messageService.subscribe(MessageType.LoadConfigurationFromPreset, ({ sku, instanceId, settings }) => this.handleLoadIOneFurnitureIntoSceneByPreset(sku, instanceId, settings)));
45993
45743
  this._addModelDialogToolbar();
45994
45744
  if (this._iOne.article && this._iOne.article.showFullConfiguration) {
45995
45745
  this.showFullConfiguration = this._iOne.article.showFullConfiguration;
@@ -46120,7 +45870,7 @@ class ThreedselectorComponent {
46120
45870
  }
46121
45871
  // NEW CONFIGURATOR
46122
45872
  async handleBuildResult(result) {
46123
- if (!result || this.firstBuild) {
45873
+ if (!result || this.firstBuild || !this._sceneService.scene) {
46124
45874
  return;
46125
45875
  }
46126
45876
  const customFloorGroupResult = new CustomFloorGroupResult();
@@ -46283,7 +46033,6 @@ class ThreedselectorComponent {
46283
46033
  const settingsInterface = settings['settings'];
46284
46034
  configuratorSettingsClone.externalSourceId = configuratorExternalSourceId;
46285
46035
  configuratorSettingsClone.username = settingsInterface.username;
46286
- configuratorSettingsClone.password = settingsInterface.password;
46287
46036
  configuratorSettingsClone.url = settingsInterface.url;
46288
46037
  configuratorSettingsClone.version = settingsInterface.version;
46289
46038
  configuratorSettingsClone.schema = settingsInterface.schema;
@@ -46295,7 +46044,7 @@ class ThreedselectorComponent {
46295
46044
  }
46296
46045
  }
46297
46046
  this._configuringService.scene = this._sceneService.scene;
46298
- this._initConfigurator(configuratorSettingsClone, sku);
46047
+ this._initConfigurator(configuratorSettingsClone, sku, !!configuratorExternalSourceId);
46299
46048
  // await this._configuringService.init(configuratorSettingsClone);
46300
46049
  // const furnitureData: ConfigurationResultObject = new ConfigurationResultObject();
46301
46050
  // furnitureData.sku = sku;
@@ -46308,6 +46057,7 @@ class ThreedselectorComponent {
46308
46057
  }
46309
46058
  async configureFurniture(object) {
46310
46059
  if (object instanceof Item) {
46060
+ this._resetConfigurator();
46311
46061
  const configuratorExternalSourceId = object.metadata.externalSettings && object.metadata.externalSettings.externalSourceId ?
46312
46062
  object.metadata.externalSettings.externalSourceId : undefined;
46313
46063
  const configuratorSettingsClone = await this._setSourceSettings(configuratorExternalSourceId);
@@ -46316,7 +46066,7 @@ class ThreedselectorComponent {
46316
46066
  }
46317
46067
  // make sure that if the object contains metadata, we set from project true
46318
46068
  // await this._configuringService.init(configuratorSettingsClone);
46319
- this._initConfigurator(configuratorSettingsClone, object.metadata.itemIdentifier, object.metadata.itemId);
46069
+ this._initConfigurator(configuratorSettingsClone, object.metadata.itemIdentifier, !!configuratorExternalSourceId, object.metadata.itemId);
46320
46070
  // const furnitureData: ConfigurationResultObject = new ConfigurationResultObject();
46321
46071
  // furnitureData.sku = object.metadata.itemIdentifier;
46322
46072
  // furnitureData.instanceId = object.metadata.itemId;
@@ -46326,11 +46076,63 @@ class ThreedselectorComponent {
46326
46076
  this.loadConfigurator = true;
46327
46077
  }
46328
46078
  }
46329
- _initConfigurator(settings, sku, instanceId) {
46330
- this.configuratorSettings = settings;
46079
+ async handleLoadIOneFurnitureIntoSceneByPreset(sku, instanceId, settings) {
46080
+ const toast = new Toast();
46081
+ toast.message = 'MODEL_LOADING';
46082
+ this._toastService.showToast(toast);
46083
+ const article = await this._loadFurnitureService.currentActiveService.loadArticle(sku);
46084
+ let position = this._bluePrintService.getCenter();
46085
+ const draggedData = {
46086
+ name: sku,
46087
+ constructFn: async (pos) => this.configureFurnitureFromPreset(sku, instanceId, settings),
46088
+ type: itemTypeFromPlacement(article.placement),
46089
+ iOne: true
46090
+ };
46091
+ this._messageBus.emit(MessageType.SetDrag, draggedData);
46092
+ this._messageBus.emit(MessageType.StartDrag, position);
46093
+ }
46094
+ async configureFurnitureFromPreset(sku, instanceId, settings) {
46095
+ this._resetConfigurator();
46096
+ this.firstBuild = true;
46097
+ const configuratorSettings = this._settingsService.settings.projectSettings ?
46098
+ this._settingsService.settings.projectSettings : this._settingsService.settings;
46099
+ const configuratorSettingsClone = Object.assign({}, configuratorSettings);
46100
+ const configuratorExternalSourceId = settings && settings.externalSourceId ? settings.externalSourceId : undefined;
46101
+ if (configuratorExternalSourceId) {
46102
+ configuratorSettingsClone.externalSourceId = configuratorExternalSourceId;
46103
+ configuratorSettingsClone.username = settings.username;
46104
+ configuratorSettingsClone.password = settings.password;
46105
+ configuratorSettingsClone.url = settings.url;
46106
+ configuratorSettingsClone.version = settings.version;
46107
+ configuratorSettingsClone.schema = settings.schema;
46108
+ configuratorSettingsClone.mainUrl = settings.url;
46109
+ configuratorSettingsClone.mainSchema = settings.schema;
46110
+ configuratorSettingsClone.mainVersion = settings.version;
46111
+ // Set here to just save it, when it comes back from the configurator, we need to add it to the metadata.
46112
+ this._externalSourceData = settings;
46113
+ }
46114
+ this._configuringService.scene = this._sceneService.scene;
46115
+ this._initConfigurator(configuratorSettingsClone, sku, !!configuratorExternalSourceId, instanceId);
46116
+ this._startPosition = this._bluePrintService.getCenter();
46117
+ this.loadConfigurator = true;
46118
+ this._changeDetector.detectChanges();
46119
+ return this._waitForBuildToFinish();
46120
+ }
46121
+ _initConfigurator(settings, sku, external, instanceId) {
46122
+ this.configuratorSettings = this._prepareSettings(settings, external);
46331
46123
  this.configuratorSku = sku;
46332
46124
  this.configuratorInstanceId = instanceId;
46333
46125
  }
46126
+ _prepareSettings(settings, external = false) {
46127
+ if (external) {
46128
+ // no pre-defined stuff for external sources
46129
+ settings.password = undefined;
46130
+ settings.dataSessionId = undefined;
46131
+ settings.sessionId = undefined;
46132
+ settings.getAccessTokenFunction = undefined;
46133
+ }
46134
+ return settings;
46135
+ }
46334
46136
  _resetConfigurator() {
46335
46137
  this.configuratorSettings = undefined;
46336
46138
  this.configuratorSku = undefined;
@@ -48796,7 +48598,7 @@ class ToolbarComponent {
48796
48598
  this.leftSidebar.close();
48797
48599
  }
48798
48600
  }
48799
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ToolbarComponent, deps: [{ token: AppStateService }, { token: PresetsService }, { token: MessageBusService }, { token: HomedecoratorSettingsService }, { token: LocalStorageService }, { token: HomedecoratorIconCacheService }, { token: ScreenSizeAnalysisService }, { token: i1$2.MatDialog }, { token: ToastService }, { token: HomedecoratorAppService }, { token: PermanentStoreService }, { token: UtilsService }, { token: ItemService }, { token: FloorService }, { token: AnimationService }, { token: DevelopmentService }, { token: NewRenderService }, { token: ThirdPartyModelService }, { token: LightPresetsService }, { token: HomedecoratorConnectorAdapterService }, { token: ConnectionHeathService }, { token: HomedecoratorAppEventService }], target: i0.ɵɵFactoryTarget.Component }); }
48601
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ToolbarComponent, deps: [{ token: AppStateService }, { token: PresetsService }, { token: MessageBusService }, { token: HomedecoratorSettingsService }, { token: LocalStorageService }, { token: HomedecoratorIconCacheService }, { token: ScreenSizeAnalysisService }, { token: i1$2.MatDialog }, { token: ToastService }, { token: HomedecoratorAppService }, { token: PermanentStoreService }, { token: UtilsService }, { token: ItemService }, { token: FloorService }, { token: AnimationService }, { token: DevelopmentService }, { token: RenderService }, { token: ThirdPartyModelService }, { token: LightPresetsService }, { token: HomedecoratorConnectorAdapterService }, { token: ConnectionHeathService }, { token: HomedecoratorAppEventService }], target: i0.ɵɵFactoryTarget.Component }); }
48800
48602
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: ToolbarComponent, isStandalone: false, selector: "rp-toolbar", inputs: { shareButton: "shareButton" }, outputs: { externalSave: "externalSave", externalOpen: "externalOpen" }, host: { listeners: { "document:keydown": "handleKeyDown($event)" } }, viewQueries: [{ propertyName: "leftSidebar", first: true, predicate: ["leftSidebar"], descendants: true, static: true }], ngImport: i0, template: `
48801
48603
  <!--
48802
48604
  <div class="layer layer&#45;&#45;toolbar">
@@ -49334,7 +49136,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
49334
49136
  ])
49335
49137
  ] /*,
49336
49138
  changeDetection: ChangeDetectionStrategy.OnPush*/, standalone: false, styles: [":host{display:flex;flex-direction:column;position:absolute;top:0;z-index:100;height:100%;width:100%;pointer-events:none}:host h2{font-weight:600}:host h3{font-weight:600}:host .mat-toolbar.mat-primary{box-shadow:none;padding:0;background:transparent;height:40px;justify-content:space-between}:host .mat-toolbar .mat-icon{height:20px;width:20px;font-size:20px;line-height:20px}:host .hd-toolbar-spacer{display:flex;flex-basis:100%}:host .toast-wrapper{height:auto;position:absolute;top:0;left:50%;-webkit-user-select:none;user-select:none;pointer-events:none;background:#74b77f;padding:30px;border-radius:0 0 10px 10px;min-width:150px;max-width:90%;color:#fff;text-align:center;transform:translate(-50%,-100%)}:host .toast-wrapper.warning{background:#f17300}:host .toast-wrapper.error{background:#cc2936}:host ::ng-deep .drawer__header{display:flex;align-items:center;min-height:40px;margin-bottom:16px}:host ::ng-deep .drawer__header h2{margin:0 auto 0 0;font-weight:600}:host ::ng-deep .mat-headline-6{font-weight:600}:host ::ng-deep .mat-subtitle-1{font-weight:600}:host ::ng-deep mat-tab-header,:host ::ng-deep .FileDrop{margin-bottom:16px}:host ::ng-deep .tab--skin ::ng-deep .mat-tab-label{height:52px;min-width:auto}:host ::ng-deep .drawer p{white-space:pre-wrap}:host ::ng-deep .mat-divider{margin:16px 0 24px}:host ::ng-deep .mat-drawer-backdrop{display:none}.storage-error{min-width:30px;height:30px;display:flex;align-items:center;align-self:center;border-radius:50%;justify-content:center;background:#fff;color:#c00;font-size:25px;font-weight:700}.layer--toolbar{display:flex;flex-direction:column}.toolbar{display:flex;z-index:101;flex-wrap:nowrap}.toolbar .menu-icon{min-width:50px;display:flex;justify-content:center;margin-left:-16px}.toolbar .left-toolbar,.toolbar .right-toolbar{display:flex;align-items:center;background:#da9803;border-radius:0 0 10px;padding:0 20px 0 10px;box-shadow:0 3px 6px #00000029,0 3px 6px #0000003b;height:100%;gap:12px}.toolbar .right-toolbar{border-radius:0 0 0 10px;padding:0 5px 0 10px}.toolbar .right-toolbar.modified{padding:0 5px 0 0}.toolbar .share-button{height:100%;padding:0 15px;border-radius:0 0 0 10px;border:none;color:#fff;background-color:#2c67ff;cursor:pointer}.toolbar .toolbar-icon-list{display:flex;align-items:center;justify-content:center}.toolbar .toolbar-icon-sub{display:flex;align-items:center;justify-content:center;padding:0 10px;gap:5px;border-right:1px solid rgba(255,255,255,.3803921569)}.toolbar .toolbar-icon-sub:last-child{border-right:none}.toolbar .toolbar-icon-sub:first-child{border-left:1px solid rgba(255,255,255,.3803921569);margin-left:10px}.toolbar .toolbar-icon{height:30px;width:30px;display:flex;align-items:center;justify-content:center;cursor:pointer}.toolbar .toolbar-icon co-icon ::ng-deep{width:20px;height:20px}.toolbar .toolbar-icon co-icon ::ng-deep svg,.toolbar .toolbar-icon co-icon ::ng-deep path{fill:#fff}.toolbar .toolbar-icon co-icon.loading-green ::ng-deep svg,.toolbar .toolbar-icon co-icon.loading-green ::ng-deep path{fill:#74b77f}.toolbar .toolbar-icon co-icon.loading-orange ::ng-deep svg,.toolbar .toolbar-icon co-icon.loading-orange ::ng-deep path{fill:#f17300}.toolbar .toolbar-icon co-icon.loading-yellow ::ng-deep svg,.toolbar .toolbar-icon co-icon.loading-yellow ::ng-deep path{fill:#cc2936}.toolbar .toolbar-icon co-icon.loading-red ::ng-deep svg,.toolbar .toolbar-icon co-icon.loading-red ::ng-deep path{fill:#cc2936}.toolbar .toolbar-icon.search co-icon{height:30px;width:30px}.toolbar .toolbar-icon.disabled{cursor:default}.toolbar .toolbar-icon.disabled co-icon ::ng-deep svg{fill:#00000042}.toolbar-logo{height:20px}.secondary-logo{margin-left:20px}.toolbar__nav{display:flex;flex-direction:row;padding-top:0}.toolbar__nav .mat-mdc-list-item{color:#fff;height:40px}.toolbar-row{flex:auto;display:flex;flex-direction:column;padding:0;pointer-events:none;position:relative;align-items:baseline;height:100%}::ng-deep mat-toolbar-row .toolbar--secondary{width:50px;padding:15px 0;flex-direction:column;background:#17253391;height:100%;gap:5px}::ng-deep mat-toolbar-row .toolbar--secondary button ::ng-deep{width:30px;height:30px;line-height:30px;color:#fff;display:flex;justify-content:center}::ng-deep mat-toolbar-row .toolbar--secondary .add-to-cart-button button ::ng-deep{color:#da9803}.toolbar--secondary .drawer{flex:auto;pointer-events:none;background:transparent}.wip-card{margin-left:5px;padding:0 10px;color:#fff;background-color:#7a828a}.wip-card .mat-mdc-card-content{font-size:12px}.drawer-container{position:static;box-shadow:0 1px 3px #0000001f,0 1px 2px #0000003d}.drawer{width:420px;padding:16px;display:flex;flex-direction:column;left:50px}::ng-deep rp-category-library .mat-mdc-list-item ::ng-deep{border-color:#747c84}::ng-deep rp-category-library .mdc-list-item__primary-text{color:#000}::ng-deep rp-category-library .mdc-list-item:hover .mdc-list-item__primary-text{color:#000}.toolbar,.toolbar--secondary>*,.drawer-container>*,.drawer>*{pointer-events:all}.drawer__button{min-width:initial;padding:0;border:none;position:absolute;top:0;right:0;border-radius:50%}.blinker{animation:blinker 1s linear infinite}.badge-tooltip{position:relative}.badge-tooltip .mat-badge{position:absolute;margin:0;display:flex;align-items:center;justify-content:center;right:-2px;bottom:13px}.badge-tooltip .mat-badge .mat-badge-content{background-color:transparent;color:#b71c1c;border:1px solid #b71c1c;animation:bounce 2s ease-out;animation-iteration-count:infinite;right:initial;left:initial;position:relative;height:12px;width:12px;line-height:12px;font-size:10px;bottom:initial}::ng-deep .tooltip-red{background:#b71c1c}@keyframes bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(1.1,.9) translateY(0)}30%{transform:scale(.9,1.1) translateY(-20px)}50%{transform:scale(1.05,.95) translateY(0)}57%{transform:scale(1) translateY(-7px)}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes blinker{50%{opacity:0}}::ng-deep .mat-mdc-menu-panel{width:256px!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-content{display:flex;flex-direction:column;padding-left:10px;padding-right:10px}::ng-deep mat-drawer-content.mat-drawer-content{display:flex;height:100%;flex-direction:column}\n"] }]
49337
- }], ctorParameters: () => [{ type: AppStateService }, { type: PresetsService }, { type: MessageBusService }, { type: HomedecoratorSettingsService }, { type: LocalStorageService }, { type: HomedecoratorIconCacheService }, { type: ScreenSizeAnalysisService }, { type: i1$2.MatDialog }, { type: ToastService }, { type: HomedecoratorAppService }, { type: PermanentStoreService }, { type: UtilsService }, { type: ItemService }, { type: FloorService }, { type: AnimationService }, { type: DevelopmentService }, { type: NewRenderService }, { type: ThirdPartyModelService }, { type: LightPresetsService }, { type: HomedecoratorConnectorAdapterService }, { type: ConnectionHeathService }, { type: HomedecoratorAppEventService }], propDecorators: { shareButton: [{
49139
+ }], ctorParameters: () => [{ type: AppStateService }, { type: PresetsService }, { type: MessageBusService }, { type: HomedecoratorSettingsService }, { type: LocalStorageService }, { type: HomedecoratorIconCacheService }, { type: ScreenSizeAnalysisService }, { type: i1$2.MatDialog }, { type: ToastService }, { type: HomedecoratorAppService }, { type: PermanentStoreService }, { type: UtilsService }, { type: ItemService }, { type: FloorService }, { type: AnimationService }, { type: DevelopmentService }, { type: RenderService }, { type: ThirdPartyModelService }, { type: LightPresetsService }, { type: HomedecoratorConnectorAdapterService }, { type: ConnectionHeathService }, { type: HomedecoratorAppEventService }], propDecorators: { shareButton: [{
49338
49140
  type: Input
49339
49141
  }], externalSave: [{
49340
49142
  type: Output
@@ -49408,28 +49210,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
49408
49210
  type: Output
49409
49211
  }] } });
49410
49212
 
49411
- // A pipe for appending strings to other strings in view templates.
49412
- class AppendPipe {
49413
- transform(value, append) {
49414
- if (!value) {
49415
- return '';
49416
- }
49417
- if (!append) {
49418
- return value;
49419
- }
49420
- return value + append;
49421
- }
49422
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppendPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
49423
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: AppendPipe, isStandalone: false, name: "append" }); }
49424
- }
49425
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppendPipe, decorators: [{
49426
- type: Pipe,
49427
- args: [{
49428
- name: 'append',
49429
- standalone: false
49430
- }]
49431
- }] });
49432
-
49433
49213
  class ProductCatalogComponent {
49434
49214
  get shown() {
49435
49215
  return this._showCatalog;
@@ -49844,7 +49624,7 @@ class HomedecoratorComponent {
49844
49624
  return this._settings;
49845
49625
  }
49846
49626
  constructor(appService, // don't remove this, needs to be created on a high level
49847
- controllerService, appState, presetsService, screenAnalysis, _iconRegistry, _domSanitizer, _messageService, _homedecoratorService, _parentEventService, _ownEventService, _integrationService, _sceneService, _webWorkerService) {
49627
+ controllerService, appState, presetsService, screenAnalysis, _iconRegistry, _domSanitizer, _messageService, _homedecoratorService, _parentEventService, _ownEventService, _integrationService, _sceneService, _webWorkerService, _configurationPresetLoadService) {
49848
49628
  this.appService = appService;
49849
49629
  this.controllerService = controllerService;
49850
49630
  this.appState = appState;
@@ -49859,6 +49639,7 @@ class HomedecoratorComponent {
49859
49639
  this._integrationService = _integrationService;
49860
49640
  this._sceneService = _sceneService;
49861
49641
  this._webWorkerService = _webWorkerService;
49642
+ this._configurationPresetLoadService = _configurationPresetLoadService;
49862
49643
  this.generalFilterOrders = [
49863
49644
  { name: 'CATEGORY', order: 1 },
49864
49645
  { name: 'TURNOVER_GROUP', order: 2 },
@@ -49975,6 +49756,14 @@ class HomedecoratorComponent {
49975
49756
  else {
49976
49757
  this._startWithEmptyRoom(true);
49977
49758
  }
49759
+ if (this.loadWithConfigurationPreset && this.loadWithConfigurationPreset.instanceId && this.loadWithConfigurationPreset.sku) {
49760
+ if (this.loadWithConfigurationPreset.externalSourceId) {
49761
+ this._configurationPresetLoadService.externalSourceId = this.loadWithConfigurationPreset.externalSourceId;
49762
+ }
49763
+ // We need to load a preset AFTER we get in 3d space.
49764
+ this._configurationPresetLoadService.instanceId = this.loadWithConfigurationPreset.instanceId;
49765
+ this._configurationPresetLoadService.sku = this.loadWithConfigurationPreset.sku;
49766
+ }
49978
49767
  }
49979
49768
  }));
49980
49769
  }
@@ -50067,8 +49856,8 @@ class HomedecoratorComponent {
50067
49856
  _initConnection() {
50068
49857
  this._homedecoratorService.init(this._settings);
50069
49858
  }
50070
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HomedecoratorComponent, deps: [{ token: HomedecoratorAppService }, { token: HomedecoratorConnectorService }, { token: AppStateService }, { token: PresetsService }, { token: ScreenSizeAnalysisService }, { token: i3$2.MatIconRegistry }, { token: i1$1.DomSanitizer }, { token: MessageBusService }, { token: HomedecoratorService }, { token: HomedecoratorAppEventService, optional: true, skipSelf: true }, { token: HomedecoratorAppEventService, optional: true, self: true }, { token: IntegrationService }, { token: SceneService }, { token: WebWorkerService }], target: i0.ɵɵFactoryTarget.Component }); }
50071
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: HomedecoratorComponent, isStandalone: false, selector: "co-homedecorator", inputs: { generalFilterOrders: "generalFilterOrders", purchaseFilterOrders: "purchaseFilterOrders", logisticsFilterOrders: "logisticsFilterOrders", initCommunication: "initCommunication", projectToLoad: "projectToLoad", shareButton: "shareButton", settings: "settings" }, host: { listeners: { "document:keyup": "keyup($event)" }, properties: { "class.co-homedecorator": "this.showClass" } }, providers: [
49859
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HomedecoratorComponent, deps: [{ token: HomedecoratorAppService }, { token: HomedecoratorConnectorService }, { token: AppStateService }, { token: PresetsService }, { token: ScreenSizeAnalysisService }, { token: i3$2.MatIconRegistry }, { token: i1$1.DomSanitizer }, { token: MessageBusService }, { token: HomedecoratorService }, { token: HomedecoratorAppEventService, optional: true, skipSelf: true }, { token: HomedecoratorAppEventService, optional: true, self: true }, { token: IntegrationService }, { token: SceneService }, { token: WebWorkerService }, { token: ConfigurationPresetLoadService }], target: i0.ɵɵFactoryTarget.Component }); }
49860
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: HomedecoratorComponent, isStandalone: false, selector: "co-homedecorator", inputs: { generalFilterOrders: "generalFilterOrders", purchaseFilterOrders: "purchaseFilterOrders", logisticsFilterOrders: "logisticsFilterOrders", initCommunication: "initCommunication", projectToLoad: "projectToLoad", shareButton: "shareButton", loadWithConfigurationPreset: "loadWithConfigurationPreset", settings: "settings" }, host: { listeners: { "document:keyup": "keyup($event)" }, properties: { "class.co-homedecorator": "this.showClass" } }, providers: [
50072
49861
  APPLICATION_SERVICES_PROVIDERS
50073
49862
  ], ngImport: i0, template: `
50074
49863
  @if (loaded) {
@@ -50091,7 +49880,6 @@ class HomedecoratorComponent {
50091
49880
  [purchaseFilterOrders]="purchaseFilterOrders"
50092
49881
  [logisticsFilterOrders]="logisticsFilterOrders"
50093
49882
  ></rp-product-catalog>
50094
- <co-lite-selector></co-lite-selector>
50095
49883
  <rp-help></rp-help>
50096
49884
  </rp-loading-overlay>
50097
49885
  </div>
@@ -50110,7 +49898,7 @@ class HomedecoratorComponent {
50110
49898
  </div>
50111
49899
  }
50112
49900
  }
50113
- `, isInline: true, dependencies: [{ kind: "component", type: ProgressBarComponent, selector: "progress-bar" }, { kind: "component", type: LoadingOverlayComponent, selector: "rp-loading-overlay" }, { kind: "component", type: HdLoaderComponent, selector: "rp-loader", inputs: ["show"] }, { kind: "component", type: Core3dComponent, selector: "rp-core3d" }, { kind: "component", type: RoomPlannerComponent, selector: "rp-room-planner", inputs: ["isLoading"], outputs: ["done", "showPlugin", "focusControls"] }, { kind: "component", type: FurnitureManagerComponent, selector: "rp-furniture-manager" }, { kind: "component", type: PresetsComponent, selector: "rp-presets", inputs: ["openNewRoomDialog"] }, { kind: "component", type: ThreedselectorComponent, selector: "rp-threedselector", inputs: ["selections"], outputs: ["customizeButtonClicked"] }, { kind: "component", type: ToolbarComponent, selector: "rp-toolbar", inputs: ["shareButton"], outputs: ["externalSave", "externalOpen"] }, { kind: "component", type: ProductCatalogComponent, selector: "rp-product-catalog", inputs: ["generalFilterOrders", "purchaseFilterOrders", "logisticsFilterOrders"] }, { kind: "component", type: HelpComponent, selector: "rp-help" }, { kind: "component", type: i27.LiteSelectorComponent, selector: "co-lite-selector", inputs: ["show", "showLabel", "canClose", "animateSlideout", "customDimensions"], outputs: ["showChange", "answerChosen"] }], encapsulation: i0.ViewEncapsulation.None }); }
49901
+ `, isInline: true, dependencies: [{ kind: "component", type: ProgressBarComponent, selector: "progress-bar" }, { kind: "component", type: LoadingOverlayComponent, selector: "rp-loading-overlay" }, { kind: "component", type: HdLoaderComponent, selector: "rp-loader", inputs: ["show"] }, { kind: "component", type: Core3dComponent, selector: "rp-core3d" }, { kind: "component", type: RoomPlannerComponent, selector: "rp-room-planner", inputs: ["isLoading"], outputs: ["done", "showPlugin", "focusControls"] }, { kind: "component", type: FurnitureManagerComponent, selector: "rp-furniture-manager" }, { kind: "component", type: PresetsComponent, selector: "rp-presets", inputs: ["openNewRoomDialog"] }, { kind: "component", type: ThreedselectorComponent, selector: "rp-threedselector", inputs: ["selections"], outputs: ["customizeButtonClicked"] }, { kind: "component", type: ToolbarComponent, selector: "rp-toolbar", inputs: ["shareButton"], outputs: ["externalSave", "externalOpen"] }, { kind: "component", type: ProductCatalogComponent, selector: "rp-product-catalog", inputs: ["generalFilterOrders", "purchaseFilterOrders", "logisticsFilterOrders"] }, { kind: "component", type: HelpComponent, selector: "rp-help" }], encapsulation: i0.ViewEncapsulation.None }); }
50114
49902
  }
50115
49903
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HomedecoratorComponent, decorators: [{
50116
49904
  type: Component,
@@ -50137,7 +49925,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
50137
49925
  [purchaseFilterOrders]="purchaseFilterOrders"
50138
49926
  [logisticsFilterOrders]="logisticsFilterOrders"
50139
49927
  ></rp-product-catalog>
50140
- <co-lite-selector></co-lite-selector>
50141
49928
  <rp-help></rp-help>
50142
49929
  </rp-loading-overlay>
50143
49930
  </div>
@@ -50171,7 +49958,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
50171
49958
  type: Optional
50172
49959
  }, {
50173
49960
  type: Self
50174
- }] }, { type: IntegrationService }, { type: SceneService }, { type: WebWorkerService }], propDecorators: { generalFilterOrders: [{
49961
+ }] }, { type: IntegrationService }, { type: SceneService }, { type: WebWorkerService }, { type: ConfigurationPresetLoadService }], propDecorators: { generalFilterOrders: [{
50175
49962
  type: Input
50176
49963
  }], purchaseFilterOrders: [{
50177
49964
  type: Input
@@ -50183,6 +49970,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
50183
49970
  type: Input
50184
49971
  }], shareButton: [{
50185
49972
  type: Input
49973
+ }], loadWithConfigurationPreset: [{
49974
+ type: Input
50186
49975
  }], settings: [{
50187
49976
  type: Input
50188
49977
  }], showClass: [{
@@ -51507,7 +51296,8 @@ class RoomPlannerModule {
51507
51296
  CustomShapeCreatorComponent,
51508
51297
  WallLengthInputComponent,
51509
51298
  CustomCylinderCreatorComponent,
51510
- SelectedObjectScaleComponent], imports: [CoreModule,
51299
+ SelectedObjectScaleComponent,
51300
+ ConfigurationPresetLoaderComponent], imports: [CoreModule,
51511
51301
  CategoryLibraryModule,
51512
51302
  CommonModule,
51513
51303
  ContextMenuModule,
@@ -51647,7 +51437,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
51647
51437
  CustomShapeCreatorComponent,
51648
51438
  WallLengthInputComponent,
51649
51439
  CustomCylinderCreatorComponent,
51650
- SelectedObjectScaleComponent
51440
+ SelectedObjectScaleComponent,
51441
+ ConfigurationPresetLoaderComponent
51651
51442
  ],
51652
51443
  providers: [
51653
51444
  CollisionManagerService,