215 lines
5.9 KiB
JavaScript
215 lines
5.9 KiB
JavaScript
import { watch, inject, markRaw, ref, computed, provide } from "vue";
|
|
import useAlarmStore from "@/stores/useAlarmStore";
|
|
import hexToRgb from "@/util/hexToRgb";
|
|
import useSystemShowData from "@/hooks/useSystemShowData"
|
|
import useForgeHeatmap from "./useForgeHeatmap";
|
|
import useForgeFloor from "./useForgeFloor";
|
|
|
|
export default function useForgeSprite() {
|
|
const { subscribeData } = inject("system_deviceList");
|
|
const { getCurrentInfoModalData, clearSelectedDeviceInfo, selected_dbid } =
|
|
inject("system_selectedDevice");
|
|
const forgeViewer = ref(null);
|
|
const dataVizExtn = ref(null);
|
|
let lastClickedDbId = null;
|
|
|
|
const { createHeatMap, updateViewExtension } = useForgeHeatmap();
|
|
const { updateViewerFloor } = useForgeFloor();
|
|
|
|
const updateDataVisualization = async (viewer) => {
|
|
if (!forgeViewer.value) {
|
|
forgeViewer.value = markRaw(viewer);
|
|
}
|
|
|
|
const dataVisualization = await viewer.loadExtension(
|
|
"Autodesk.DataVisualization"
|
|
);
|
|
dataVizExtn.value = markRaw(dataVisualization);
|
|
updateViewExtension(markRaw(viewer), markRaw(dataVisualization));
|
|
updateViewerFloor(markRaw(viewer), markRaw(dataVisualization))
|
|
};
|
|
|
|
function onSpriteClicked(event) {
|
|
event.hasStopped = true;
|
|
|
|
if (event.type === Autodesk.DataVisualization.Core.MOUSE_CLICK_OUT) return;
|
|
|
|
const data = subscribeData.value.find(
|
|
(d) =>
|
|
d.spriteDbId === event.dbId || d.forge_dbid === event.dbIdArray?.[0]
|
|
);
|
|
console.log("onSpriteClicked", event.target);
|
|
console.log("onSpriteClicked", data);
|
|
// modalContent.value = data;
|
|
// debugger;
|
|
if (data) {
|
|
getCurrentInfoModalData(
|
|
event,
|
|
{ left: event.target.startX, top: event.target.startY },
|
|
data
|
|
);
|
|
}
|
|
}
|
|
|
|
const { flatSubData } = useSystemShowData()
|
|
|
|
// 創建 sprites
|
|
const createSprites = async () => {
|
|
if (dataVizExtn.value) {
|
|
dataVizExtn.value.removeAllViewables();
|
|
const DataVizCore = Autodesk.DataVisualization.Core;
|
|
const viewableType = DataVizCore.ViewableType.SPRITE;
|
|
let spriteColor = new THREE.Color(0xffffff);
|
|
const BASEURL = import.meta.env.VITE_FORGE_BASEURL;
|
|
const spriteIconUrl = `${BASEURL}/hotspot.svg`;
|
|
const style = new DataVizCore.ViewableStyle(
|
|
viewableType,
|
|
spriteColor,
|
|
spriteIconUrl
|
|
);
|
|
const viewableData = new DataVizCore.ViewableData();
|
|
viewableData.spriteSize = 24; // Sprites as points of size 24 x 24 pixels
|
|
flatSubData.value?.forEach((d, index) => {
|
|
if (d.device_coordinate_3d) {
|
|
const position = d.device_coordinate_3d;
|
|
style.color = new THREE.Color(hexToRgb(d.device_normal_color));
|
|
const viewable = new DataVizCore.SpriteViewable(
|
|
position,
|
|
style,
|
|
d.spriteDbId
|
|
);
|
|
viewableData.addViewable(viewable);
|
|
}
|
|
});
|
|
// await viewableData.finish();
|
|
// dataVizExtn.value.addViewables(viewableData);
|
|
// console.log(dataVizExtn.value);
|
|
viewableData.finish().then(
|
|
() => {
|
|
dataVizExtn.value.addViewables(viewableData);
|
|
createHeatMap();
|
|
},
|
|
(error) => {
|
|
console.log(error);
|
|
}
|
|
);
|
|
}
|
|
};
|
|
|
|
watch(
|
|
() => flatSubData,
|
|
() => {
|
|
if (forgeViewer.value?.isLoadDone()) {
|
|
createSprites();
|
|
showSubSystemObjects();
|
|
}
|
|
},
|
|
{
|
|
deep: true,
|
|
}
|
|
);
|
|
|
|
watch(
|
|
() => selected_dbid,
|
|
() => {
|
|
if (forgeViewer.value?.isLoadDone()) {
|
|
cardfitToView(selected_dbid.value);
|
|
}
|
|
},
|
|
{
|
|
immediate: true,
|
|
deep: true,
|
|
}
|
|
);
|
|
|
|
const forgeClickListener = () => {
|
|
console.log("監聽forge");
|
|
|
|
forgeViewer.value.addEventListener(
|
|
Autodesk.DataVisualization.Core.MOUSE_CLICK,
|
|
onSpriteClicked
|
|
);
|
|
forgeViewer.value.addEventListener(
|
|
Autodesk.DataVisualization.Core.MOUSE_CLICK_OUT,
|
|
onSpriteClicked
|
|
);
|
|
};
|
|
|
|
const cardfitToView = async ([forge_dbid,spriteDbId]) => {
|
|
try {
|
|
// 相機調整
|
|
const nav = forgeViewer.value.navigation;
|
|
const camera = nav.getCamera();
|
|
forgeViewer.value.fitToView([forge_dbid], null, true);
|
|
const direction = new THREE.Vector3();
|
|
camera.getWorldDirection(direction);
|
|
const distanceBack = 30;
|
|
camera.position.add(direction.multiplyScalar(-distanceBack));
|
|
const target = nav.getTarget();
|
|
const fov = nav.getVerticalFov();
|
|
nav.setRequestTransition(true, camera.position, target, fov);
|
|
|
|
|
|
if (lastClickedDbId !== null && lastClickedDbId !== spriteDbId) {
|
|
dataVizExtn.value.invalidateViewables([lastClickedDbId], (viewable) => {
|
|
return {
|
|
scale: 1.0, // 恢復為 scale 1
|
|
};
|
|
});
|
|
}
|
|
|
|
dataVizExtn.value.invalidateViewables([spriteDbId], (viewable) => {
|
|
return {
|
|
scale: 2.0, // 設置為 scale 2
|
|
};
|
|
});
|
|
|
|
lastClickedDbId = spriteDbId;
|
|
|
|
} catch (error) {
|
|
console.error("Error in cardfitToView:", error);
|
|
}
|
|
};
|
|
|
|
|
|
const hideAllObjects = () => {
|
|
const tree = forgeViewer.value.model.getInstanceTree();
|
|
const allDbIdsStr = Object.keys(tree.nodeAccess.dbIdToIndex);
|
|
for (var i = 0; i < allDbIdsStr.length; i++) {
|
|
forgeViewer.value.hide(parseInt(allDbIdsStr[i]));
|
|
}
|
|
};
|
|
|
|
const showSubSystemObjects = () => {
|
|
hideAllObjects();
|
|
flatSubData.value.forEach((value, index) => {
|
|
forgeViewer.value.show(value.forge_dbid);
|
|
});
|
|
|
|
forgeViewer.value.impl.invalidate(true);
|
|
};
|
|
|
|
const clear = () => {
|
|
forgeViewer.value.removeEventListener(
|
|
Autodesk.DataVisualization.Core.MOUSE_CLICK,
|
|
onSpriteClicked
|
|
);
|
|
forgeViewer.value.removeEventListener(
|
|
Autodesk.DataVisualization.Core.MOUSE_CLICK_OUT,
|
|
onSpriteClicked
|
|
);
|
|
forgeViewer.value.tearDown();
|
|
};
|
|
|
|
|
|
|
|
return {
|
|
createSprites,
|
|
updateDataVisualization,
|
|
showSubSystemObjects,
|
|
forgeClickListener,
|
|
clear,
|
|
cardfitToView,
|
|
};
|
|
}
|