import { blankUrn, utopiaUrn } from "@/components/viewer/utils/aps-init"; import { isNotNil } from "es-toolkit"; function isTemInsideLand(landBounds, temBounds) { const tolerance = 0.007; return ( landBounds.min.x - temBounds.min.x <= tolerance && landBounds.min.y - temBounds.min.y <= tolerance && landBounds.max.x - temBounds.max.x >= -tolerance && landBounds.max.y - temBounds.max.y >= -tolerance ); } export function findTemInside(land, tems) { const temInside = tems.find((tem) => { const temBounds = tem.bounds[0]; for (const landBounds of land.bounds) { if (isTemInsideLand(landBounds, temBounds)) return true; } }); return temInside; } export const getTradeCodeFromTem = (tem) => tem.properties.find((prop) => prop.displayName === "LO").displayValue; export const objIsTem = (obj) => obj.name && obj.name.startsWith("Blk003"); export const objIsLand = (obj) => { const layerProp = obj.properties.find((prop) => prop.displayName === "Layer"); if (!layerProp) return false; const globalWidthProp = obj.properties.find((prop) => prop.displayName === "Global width"); return ( (layerProp.displayValue === "1-bodim" || layerProp.displayValue === "0") /* special case - Z.E02.02A */ && globalWidthProp.displayValue === 0 ); }; export function findLandByTradeCode(trade_code, lands, temsInside) { const foundTemIndex = temsInside.findIndex((tem) => tem && getTradeCodeFromTem(tem) === trade_code); return foundTemIndex >= 0 ? [lands[foundTemIndex], foundTemIndex] : undefined; } export function pan(viewer) { const navigation = viewer.navigation; const position = navigation.getPosition(); const target = navigation.getTarget(); // offset both target and position to maintain angle const panOffset = new THREE.Vector3(2, 0, 0); navigation.setPosition(position.clone().add(panOffset)); navigation.setTarget(target.clone().add(panOffset)); } export function unloadUnusedExtensions(viewer) { viewer.addEventListener(Autodesk.Viewing.EXTENSION_LOADED_EVENT, (e) => { if (["Autodesk.Measure", "Autodesk.DocumentBrowser", "Autodesk.DefaultTools.NavTools"].includes(e.extensionId)) { viewer.unloadExtension(e.extensionId); } }); } export function addTemSelectionListener(viewer, products, openProductViewModal, openNoPermissionModal) { viewer.addEventListener( Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT, (e) => { viewer.clearSelection(); if (e.selections.length !== 1) return; const [selectedObj] = e.selections; const { model, dbIdArray } = selectedObj; if (dbIdArray.length !== 1) return; if (model.loader.svfUrn === utopiaUrn) { const [dbId] = dbIdArray; viewer.getProperties(dbId, (obj) => { if (!objIsTem(obj)) return; const trade_code = getTradeCodeFromTem(obj); const product = products.find((p) => p.trade_code === trade_code); product ? openProductViewModal(product) : openNoPermissionModal(); }); } else if (model.loader.svf.isSceneBuilder) { const [dbId] = dbIdArray; const product = products.find((p) => p.id === dbId); product ? openProductViewModal(product) : openNoPermissionModal(); } else if (model.loader.svfUrn === blankUrn) { viewer.clearSelection(); // make unselectable } }, (err) => console.error(err), ); } export function getLayerNames() { const { viewer } = window; if (!viewer) return; if (!viewer.impl) return; const layerNames = viewer.impl.layers.indexToLayer .filter((obj) => isNotNil(obj)) // not counting root .filter((obj) => obj.visible) .map(({ layer }) => layer.name) .sort((a, b) => a.localeCompare(b)); return layerNames; } export function applyLayerSetting(layersetting, store) { const { viewer } = window; viewer.setLayerVisible(null, false); // first, hide everything viewer.setLayerVisible(layersetting?.detail || null, true); // show specific ones, or all if there's no setting store.commit("layersetting", layersetting); }