architwin 1.16.6 → 1.16.9
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.
- package/.yarn/install-state.gz +0 -0
- package/lib/architwin.d.ts +2 -1
- package/lib/architwin.js +8733 -1
- package/lib/atwinui/components/toolbar/i18n.js +4 -2
- package/lib/atwinui/components/toolbar/spacePartition/roomFormPane.js +114 -89
- package/lib/atwinui/components/toolbar/spacePartition/roomTreePane.d.ts +5 -0
- package/lib/atwinui/components/toolbar/spacePartition/roomTreePane.js +34 -22
- package/lib/atwinui/components/toolbar/themePane.js +3 -1
- package/lib/loaders/polydrawerLoader.js +46 -46
- package/lib/minimap.d.ts +1 -1
- package/lib/minimap.js +9 -5
- package/lib/superviz.d.ts +6 -6
- package/lib/types.d.ts +1 -0
- package/lib/types.js +1 -0
- package/package.json +2 -2
- package/lib/actionPartitionHistory.d.ts +0 -17
- package/lib/actionPartitionHistory.js +0 -62
|
@@ -279,7 +279,8 @@ i18n
|
|
|
279
279
|
"PleaseOffDrawingMode": "Action cannot be done, please turn off drawing mode.",
|
|
280
280
|
"IotCategoryRequired": "IoT Category is required",
|
|
281
281
|
"SuccessUpdatedFloorLevel": "Updated the partition's floor level",
|
|
282
|
-
"DuplicatePartitionName": "This partition name is already used in this room. Please choose a different name."
|
|
282
|
+
"DuplicatePartitionName": "This partition name is already used in this room. Please choose a different name.",
|
|
283
|
+
"PleaseOnPolygonVisibility": "Action cannot be done, please turn on room visibility.",
|
|
283
284
|
}
|
|
284
285
|
},
|
|
285
286
|
ja: {
|
|
@@ -553,7 +554,8 @@ i18n
|
|
|
553
554
|
"Successfully Deleted Tag": "タグを削除しました",
|
|
554
555
|
"IotCategoryRequired": "IoTカテゴリは必須です",
|
|
555
556
|
"SuccessUpdatedFloorLevel": "区画のフロアオフセット値が更新されました",
|
|
556
|
-
"DuplicatePartitionName": "このパーティション名は既にこの部屋で使用されています。別の名前を選択してください。"
|
|
557
|
+
"DuplicatePartitionName": "このパーティション名は既にこの部屋で使用されています。別の名前を選択してください。",
|
|
558
|
+
"PleaseOnPolygonVisibility": "操作を行う前に、部屋の表示をオンにしてください。"
|
|
557
559
|
}
|
|
558
560
|
}
|
|
559
561
|
},
|
|
@@ -10,9 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
import i18n from '../i18n';
|
|
11
11
|
import { SPACE_EVENTS } from "../../../../types";
|
|
12
12
|
import { batchAddEventListenerByClassName, notyf } from "../../../events";
|
|
13
|
-
import { startDraw, cancelDraw, disposeModel, _3DXObjects, getCurrentPolygon, dispatchSpaceEvent, enableVerticeControls, setCurrentPolygon, setMeshChildrenMaterialProperty, get3DXObjects, getChildrenOfModel, clearSelectedObject, renderPolygon, setWallBaseHeight, clearWallBaseHeight, setDrawingConfig, resetDrawingConfig, goToPosition, partitionHistory, hasTimeElapsed } from '../../../../architwin';
|
|
13
|
+
import { startDraw, cancelDraw, disposeModel, _3DXObjects, getCurrentPolygon, dispatchSpaceEvent, enableVerticeControls, setCurrentPolygon, setMeshChildrenMaterialProperty, get3DXObjects, getChildrenOfModel, clearSelectedObject, renderPolygon, setWallBaseHeight, clearWallBaseHeight, setDrawingConfig, resetDrawingConfig, goToPosition, partitionHistory, hasTimeElapsed, getIsPolygonVisible } from '../../../../architwin';
|
|
14
14
|
import { generateUUID, extractUUID } from '../../../../utils';
|
|
15
|
-
import { getCurrentEditRoomData } from './roomTreePane';
|
|
15
|
+
import { getCurrentEditRoomData, toggleRoomTreeClickDisability } from './roomTreePane';
|
|
16
16
|
import { toggleModal, setModalAction } from "../modal";
|
|
17
17
|
import { Notyf } from 'notyf';
|
|
18
18
|
import log from 'loglevel';
|
|
@@ -203,107 +203,120 @@ export function renderRoomFormPane() {
|
|
|
203
203
|
*/
|
|
204
204
|
export function toggleDrawPartitionButton() {
|
|
205
205
|
console.log("toggleDrawPartitionButton()");
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
const partitionList = document.getElementById('at-partition-list-container');
|
|
212
|
-
const vertexList = document.getElementById('at-face-vertex-container');
|
|
213
|
-
const partitionNameInput = document.getElementById('at-edit-partition-name-input');
|
|
214
|
-
partitionNameInput.value = '';
|
|
215
|
-
const formMode = getPartitionFormMode();
|
|
216
|
-
if (formMode == "ADD" /* FORM_MODE.ADD */) {
|
|
217
|
-
tempCurrentPolygon = getCurrentPolygon();
|
|
206
|
+
const isPolygonVisible = getIsPolygonVisible();
|
|
207
|
+
log.info("isPolygonVisible", isPolygonVisible);
|
|
208
|
+
if (isPolygonVisible) {
|
|
209
|
+
if (!isDrawing) {
|
|
210
|
+
startDrawing();
|
|
218
211
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
212
|
+
else {
|
|
213
|
+
const partitionItem = document.getElementById('at-partition-item-container');
|
|
214
|
+
const partitionList = document.getElementById('at-partition-list-container');
|
|
215
|
+
const vertexList = document.getElementById('at-face-vertex-container');
|
|
216
|
+
const partitionNameInput = document.getElementById('at-edit-partition-name-input');
|
|
217
|
+
partitionNameInput.value = '';
|
|
218
|
+
const formMode = getPartitionFormMode();
|
|
219
|
+
if (formMode == "ADD" /* FORM_MODE.ADD */) {
|
|
220
|
+
tempCurrentPolygon = getCurrentPolygon();
|
|
221
|
+
}
|
|
222
|
+
cancelDrawing();
|
|
223
|
+
goBackToPartitionList();
|
|
224
|
+
if (currentPartitionDataArray.length !== 0) {
|
|
225
|
+
partitionItem.style.display = 'flex';
|
|
226
|
+
vertexList.style.display = 'none';
|
|
227
|
+
partitionList.style.justifyContent = 'start';
|
|
228
|
+
}
|
|
229
|
+
currentPolygonData = null;
|
|
230
|
+
currentPartitionData = null;
|
|
231
|
+
isEditPartition = false;
|
|
232
|
+
previousPartitionData = null;
|
|
225
233
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
234
|
+
partitionHistory.clearHistory();
|
|
235
|
+
toggleUndoRedoButtons(false, false);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
notify.error(i18n.t("PleaseOnPolygonVisibility"));
|
|
230
239
|
}
|
|
231
|
-
partitionHistory.clearHistory();
|
|
232
|
-
toggleUndoRedoButtons(false, false);
|
|
233
240
|
}
|
|
234
241
|
export function toggleDrawWindowButton() {
|
|
235
242
|
var _a, _b, _c;
|
|
236
243
|
log.info("toggleDrawWindowButton()", getCurrentPolygon(), _3DXObjects);
|
|
237
244
|
setCurrentPolygon(undefined);
|
|
238
245
|
const addDoorButton = document.getElementById('at-add-window-door-btn');
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
log.info("objectIndex", objectIndex);
|
|
254
|
-
drawingConfig = {
|
|
255
|
-
lineTypeComponentConfig: {
|
|
256
|
-
renderPolygonOnAdd: false,
|
|
257
|
-
drawingMode: drawingMode,
|
|
258
|
-
targetIndex: (_c = currentEditWindowIndex !== null && currentEditWindowIndex !== void 0 ? currentEditWindowIndex : (_b = currentWall.windows) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0,
|
|
259
|
-
polygonData: currentPolygonData,
|
|
260
|
-
targetUUID: currentWall.uuid,
|
|
261
|
-
objectIndex: objectIndex
|
|
246
|
+
const isPolygonVisible = getIsPolygonVisible();
|
|
247
|
+
if (isPolygonVisible) {
|
|
248
|
+
if (!isDrawing) {
|
|
249
|
+
isDrawing = true;
|
|
250
|
+
drawingMode = 'window';
|
|
251
|
+
// clearSelectedObject()
|
|
252
|
+
if (!isEditWindow) {
|
|
253
|
+
addDoorButton.classList.remove('at_add_window_door_btn');
|
|
254
|
+
addDoorButton.classList.add('at_add_window_door_btn_active');
|
|
255
|
+
addDoorButton.innerHTML = `
|
|
256
|
+
${i18n.t('DoneDrawing')}
|
|
257
|
+
<span class="mdi mdi-check-bold"></span>
|
|
258
|
+
`;
|
|
259
|
+
currentWindowIndex = (_a = currentWall.windows) === null || _a === void 0 ? void 0 : _a.length;
|
|
262
260
|
}
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
addDoorButton.classList.add('at_add_window_door_btn');
|
|
275
|
-
addDoorButton.innerHTML = `
|
|
276
|
-
${i18n.t('AddWindowDoor')}
|
|
277
|
-
<span class="mdi mdi-window-closed-variant"></span>
|
|
278
|
-
`;
|
|
279
|
-
cancelDraw();
|
|
280
|
-
resetDrawingConfig();
|
|
281
|
-
setCurrentPolygon(currentObject);
|
|
282
|
-
let payload;
|
|
283
|
-
if (currentPartitionData) {
|
|
284
|
-
payload = {
|
|
285
|
-
uuid: currentPartitionData.uuid,
|
|
286
|
-
polygon_json: currentPolygonData
|
|
261
|
+
const objectIndex = _3DXObjects.findIndex(obj => obj.object.id == currentObject.object.id);
|
|
262
|
+
log.info("objectIndex", objectIndex);
|
|
263
|
+
drawingConfig = {
|
|
264
|
+
lineTypeComponentConfig: {
|
|
265
|
+
renderPolygonOnAdd: false,
|
|
266
|
+
drawingMode: drawingMode,
|
|
267
|
+
targetIndex: (_c = currentEditWindowIndex !== null && currentEditWindowIndex !== void 0 ? currentEditWindowIndex : (_b = currentWall.windows) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0,
|
|
268
|
+
polygonData: currentPolygonData,
|
|
269
|
+
targetUUID: currentWall.uuid,
|
|
270
|
+
objectIndex: objectIndex
|
|
271
|
+
}
|
|
287
272
|
};
|
|
273
|
+
log.info("drawingConfig", drawingConfig);
|
|
274
|
+
setDrawingConfig(drawingConfig);
|
|
275
|
+
startDraw();
|
|
288
276
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
277
|
+
else {
|
|
278
|
+
isDrawing = false;
|
|
279
|
+
drawingMode = null;
|
|
280
|
+
currentWindowIndex = null;
|
|
281
|
+
currentPartitionData.polygon_json = JSON.stringify(currentPolygonData);
|
|
282
|
+
addDoorButton.classList.remove('at_add_window_door_btn_active');
|
|
283
|
+
addDoorButton.classList.add('at_add_window_door_btn');
|
|
284
|
+
addDoorButton.innerHTML = `
|
|
285
|
+
${i18n.t('AddWindowDoor')}
|
|
286
|
+
<span class="mdi mdi-window-closed-variant"></span>
|
|
287
|
+
`;
|
|
288
|
+
cancelDraw();
|
|
289
|
+
resetDrawingConfig();
|
|
290
|
+
setCurrentPolygon(currentObject);
|
|
291
|
+
let payload;
|
|
292
|
+
if (currentPartitionData) {
|
|
293
|
+
payload = {
|
|
294
|
+
uuid: currentPartitionData.uuid,
|
|
295
|
+
polygon_json: currentPolygonData
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
// Re-render polygon
|
|
299
|
+
renderPolygon(payload);
|
|
300
|
+
const objectIndex = _3DXObjects.findIndex(obj => obj.object.object_id == currentObject.object.object_id);
|
|
301
|
+
if (objectIndex != null) {
|
|
302
|
+
log.info("objectIndex", objectIndex);
|
|
303
|
+
if (_3DXObjects[objectIndex].children) {
|
|
304
|
+
_3DXObjects[objectIndex].children.map((win) => __awaiter(this, void 0, void 0, function* () {
|
|
305
|
+
var _d;
|
|
306
|
+
log.info("WIND", win);
|
|
307
|
+
if (win.index == ((_d = currentWall.windows) === null || _d === void 0 ? void 0 : _d.length) - 1 && win.wallUUID == currentWall.uuid) {
|
|
308
|
+
yield disposeModel(win);
|
|
309
|
+
}
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
302
312
|
}
|
|
303
313
|
}
|
|
314
|
+
partitionHistory.clearHistory();
|
|
315
|
+
toggleUndoRedoButtons(false, false);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
notify.error(i18n.t("PleaseOnPolygonVisibility"));
|
|
304
319
|
}
|
|
305
|
-
partitionHistory.clearHistory();
|
|
306
|
-
toggleUndoRedoButtons(false, false);
|
|
307
320
|
}
|
|
308
321
|
/**
|
|
309
322
|
* Displays the partition form based on the current form mode.
|
|
@@ -427,7 +440,13 @@ function displayPartitions(partitions) {
|
|
|
427
440
|
// Set up event listener for the partition edit button
|
|
428
441
|
batchAddEventListenerByClassName('at_edit_partition_btn', (event) => {
|
|
429
442
|
console.log('Event', event);
|
|
430
|
-
|
|
443
|
+
const isPolygonVisible = getIsPolygonVisible();
|
|
444
|
+
if (isPolygonVisible) {
|
|
445
|
+
handlePartitionRowEditBtnClickEvent(partitions, event.target);
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
notify.error(i18n.t("PleaseOnPolygonVisibility"));
|
|
449
|
+
}
|
|
431
450
|
});
|
|
432
451
|
// Set up event listener for confirming partition name change
|
|
433
452
|
addEventListenerById('at-confirm-edit-partition-name', () => {
|
|
@@ -934,6 +953,11 @@ function setupEditWindow(element, window) {
|
|
|
934
953
|
return;
|
|
935
954
|
// Show inputs when edit icon is clicked
|
|
936
955
|
editBtn.addEventListener("click", () => {
|
|
956
|
+
const isPolygonVisible = getIsPolygonVisible();
|
|
957
|
+
if (!isPolygonVisible) {
|
|
958
|
+
notify.error(`${i18n.t('PleaseOnPolygonVisibility')}`);
|
|
959
|
+
return;
|
|
960
|
+
}
|
|
937
961
|
if (isDrawing) {
|
|
938
962
|
notify.error(`${i18n.t('PleaseOffDrawingMode')}`);
|
|
939
963
|
return;
|
|
@@ -1498,6 +1522,7 @@ export function setPolygonData(payload) {
|
|
|
1498
1522
|
else {
|
|
1499
1523
|
setCurrentPartitionData(undefined);
|
|
1500
1524
|
}
|
|
1525
|
+
setTimeout(() => toggleRoomTreeClickDisability(false), 500);
|
|
1501
1526
|
}
|
|
1502
1527
|
/**
|
|
1503
1528
|
* Returns current polygon data
|
|
@@ -110,3 +110,8 @@ export declare function toggleHighlightedPartitionItem(partitionId: string): voi
|
|
|
110
110
|
export declare function calculateMidPoint(coords: Array<{
|
|
111
111
|
start: Vector3;
|
|
112
112
|
}>): Vector3;
|
|
113
|
+
/**
|
|
114
|
+
* Toggles Room Tree container capability to receive click events
|
|
115
|
+
* @param toggle - Boolean value that determines state of toggle to perform
|
|
116
|
+
*/
|
|
117
|
+
export declare function toggleRoomTreeClickDisability(toggle: boolean): void;
|
|
@@ -12,7 +12,7 @@ import { batchAddEventListenerByClassName, handleDeletePartition, handlePartitio
|
|
|
12
12
|
import i18n from "../i18n";
|
|
13
13
|
import { getCurrentPolygonData, handlePartitionRowEditBtnClickEvent, handlePartitionWallEditBtn, setCurrentEditWindowIndex, setDrawConfig, setDrawingMode, setIsEditWindow, setPartitionFormMode } from "./roomFormPane";
|
|
14
14
|
import { SPACE_EVENTS } from "../../../../types";
|
|
15
|
-
import { _3DXObjects, dispatchSpaceEvent, enableVerticeControls, getChildrenOfModel, goToModel, goToPosition,
|
|
15
|
+
import { _3DXObjects, dispatchSpaceEvent, enableVerticeControls, getChildrenOfModel, goToModel, goToPosition, renderPolygon, setSelectedObject } from "../../../../architwin";
|
|
16
16
|
import log from 'loglevel';
|
|
17
17
|
import { getShortcutTooltipHTML } from "../static/common";
|
|
18
18
|
let roomDataArray = [];
|
|
@@ -341,6 +341,7 @@ function toggleSelectedPartition() {
|
|
|
341
341
|
toggleDisplayPane(event.target.id);
|
|
342
342
|
}));
|
|
343
343
|
batchAddEventListenerByClassName('at_room_visible_btn', (event) => __awaiter(this, void 0, void 0, function* () {
|
|
344
|
+
toggleRoomTreeClickDisability(true);
|
|
344
345
|
log.info('Event', event);
|
|
345
346
|
const target = event.target;
|
|
346
347
|
// Prevent event from propagating up to parent elements
|
|
@@ -352,27 +353,26 @@ function toggleSelectedPartition() {
|
|
|
352
353
|
}));
|
|
353
354
|
batchAddEventListenerByClassName('at_child_visible_btn', (event) => __awaiter(this, void 0, void 0, function* () {
|
|
354
355
|
var _a;
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
}
|
|
356
|
+
toggleRoomTreeClickDisability(true);
|
|
357
|
+
const target = event.currentTarget;
|
|
358
|
+
const li = target.closest('li');
|
|
359
|
+
if ((_a = li === null || li === void 0 ? void 0 : li.getAttribute('id')) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes('window')) {
|
|
360
|
+
event.stopPropagation();
|
|
361
|
+
handleWindowVisibility(target, true);
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
const wallId = target.getAttribute('polygon-item-id');
|
|
365
|
+
const windowItems = document.querySelectorAll(`li.at_window_row_item[wall-id="${wallId}"]`);
|
|
366
|
+
yield new Promise(resolve => setTimeout(resolve, 1));
|
|
367
|
+
yield new Promise(resolve => requestAnimationFrame(resolve));
|
|
368
|
+
const parentVisibleState = yield handlePolygonVisibility(target.id);
|
|
369
|
+
if (windowItems && windowItems.length > 0) {
|
|
370
|
+
windowItems.forEach((windowLi) => {
|
|
371
|
+
const visibilityBtn = windowLi.querySelector('.at_child_visible_btn');
|
|
372
|
+
if (visibilityBtn) {
|
|
373
|
+
handleWindowVisibility(visibilityBtn, false, parentVisibleState);
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
376
|
}
|
|
377
377
|
}
|
|
378
378
|
}));
|
|
@@ -685,6 +685,7 @@ function updatePolygonData(currPartition, isVisible, isUpdateAllChildren) {
|
|
|
685
685
|
}
|
|
686
686
|
currPartition.polygon_json = JSON.stringify(polygonJson);
|
|
687
687
|
log.info("updatePolygonData: ", JSON.parse(currPartition.polygon_json));
|
|
688
|
+
toggleRoomTreeClickDisability(false); // enable back room tree for click events
|
|
688
689
|
// Dispatch event: PARTITION_EDITED
|
|
689
690
|
dispatchSpaceEvent(SPACE_EVENTS.PARTITION_EDITED, { data: currPartition, isUpdateTree: false });
|
|
690
691
|
});
|
|
@@ -921,3 +922,14 @@ export function calculateMidPoint(coords) {
|
|
|
921
922
|
z: sum.z / count
|
|
922
923
|
};
|
|
923
924
|
}
|
|
925
|
+
/**
|
|
926
|
+
* Toggles Room Tree container capability to receive click events
|
|
927
|
+
* @param toggle - Boolean value that determines state of toggle to perform
|
|
928
|
+
*/
|
|
929
|
+
export function toggleRoomTreeClickDisability(toggle) {
|
|
930
|
+
const roomTreeElement = document.getElementById('at-room-tree');
|
|
931
|
+
if (roomTreeElement) {
|
|
932
|
+
roomTreeElement.style.pointerEvents = toggle ? "none" : "auto";
|
|
933
|
+
roomTreeElement.style.opacity = toggle ? "0.5" : "1";
|
|
934
|
+
}
|
|
935
|
+
}
|
|
@@ -24,7 +24,9 @@ export function renderThemePane() {
|
|
|
24
24
|
<img class="at_image at_theme_image" src="${_mpConfig.bundlePath ? `https://cdn.jsdelivr.net/npm/architwin@latest/static/images/${theme}thumbnail.png` : `../../../../architwin/static/images/${theme}thumbnail.png`}" alt="Property Image" id="at-theme-card-image-${theme}" theme-id="${theme}">
|
|
25
25
|
<div style="padding:.5rem;" card-id="at-${theme}-card">
|
|
26
26
|
<div class="at_card-title">
|
|
27
|
-
|
|
27
|
+
<h2 class="at_title_small" id="at-theme-title-${theme}" data-cy="at-theme-title-${theme}">
|
|
28
|
+
${theme === "azusa" ? "DEFAULT" : theme.toUpperCase()}
|
|
29
|
+
</h2>
|
|
28
30
|
</div>
|
|
29
31
|
</div>
|
|
30
32
|
</div>
|
|
@@ -669,53 +669,53 @@ export class BufferGeometry {
|
|
|
669
669
|
}
|
|
670
670
|
this.groupedMesh.add(floorMesh);
|
|
671
671
|
try {
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
672
|
+
if (this.inputs.drawingMode == 'floor') {
|
|
673
|
+
let twiceSignedArea = 0;
|
|
674
|
+
let centroidX = 0;
|
|
675
|
+
let centroidZ = 0;
|
|
676
|
+
for (let i = 0; i < shapeCoords.length; i++) {
|
|
677
|
+
const p1 = shapeCoords[i];
|
|
678
|
+
const p2 = shapeCoords[(i + 1) % shapeCoords.length];
|
|
679
|
+
const cross = p1.x * p2.y - p2.x * p1.y;
|
|
680
|
+
twiceSignedArea += cross;
|
|
681
|
+
centroidX += (p1.x + p2.x) * cross;
|
|
682
|
+
centroidZ += (p1.y + p2.y) * cross;
|
|
683
|
+
}
|
|
684
|
+
let centerX;
|
|
685
|
+
let centerZ;
|
|
686
|
+
if (Math.abs(twiceSignedArea) > 1e-8) {
|
|
687
|
+
const polygonArea = twiceSignedArea * 0.5;
|
|
688
|
+
centerX = centroidX / (6 * polygonArea);
|
|
689
|
+
centerZ = centroidZ / (6 * polygonArea);
|
|
690
|
+
}
|
|
691
|
+
else {
|
|
692
|
+
// Fallback: average of vertices
|
|
693
|
+
const sum = shapeCoords.reduce((acc, p) => ({ x: acc.x + p.x, z: acc.z + p.y }), { x: 0, z: 0 });
|
|
694
|
+
centerX = sum.x / shapeCoords.length;
|
|
695
|
+
centerZ = sum.z / shapeCoords.length;
|
|
696
|
+
}
|
|
697
|
+
const floorMaterial = polyData && polyData.floor.material ? polyData.floor.material : undefined;
|
|
698
|
+
const floorLabelText = `Floor ${floorMaterial ? '_' + floorMaterial : ' (' + i18n.t('Area') + ')'} : ${floorDimension.area.toFixed(2)}m²`;
|
|
699
|
+
const floorCanvas = this.createLabelCanvas(floorLabelText);
|
|
700
|
+
const labelWidth = Math.max(1, Math.min(5, Math.sqrt(Math.max(0.0001, floorDimension.area))));
|
|
701
|
+
const labelHeight = labelWidth / 4;
|
|
702
|
+
const floorLabelGeometry = new THREE.PlaneGeometry(labelWidth, labelHeight);
|
|
703
|
+
const floorLabelMaterial = new THREE.MeshBasicMaterial({
|
|
704
|
+
map: new THREE.CanvasTexture(floorCanvas),
|
|
705
|
+
transparent: true,
|
|
706
|
+
side: THREE.DoubleSide,
|
|
707
|
+
});
|
|
708
|
+
const floorCenterLabel = new THREE.Mesh(floorLabelGeometry, floorLabelMaterial);
|
|
709
|
+
// Lay flat on the floor (XZ plane) and slightly offset in Y to avoid z-fighting
|
|
710
|
+
floorCenterLabel.rotation.x = -Math.PI / 2;
|
|
711
|
+
floorCenterLabel.position.set(centerX, floorLevel + 0.02, centerZ);
|
|
712
|
+
floorCenterLabel.name = this.inputs.uuid != '' ? `${this.inputs.uuid}_floorCenterLabel` : `floorCenterLabel`;
|
|
713
|
+
if (floorConfig && floorConfig.options) {
|
|
714
|
+
floorCenterLabel.visible = floorConfig.options.is_visible;
|
|
715
|
+
}
|
|
716
|
+
this.floorLabels.push(floorCenterLabel);
|
|
717
|
+
this.groupedMesh.add(floorCenterLabel);
|
|
716
718
|
}
|
|
717
|
-
this.floorLabels.push(floorCenterLabel);
|
|
718
|
-
this.groupedMesh.add(floorCenterLabel);
|
|
719
719
|
}
|
|
720
720
|
catch (e) {
|
|
721
721
|
log.error('Error creating floor center label', e);
|
package/lib/minimap.d.ts
CHANGED
|
@@ -39,7 +39,7 @@ declare function getFloorsInSpace(): FloorData[];
|
|
|
39
39
|
* @param mapId - id of an html element where the map will be attached to
|
|
40
40
|
* @returns
|
|
41
41
|
*/
|
|
42
|
-
declare function setStandaloneMap(modelId: string, appKey: string, mapId: string): Promise<void>;
|
|
42
|
+
declare function setStandaloneMap(modelId: string, appKey: string, mapId: string, floorSequence?: number): Promise<void>;
|
|
43
43
|
/**
|
|
44
44
|
* This function creates the dropdown (HTLMElement) for available positions that Minimap can be set
|
|
45
45
|
* @param mapPositions An array of strings representing the minimap positions (e.g., 'topLeft','bottomRight').
|
package/lib/minimap.js
CHANGED
|
@@ -795,6 +795,9 @@ function toggleMinimapFloor(action) {
|
|
|
795
795
|
toggleSweepMarkerFloors(sequence);
|
|
796
796
|
return floorMatch;
|
|
797
797
|
}
|
|
798
|
+
// function changeMinimapFloor(sequence: number): FloorData {
|
|
799
|
+
// _currentFloor = sequence
|
|
800
|
+
// }
|
|
798
801
|
/**
|
|
799
802
|
* Returns an array of objects containing the floor data of a space. This function will only have data if you are displaying
|
|
800
803
|
* a standalone minimap
|
|
@@ -809,8 +812,9 @@ function getFloorsInSpace() {
|
|
|
809
812
|
* @param mapId - id of an html element where the map will be attached to
|
|
810
813
|
* @returns
|
|
811
814
|
*/
|
|
812
|
-
function setStandaloneMap(modelId, appKey, mapId) {
|
|
815
|
+
function setStandaloneMap(modelId, appKey, mapId, floorSequence = 0) {
|
|
813
816
|
return __awaiter(this, void 0, void 0, function* () {
|
|
817
|
+
log.info("setStandaloneMap floor: ", floorSequence);
|
|
814
818
|
log.info("setStandaloneMap");
|
|
815
819
|
if (!modelId) {
|
|
816
820
|
log.error("modelId is undefined");
|
|
@@ -873,9 +877,9 @@ function setStandaloneMap(modelId, appKey, mapId) {
|
|
|
873
877
|
_mapContainer.appendChild(minimap);
|
|
874
878
|
}
|
|
875
879
|
//Set the current floor sequence for standalone as the first floor always so give it 0
|
|
876
|
-
_mapContainer.setAttribute('class', 'floor' +
|
|
877
|
-
_currentFloor = 0;
|
|
878
|
-
setImg(minimap,
|
|
880
|
+
_mapContainer.setAttribute('class', 'floor' + floorSequence);
|
|
881
|
+
_currentFloor = floorSequence !== null && floorSequence !== void 0 ? floorSequence : 0;
|
|
882
|
+
setImg(minimap, floorSequence, true);
|
|
879
883
|
document.body.classList.add('minimap');
|
|
880
884
|
if (sweepData && sweepData.data.model.locations.length > 0) {
|
|
881
885
|
sweepData.data.model.locations.forEach((swp, index) => {
|
|
@@ -903,7 +907,7 @@ function setStandaloneMap(modelId, appKey, mapId) {
|
|
|
903
907
|
}
|
|
904
908
|
});
|
|
905
909
|
}
|
|
906
|
-
toggleSweepMarkerFloors(
|
|
910
|
+
toggleSweepMarkerFloors(floorSequence);
|
|
907
911
|
});
|
|
908
912
|
}
|
|
909
913
|
/**
|
package/lib/superviz.d.ts
CHANGED
|
@@ -11,15 +11,15 @@ declare function createMeeting(spaceId?: string, hostName?: string, title?: stri
|
|
|
11
11
|
guest: string;
|
|
12
12
|
meeting_id: string;
|
|
13
13
|
}>;
|
|
14
|
-
declare function getMeeting(meetingId: string): Promise<import("axios").AxiosResponse<any, any>>;
|
|
15
|
-
declare function getSpaceMeetings(spaceId: number): Promise<import("axios").AxiosResponse<any, any>>;
|
|
14
|
+
declare function getMeeting(meetingId: string): Promise<import("axios").AxiosResponse<any, any, {}>>;
|
|
15
|
+
declare function getSpaceMeetings(spaceId: number): Promise<import("axios").AxiosResponse<any, any, {}>>;
|
|
16
16
|
declare function startMeeting(meetingUrl: string, meetingPassword?: string, meetingConfig?: MeetingConfig): Promise<void>;
|
|
17
17
|
declare function getMeetingParticipants(): IMpParticipant[];
|
|
18
18
|
declare function stopMeeting(): Promise<void>;
|
|
19
19
|
declare function isMeetingExists(meetingId: string): Promise<boolean>;
|
|
20
20
|
declare function isMeetingActive(meetingId: string): Promise<boolean>;
|
|
21
|
-
declare function updateMeetingTitle(meetingId: any, meetingTitle: any): Promise<import("axios").AxiosResponse<any, any>>;
|
|
22
|
-
declare function updateMeetingStart(meetingId: any, meetingStart: any): Promise<import("axios").AxiosResponse<any, any>>;
|
|
23
|
-
declare function updateMeetingSpace(meetingId: any, spaceId: any): Promise<import("axios").AxiosResponse<any, any>>;
|
|
24
|
-
declare function updateMeetingStatus(meetingId: any, meetingStatus: any): Promise<import("axios").AxiosResponse<any, any>>;
|
|
21
|
+
declare function updateMeetingTitle(meetingId: any, meetingTitle: any): Promise<import("axios").AxiosResponse<any, any, {}>>;
|
|
22
|
+
declare function updateMeetingStart(meetingId: any, meetingStart: any): Promise<import("axios").AxiosResponse<any, any, {}>>;
|
|
23
|
+
declare function updateMeetingSpace(meetingId: any, spaceId: any): Promise<import("axios").AxiosResponse<any, any, {}>>;
|
|
24
|
+
declare function updateMeetingStatus(meetingId: any, meetingStatus: any): Promise<import("axios").AxiosResponse<any, any, {}>>;
|
|
25
25
|
export { isMeetingInitialized, getMeetingParticipants, createMeeting, startMeeting, stopMeeting, generateMeetingURL, updateMeetingTitle, updateMeetingStart, updateMeetingStatus, updateMeetingSpace, getMeeting, getSpaceMeetings, isMeetingExists, isMeetingActive, };
|
package/lib/types.d.ts
CHANGED
|
@@ -760,6 +760,7 @@ export declare enum SPACE_EVENTS {
|
|
|
760
760
|
FLOOR_IMAGE_UPLOADED = "FLOOR_IMAGE_UPLOADED",
|
|
761
761
|
FLOOR_IMAGE_UPLOAD_FAILED = "FLOOR_IMAGE_UPLOAD_FAILED",
|
|
762
762
|
FLOOR_IMAGE_ROTATED = "FLOOR_IMAGE_ROTATED",
|
|
763
|
+
FLOOR_CHANGED = "FLOOR_CHANGED",
|
|
763
764
|
CUSTOM_SWEEP_SCALE_UPDATED = "CUSTOM_SWEEP_SCALE_UPDATED",
|
|
764
765
|
CUSTOM_SWEEP_TRANSLATE_UPDATED = "CUSTOM_SWEEP_TRANSLATE_UPDATED",
|
|
765
766
|
CUSTOM_SWEEP_OFFSETX_UPDATED = "CUSTOM_SWEEP_OFFSETX_UPDATED",
|
package/lib/types.js
CHANGED
|
@@ -103,6 +103,7 @@ export var SPACE_EVENTS;
|
|
|
103
103
|
SPACE_EVENTS["FLOOR_IMAGE_UPLOADED"] = "FLOOR_IMAGE_UPLOADED";
|
|
104
104
|
SPACE_EVENTS["FLOOR_IMAGE_UPLOAD_FAILED"] = "FLOOR_IMAGE_UPLOAD_FAILED";
|
|
105
105
|
SPACE_EVENTS["FLOOR_IMAGE_ROTATED"] = "FLOOR_IMAGE_ROTATED";
|
|
106
|
+
SPACE_EVENTS["FLOOR_CHANGED"] = "FLOOR_CHANGED";
|
|
106
107
|
SPACE_EVENTS["CUSTOM_SWEEP_SCALE_UPDATED"] = "CUSTOM_SWEEP_SCALE_UPDATED";
|
|
107
108
|
SPACE_EVENTS["CUSTOM_SWEEP_TRANSLATE_UPDATED"] = "CUSTOM_SWEEP_TRANSLATE_UPDATED";
|
|
108
109
|
SPACE_EVENTS["CUSTOM_SWEEP_OFFSETX_UPDATED"] = "CUSTOM_SWEEP_OFFSETX_UPDATED";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "architwin",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.9",
|
|
4
4
|
"description": "ArchiTwin Library for Matterport",
|
|
5
5
|
"main": "./lib/architwin.js",
|
|
6
6
|
"types": "./lib/architwin.d.ts",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"@superviz/matterport-plugin": "^0.8.8",
|
|
33
33
|
"@superviz/sdk": "^4.13.9",
|
|
34
34
|
"@zoom/videosdk": "^1.11.10",
|
|
35
|
-
"architwin": "1.
|
|
35
|
+
"architwin": "1.16.9",
|
|
36
36
|
"axios": "^1.4.0",
|
|
37
37
|
"buffer": "^6.0.3",
|
|
38
38
|
"date-fns": "^2.30.0",
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export declare class ActionPartitionHistory {
|
|
2
|
-
private history;
|
|
3
|
-
private index;
|
|
4
|
-
private current;
|
|
5
|
-
addToHistory(partition: any): void;
|
|
6
|
-
undo(): any;
|
|
7
|
-
redo(): any;
|
|
8
|
-
getCurrent(): any;
|
|
9
|
-
setCurrent(partition: any): any;
|
|
10
|
-
getAllHistory(): {
|
|
11
|
-
history: any[];
|
|
12
|
-
index: number;
|
|
13
|
-
};
|
|
14
|
-
clearHistory(): void;
|
|
15
|
-
canUndo(): boolean;
|
|
16
|
-
canRedo(): boolean;
|
|
17
|
-
}
|