ibms-MCUT/ibms_react/src/components/forges/ForgeModel.js
2023-01-31 23:15:50 +08:00

92 lines
3.1 KiB
JavaScript

import React, { useEffect, useRef, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import * as THREE from "three";
import { fetchForge, shutdownForge } from "@STORE/forgeSlice";
import hotspot from "@ASSET/img/hotspot.svg";
function ForgeModel({ forgeHeight, sprites = [] }) {
const dispatch = useDispatch();
const viewerEl = useRef(null);
const {
buildingInfo: { urn_3D },
forgeViewer: { viewer, dataVizExtn, DataVizCore },
} = useSelector((store) => store);
// 載入 Forge Viewer
useEffect(() => {
if (urn_3D) {
dispatch(
fetchForge({
viewerEl: viewerEl.current,
urn: urn_3D,
}),
);
return () => {
dispatch(shutdownForge());
};
}
}, [urn_3D]);
// 熱點
const spriteUpdate = (e, targetDbIds= [], style) => {
e.hasStopped = true;
dataVizExtn.invalidateViewables(targetDbIds, (viewable) => {
console.log(style)
return style;
});
};
// 熱點點擊事件
const onSpriteClicked = (event) => {
const targetDbIds = [event.dbId];
spriteUpdate(event, targetDbIds, { scale: 1.3, color: { r: 1, g: 0, b: 0 } });
console.log(`Sprite clicked:${targetDbIds}`);
};
// 熱點取消點擊
const onSpriteClickedOut = (event) => {
const targetDbIds = [event.dbId];
spriteUpdate(event, targetDbIds, { scale: 1, color: { r: 1.0, g: 1.0, b: 1.0 } });
console.log(`Sprite clickedout:${targetDbIds}`);
}
// 進入系統監控頁面,出現熱點
useEffect(() => {
if (sprites.length !== 0 && viewer && dataVizExtn) {
// const filterSprites = sprites.map;
dataVizExtn.removeAllViewables();
sprites.forEach(async ({ device_coordinate_3d, forge_dbid }, index) => {
const viewableType = DataVizCore.ViewableType.SPRITE;
const spriteColor = new THREE.Color(0xffffff);
const spriteIconUrl = hotspot;
const style = new DataVizCore.ViewableStyle(viewableType, spriteColor, spriteIconUrl);
const viewableData = new DataVizCore.ViewableData();
viewableData.spriteSize = 24;
if (forge_dbid && device_coordinate_3d) {
const dbId = 10 + index;
const position = JSON.parse(device_coordinate_3d);
const viewable = new DataVizCore.SpriteViewable(position, style, dbId);
viewable.myContextData = {
manufacturer: "MJM Co. Ltd.",
};
viewableData.addViewable(viewable);
};
await viewableData.finish();
dataVizExtn.addViewables(viewableData);
});
viewer.addEventListener(DataVizCore.MOUSE_CLICK, onSpriteClicked);
viewer.addEventListener(DataVizCore.MOUSE_CLICK_OUT, onSpriteClickedOut);
}
return () => {
if (sprites.length !== 0 && viewer && dataVizExtn) {
viewer.removeEventListener(DataVizCore.MOUSE_CLICK, onSpriteClicked);
viewer.removeEventListener(DataVizCore.MOUSE_CLICK_OUT, onSpriteClickedOut);
}
};
}, [sprites, dataVizExtn, viewer]);
return <div ref={viewerEl} id="forgeViewer" style={{ height: forgeHeight }}></div>;
}
export default ForgeModel;