[Frontend][系統監控] 平面圖 熱點程序建置 | 3D 熱點 focus 程序建置 | 2D平面圖 設備圓點 打開 popover 程序建置 | 2D平面圖圓點與3D熱點互動程序建置 | 2D 平面圖剖面熱圖程序建置 | 總攬 3D 熱圖串接資料庫程序建置 | 3D 熱圖 串接訂閱程序建置
This commit is contained in:
parent
d059763692
commit
93e57c3086
@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
var allDevList = []; //全設備清單
|
var allDevList = []; //全設備清單
|
||||||
var devicePointList = [];
|
var heatMap = null;
|
||||||
|
|
||||||
$(function () {
|
$(function () {
|
||||||
getBuildMenu((arr, data) => {
|
getBuildMenu((arr, data) => {
|
||||||
@ -110,8 +110,12 @@
|
|||||||
let errDevPoiName = matchDevice.device_error_point_name;
|
let errDevPoiName = matchDevice.device_error_point_name;
|
||||||
|
|
||||||
if (data.point_name == "Temp") {
|
if (data.point_name == "Temp") {
|
||||||
|
console.log(data)
|
||||||
|
heatMap?.changeTemp(data.device_number_full, !isNaN(parseInt(data.value)) ? parseInt(data.value) : 0);
|
||||||
|
let devIdx = allDevList.findIndex(x => x.device_number == data.device_number_full);
|
||||||
|
allDevList[devIdx]._temp = !isNaN(parseInt(data.value)) ? parseInt(data.value) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.point_name == norDevPoiName && data.value == matchDevice.device_normal_point_value) {
|
if (data.point_name == norDevPoiName && data.value == matchDevice.device_normal_point_value) {
|
||||||
//顯示正常燈號
|
//顯示正常燈號
|
||||||
$(`#${matchDevice.device_number}_status`).attr("data-light-type", "normal").data("light-type", "normal");
|
$(`#${matchDevice.device_number}_status`).attr("data-light-type", "normal").data("light-type", "normal");
|
||||||
@ -205,7 +209,7 @@
|
|||||||
subDevice();
|
subDevice();
|
||||||
}
|
}
|
||||||
$("#floDevList").append(strHtml);
|
$("#floDevList").append(strHtml);
|
||||||
initPopover(pageAct.sysMainTag == "LT" ? "light" : null);
|
initPopover();
|
||||||
}
|
}
|
||||||
}, null, "POST").send();
|
}, null, "POST").send();
|
||||||
}
|
}
|
||||||
@ -259,32 +263,24 @@
|
|||||||
|
|
||||||
function show3DModel(urn) {
|
function show3DModel(urn) {
|
||||||
launchViewerForHotspot(urn, (viewer, nodeIds) => {
|
launchViewerForHotspot(urn, (viewer, nodeIds) => {
|
||||||
let devices = [{
|
let devices = allDevList.map(x => {
|
||||||
roomDbId: 7567,
|
return {
|
||||||
id: "Oficina 5",
|
roomDbId: !isNaN(parseInt(x.room_dbid)) ? parseInt(x.room_dbid) : -1,
|
||||||
//name: "Oficina-",
|
id: x.device_number,
|
||||||
position: { x: 3.35, y: -4.81, z: 12.88 }, // x: 0, y: 25, z: -2.5 (3.35, -4.81, 12.88
|
position: isJSON(x.device_coordinate_3d) ? JSON.parse(x.device_coordinate_3d) : {}, // x: 0, y: 25, z: -2.5 (3.35, -4.81, 12.88
|
||||||
sensorTypes: ["temperature", "humidity"]
|
sensorTypes: ["temperature", "humidity"]
|
||||||
}, {
|
}
|
||||||
roomDbId: 7567,
|
})
|
||||||
id: "Oficina 6",
|
|
||||||
//name: "Oficina-",
|
|
||||||
position: { x: 4.35, y: -4.81, z: 11.88 }, // x: 0, y: 25, z: -2.5 (3.35, -4.81, 12.88
|
|
||||||
sensorTypes: ["temperature", "humidity"]
|
|
||||||
}, {
|
|
||||||
roomDbId: 7567,
|
|
||||||
id: "Oficina 7",
|
|
||||||
//name: "Oficina-",
|
|
||||||
position: { x: 6.35, y: -4.81, z: 16.88 }, // x: 0, y: 25, z: -2.5 (3.35, -4.81, 12.88
|
|
||||||
sensorTypes: ["temperature", "humidity"]
|
|
||||||
}];
|
|
||||||
let option = {
|
let option = {
|
||||||
devices: devices,
|
devices: devices,
|
||||||
}
|
}
|
||||||
let heatMap = new ADHeatMaps(option);
|
|
||||||
|
|
||||||
heatMap.onComplete = function () {
|
heatMap = new ADHeatMaps(option);
|
||||||
heatMap.changeTemp(7567, 32);
|
heatMap.onComplete = () => {
|
||||||
|
$.each(allDevList, (idx,dev) => {
|
||||||
|
heatMap.changeTemp(dev.device_number, dev._temp || 0);
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
},"[name=forgeViewer]");
|
},"[name=forgeViewer]");
|
||||||
@ -330,22 +326,14 @@
|
|||||||
|
|
||||||
var parentEle = "";
|
var parentEle = "";
|
||||||
onEvent("autodesk:click:sprite", "[name=forgeViewer]", function (e, obj) {
|
onEvent("autodesk:click:sprite", "[name=forgeViewer]", function (e, obj) {
|
||||||
let position = {};
|
forgeUnFocusAll();
|
||||||
position.tpLeft = obj.event.target.toolController.lastClickX;
|
let position = [obj.event.target.toolController.lastClickX, obj.event.target.toolController.lastClickY];
|
||||||
position.tpTop = obj.event.target.toolController.lastClickY;
|
|
||||||
position.tpOffHeight = 24;
|
|
||||||
parentEle = creDiv();
|
|
||||||
let devObj = obj.myData;
|
let devObj = obj.myData;
|
||||||
parentEle.append(`<a href="javascript:;" name="devItem" class=" ml-2 mb-0 ">詳細資料</a>`);
|
|
||||||
parentEle.data("id", devObj.device_guid);
|
|
||||||
parentEle.data("number", devObj.device_number);
|
|
||||||
parentEle.data("dbId", devObj._dbId);
|
|
||||||
let name = allDevList.filter(x => x.device_guid == devObj.device_guid)[0]?.full_name;
|
let name = allDevList.filter(x => x.device_guid == devObj.device_guid)[0]?.full_name;
|
||||||
parentEle.data("name", name);
|
devObj.full_name = name;
|
||||||
|
parentEle = crePosPopover(position, devObj);
|
||||||
|
|
||||||
initPopover(pageAct.sysMainTag == "LT" ? "light" : null, position, parentEle);
|
|
||||||
$(parentEle).click();
|
$(parentEle).click();
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
onEvent("autodesk:clickOut:sprite", "[name=forgeViewer]", function (e) {
|
onEvent("autodesk:clickOut:sprite", "[name=forgeViewer]", function (e) {
|
||||||
@ -358,7 +346,15 @@
|
|||||||
let dbid = obj.myDataList.filter(x => x.device_number == devNum)[0]?._dbId;
|
let dbid = obj.myDataList.filter(x => x.device_number == devNum)[0]?._dbId;
|
||||||
$(ele).data("dbId", dbid);
|
$(ele).data("dbId", dbid);
|
||||||
})
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
onEvent("yt:tooltip:show", "[name=devItem]", function (e, obj) {
|
||||||
|
forgeUnFocusAll();
|
||||||
|
})
|
||||||
|
|
||||||
|
function forgeUnFocusAll() {
|
||||||
|
$("#floDevList a[name=devItem]").each((idx, ele) => {
|
||||||
|
controlFocusHotspot($(ele).data("dbId"), false);
|
||||||
|
})
|
||||||
|
}
|
||||||
</script>
|
</script>
|
@ -22,9 +22,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!--<script src="lib/echarts.min.js"></script>-->
|
||||||
<script>
|
<script>
|
||||||
var floChart = null;
|
var floChart = null;
|
||||||
var currentData = [];
|
var currentData = [];
|
||||||
|
var heatMap = null;
|
||||||
var allDeviceRowData = []; //所有設備原始資料
|
var allDeviceRowData = []; //所有設備原始資料
|
||||||
var global_emergency_alarm_device_number = [];
|
var global_emergency_alarm_device_number = [];
|
||||||
var zoomToggle = 3;
|
var zoomToggle = 3;
|
||||||
@ -140,7 +143,6 @@
|
|||||||
}
|
}
|
||||||
return item;
|
return item;
|
||||||
});
|
});
|
||||||
console.log(currentData)
|
|
||||||
if (currentData == null || currentData.length == 0) {
|
if (currentData == null || currentData.length == 0) {
|
||||||
this.currentData = [];
|
this.currentData = [];
|
||||||
}
|
}
|
||||||
@ -176,7 +178,6 @@
|
|||||||
// animationDurationUpdate: 1500,
|
// animationDurationUpdate: 1500,
|
||||||
tooltip: {
|
tooltip: {
|
||||||
formatter: function (params) {
|
formatter: function (params) {
|
||||||
console.log("23", params)
|
|
||||||
if (params.data.device_node_guid != undefined && params.data.device_node_guid != null && params.data.device_node_guid != "") {
|
if (params.data.device_node_guid != undefined && params.data.device_node_guid != null && params.data.device_node_guid != "") {
|
||||||
return `名稱:${params.data.device_node_full_name}<br>
|
return `名稱:${params.data.device_node_full_name}<br>
|
||||||
Guid:${params.data.device_node_guid}`
|
Guid:${params.data.device_node_guid}`
|
||||||
@ -314,24 +315,41 @@
|
|||||||
}
|
}
|
||||||
//myBaja.setSubscribeDevicesByBql(ordPath);
|
//myBaja.setSubscribeDevicesByBql(ordPath);
|
||||||
//myBaja.setSubscribeDevicesCallBack(subscribeCallBack);
|
//myBaja.setSubscribeDevicesCallBack(subscribeCallBack);
|
||||||
|
let parentEle = null;
|
||||||
|
floChart.on('click', function (params) {
|
||||||
|
forgeUnFocusAll();
|
||||||
|
chartUnFocusAll();
|
||||||
|
if (params.componentType == "series") {
|
||||||
|
let data = params.data;
|
||||||
|
let position = [params.event.event.clientX, params.event.event.clientY];
|
||||||
|
data._dbId = data._dbId ?? null;
|
||||||
|
parentEle = crePosPopover(position, data);
|
||||||
|
|
||||||
|
$(parentEle).click();
|
||||||
|
} else {
|
||||||
|
$(parentEle).YTTooltip("hide");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
console.log(floChart)
|
|
||||||
floChart.getZr().on('click', function (params) {
|
floChart.getZr().on('click', function (params) {
|
||||||
console.log("click", params);
|
/*console.log("click", params);*/
|
||||||
var pixelPoint = [params.offsetX, params.offsetY];
|
var pixelPoint = [params.offsetX, params.offsetY];
|
||||||
var dataPoint = floChart.convertFromPixel({ geoIndex: 0 }, pixelPoint);
|
var dataPoint = floChart.convertFromPixel({ geoIndex: 0 }, pixelPoint);
|
||||||
console.log(dataPoint);
|
|
||||||
|
if (!(params?.target?.shape?.symbolType == "circle")) {
|
||||||
|
$(parentEle).YTTooltip("hide");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
temp_device_on_floor_map = [{
|
//temp_device_on_floor_map = [{
|
||||||
device_guid: selected_temp_device.device_guid,
|
// device_guid: selected_temp_device.device_guid,
|
||||||
device_full_name: selected_temp_device.device_full_name,
|
// device_full_name: selected_temp_device.device_full_name,
|
||||||
device_node_guid: selected_temp_device.device_node_guid ? selected_temp_device.device_node_guid : null,
|
// device_node_guid: selected_temp_device.device_node_guid ? selected_temp_device.device_node_guid : null,
|
||||||
device_node_full_name: selected_temp_device.device_node_full_name ? selected_temp_device.device_node_full_name : null,
|
// device_node_full_name: selected_temp_device.device_node_full_name ? selected_temp_device.device_node_full_name : null,
|
||||||
status: selected_temp_device.status,
|
// status: selected_temp_device.status,
|
||||||
value: dataPoint
|
// value: dataPoint
|
||||||
}];
|
//}];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -341,6 +359,23 @@
|
|||||||
// floChart.setOption(option);
|
// floChart.setOption(option);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
onEvent("autodesk:complete:sprite", "#forgeViewer", function (e, obj) {
|
||||||
|
let option = floChart.getOption();
|
||||||
|
|
||||||
|
option.series.forEach(function (series) {
|
||||||
|
series.data.forEach(function (point) {
|
||||||
|
let dbid = obj.myDataList.filter(x => x.device_number == point.device_number)[0]?._dbId;
|
||||||
|
point._dbId = dbid;
|
||||||
|
currentData.forEach(function (cData) {
|
||||||
|
if (cData.device_guid == point.device_guid) {
|
||||||
|
cData._dbId = dbid;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
});
|
||||||
|
floChart.setOption(option)
|
||||||
|
})
|
||||||
//floChart.on('selectchanged', function (params) {
|
//floChart.on('selectchanged', function (params) {
|
||||||
|
|
||||||
// console.log("selectchanged", params);
|
// console.log("selectchanged", params);
|
||||||
@ -404,8 +439,7 @@
|
|||||||
}
|
}
|
||||||
floMyBaja.setSubscribeDevicesByBql(ordPath);
|
floMyBaja.setSubscribeDevicesByBql(ordPath);
|
||||||
floMyBaja.setSubscribeDevicesCallBack(function (data) {
|
floMyBaja.setSubscribeDevicesCallBack(function (data) {
|
||||||
console.log(data)
|
let matchDevice = currentData.filter(x => x.device_number == data.device_number_full)[0];
|
||||||
let matchDevice = allDeviceRowData.filter(x => x.device_number == data.device_number_full)[0];
|
|
||||||
if (!matchDevice) {
|
if (!matchDevice) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -413,6 +447,12 @@
|
|||||||
let cloDevPoiName = matchDevice.device_close_point_name;
|
let cloDevPoiName = matchDevice.device_close_point_name;
|
||||||
let errDevPoiName = matchDevice.device_error_point_name;
|
let errDevPoiName = matchDevice.device_error_point_name;
|
||||||
|
|
||||||
|
if (data.point_name == "Temp") {
|
||||||
|
heatMap?.changeTemp(data.device_number_full, !isNaN(parseInt(data.value)) ? parseInt(data.value) : 0);
|
||||||
|
let devIdx = currentData.findIndex(x => x.device_number == data.device_number_full);
|
||||||
|
currentData[devIdx]._temp = !isNaN(parseInt(data.value)) ? parseInt(data.value) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (data.point_name == norDevPoiName && data.value == matchDevice.device_normal_point_value) {
|
if (data.point_name == norDevPoiName && data.value == matchDevice.device_normal_point_value) {
|
||||||
//顯示正常燈號
|
//顯示正常燈號
|
||||||
$(`#${matchDevice.device_number}_status`).attr("data-light-type", "normal").data("light-type", "normal");
|
$(`#${matchDevice.device_number}_status`).attr("data-light-type", "normal").data("light-type", "normal");
|
||||||
@ -605,6 +645,13 @@
|
|||||||
// return [];
|
// return [];
|
||||||
// }
|
// }
|
||||||
// });
|
// });
|
||||||
|
let option = floChart.getOption();
|
||||||
|
temp.forEach(function (tempData) {
|
||||||
|
let oldTarObj = option.series[0]?.data?.filter(x => x.device_number == tempData.device_number)[0];
|
||||||
|
if (oldTarObj) {
|
||||||
|
tempData = Object.assign(tempData, oldTarObj)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
temp.map(function (item) {
|
temp.map(function (item) {
|
||||||
|
|
||||||
@ -618,7 +665,8 @@
|
|||||||
status: item.status,
|
status: item.status,
|
||||||
value: item.value,
|
value: item.value,
|
||||||
deviceItems: item.deviceItems,
|
deviceItems: item.deviceItems,
|
||||||
deviceURL: item.deviceURL
|
deviceURL: item.deviceURL,
|
||||||
|
_dbId: item._dbId ?? null
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.itemStyle = { 'color': item.device_color };
|
obj.itemStyle = { 'color': item.device_color };
|
||||||
@ -626,6 +674,7 @@
|
|||||||
res.push(obj);
|
res.push(obj);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -830,7 +879,7 @@
|
|||||||
floChart.setOption({
|
floChart.setOption({
|
||||||
series: [{
|
series: [{
|
||||||
symbolOffset: [0, 0],
|
symbolOffset: [0, 0],
|
||||||
data: scatter_symbol_convertData(currentData) //正常、關閉(圓點)
|
data: scatter_symbol_convertData(currentData), //正常、關閉(圓點)
|
||||||
}, {
|
}, {
|
||||||
data: [] //正常、關閉(icon)
|
data: [] //正常、關閉(icon)
|
||||||
}, {
|
}, {
|
||||||
@ -864,15 +913,69 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getNextFloor(floGuid = null) {
|
||||||
|
|
||||||
|
let url = baseApiUrl + "/api/Device/GetNextFloor";
|
||||||
|
objSendData.Data = { floor_guid: floGuid }
|
||||||
|
let result = "";
|
||||||
|
ytAjax = new YourTeam.Ajax(url, objSendData, function (res) {
|
||||||
|
if (!res || res.code != "0000" || !res.data) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
result = res.data?.full_name;
|
||||||
|
}
|
||||||
|
}, null, "POST").send();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// show 3D 模型
|
// show 3D 模型
|
||||||
function show3DModel(urn) {
|
function show3DModel(urn) {
|
||||||
launchViewerForHotspot(urn, (viewer, nodeIds) => {
|
launchViewerForHotspot(urn, (viewer, nodeIds) => {
|
||||||
getLevelsData("R2F", "RF");//剖面的下方樓層,剖面的上方樓層
|
let nextFloor = getNextFloor(pageAct.floGuid);
|
||||||
var roomsArr = [10481, 10479];//七樓的兩間房間dbid
|
let curFloTag = pageAct.floTag;
|
||||||
toLoadHeatmap(roomsArr);
|
|
||||||
|
if (!nextFloor) {
|
||||||
|
toast_warning("超出樓層範圍");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (curFloTag?.startsWith("U")) {
|
||||||
|
curFloTag = curFloTag.split("U")[1];
|
||||||
|
}
|
||||||
|
if (nextFloor?.startsWith("U")) {
|
||||||
|
nextFloor = nextFloor.split("U")[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
getLevelsData(curFloTag, nextFloor);
|
||||||
|
setHeatMap();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setHeatMap() {
|
||||||
|
console.log("currentData", currentData)
|
||||||
|
let devices = currentData.map(x => {
|
||||||
|
return {
|
||||||
|
roomDbId: !isNaN(parseInt(x.room_dbid)) ? parseInt(x.room_dbid) : -1,
|
||||||
|
id: x.device_number,
|
||||||
|
position: isJSON(x.device_coordinate_3d) ? JSON.parse(x.device_coordinate_3d) : {}, // x: 0, y: 25, z: -2.5 (3.35, -4.81, 12.88
|
||||||
|
sensorTypes: ["temperature", "humidity"]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
let option = {
|
||||||
|
devices: devices,
|
||||||
|
}
|
||||||
|
|
||||||
|
heatMap = new ADHeatMaps(option);
|
||||||
|
heatMap.onComplete = () => {
|
||||||
|
|
||||||
|
$.each(currentData, (idx, dev) => {
|
||||||
|
heatMap.changeTemp(dev.device_number, dev._temp || 0);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function getHotspotPoint(callback = null) {
|
function getHotspotPoint(callback = null) {
|
||||||
let url = baseApiUrl + "/api/GetDevForCor";
|
let url = baseApiUrl + "/api/GetDevForCor";
|
||||||
let sendData = {
|
let sendData = {
|
||||||
@ -887,7 +990,6 @@
|
|||||||
if (!res || res.code != "0000" || !res.data) {
|
if (!res || res.code != "0000" || !res.data) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
debugger
|
|
||||||
let myDataList = [];
|
let myDataList = [];
|
||||||
$.each(res.data, (idx, data) => {
|
$.each(res.data, (idx, data) => {
|
||||||
let item = {};
|
let item = {};
|
||||||
@ -899,7 +1001,6 @@
|
|||||||
myDataList.push(item);
|
myDataList.push(item);
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log("1", myDataList)
|
|
||||||
setHotspotPoint(myDataList);
|
setHotspotPoint(myDataList);
|
||||||
callback ? callback() : "";
|
callback ? callback() : "";
|
||||||
}
|
}
|
||||||
@ -908,7 +1009,62 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setHotspotPoint(myDataList = []) {
|
function setHotspotPoint(myDataList = []) {
|
||||||
console.log(myDataList)
|
|
||||||
getHopspotPoint(myDataList);
|
getHopspotPoint(myDataList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onEvent("autodesk:click:sprite", "#forgeViewer", function (e, obj) {
|
||||||
|
forgeUnFocusAll();
|
||||||
|
chartUnFocusAll();
|
||||||
|
let position = [obj.event.target.toolController.lastClickX, obj.event.target.toolController.lastClickY];
|
||||||
|
let devObj = obj.myData;
|
||||||
|
let name = currentData.filter(x => x.device_guid == devObj.device_guid)[0]?.full_name;
|
||||||
|
devObj.full_name = name;
|
||||||
|
parentEle = crePosPopover(position, devObj);
|
||||||
|
$(parentEle).click();
|
||||||
|
|
||||||
|
let option = floChart.getOption();
|
||||||
|
option.series.forEach(function (series) {
|
||||||
|
series.data.forEach(function (point) {
|
||||||
|
if (point.device_guid == devObj.device_guid) {
|
||||||
|
point.symbolSize = 50;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
floChart.setOption(option);
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
onEvent("autodesk:clickOut:sprite", "#forgeViewer", function (e) {
|
||||||
|
$(parentEle).YTTooltip("hide");
|
||||||
|
})
|
||||||
|
|
||||||
|
function forgeUnFocusAll() {
|
||||||
|
$.each(currentData, (idx, cData) => {
|
||||||
|
controlFocusHotspot(cData._dbId, false);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function chartUnFocusAll() {
|
||||||
|
let option = floChart.getOption();
|
||||||
|
option.series.forEach(function (series) {
|
||||||
|
series.data.forEach(function (point) {
|
||||||
|
point.symbolSize = 10;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
floChart.setOption(option);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解除 series 聚焦
|
||||||
|
function chartUnFocus(ele) {
|
||||||
|
let devGuid = $(ele).data("id");
|
||||||
|
let option = floChart.getOption();
|
||||||
|
option.series.forEach(function (series) {
|
||||||
|
series.data.forEach(function (point) {
|
||||||
|
if (point.device_guid == devGuid) {
|
||||||
|
point.symbolSize = 10;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
floChart.setOption(option);
|
||||||
|
}
|
||||||
</script>
|
</script>
|
@ -25,15 +25,16 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
onEvent("yt:tab:change", "[name=floBtn]", function () {
|
onEvent("yt:tab:change", "[name=floBtn]", function () {
|
||||||
debugger
|
|
||||||
$.each(tolSubList, (idx, sub) => {
|
$.each(tolSubList, (idx, sub) => {
|
||||||
sub.unsubscribeAll();
|
sub.unsubscribeAll();
|
||||||
sub.detach();
|
sub.detach();
|
||||||
})
|
})
|
||||||
tolSubList=[];
|
tolSubList=[];
|
||||||
pageAct.floTag = $(this).data("id");
|
pageAct.floTag = $(this).data("id");
|
||||||
|
pageAct.floGuid = $(this).data("guid");
|
||||||
if ($(this).data("id") == "all") {
|
if ($(this).data("id") == "all") {
|
||||||
pageAct.floTag = null;
|
pageAct.floTag = null;
|
||||||
|
pageAct.floGuid = null;
|
||||||
$("#js-page-content").load("_sysMonAll.html", loadCallback);
|
$("#js-page-content").load("_sysMonAll.html", loadCallback);
|
||||||
} else {
|
} else {
|
||||||
$("#js-page-content").load("_sysMonFloor.html", loadCallback);
|
$("#js-page-content").load("_sysMonFloor.html", loadCallback);
|
||||||
@ -55,7 +56,7 @@
|
|||||||
} else {
|
} else {
|
||||||
let strHtml = `<button name="floBtn" data-id="all" type="button" class="btn btn-secondary waves-effect waves-themed btn-sm-2" data-tabname="floor" data-target="all">總覽</button>`;
|
let strHtml = `<button name="floBtn" data-id="all" type="button" class="btn btn-secondary waves-effect waves-themed btn-sm-2" data-tabname="floor" data-target="all">總覽</button>`;
|
||||||
$.each(res.data, (index, floObj) => {
|
$.each(res.data, (index, floObj) => {
|
||||||
strHtml += `<button name="floBtn" data-id="${floObj.floor_tag}" class="btn btn-secondary waves-effect waves-themed btn-sm-2" data-tabname="floor" data-target="${floObj.floor_tag}">${floObj.floor_tag}</button>`;
|
strHtml += `<button name="floBtn" data-id="${floObj.floor_tag}" data-guid="${floObj.floor_guid}" class="btn btn-secondary waves-effect waves-themed btn-sm-2" data-tabname="floor" data-target="${floObj.floor_tag}">${floObj.floor_tag}</button>`;
|
||||||
})
|
})
|
||||||
$("#floList").html(strHtml);
|
$("#floList").html(strHtml);
|
||||||
floList = res.data;
|
floList = res.data;
|
||||||
|
@ -2043,6 +2043,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
}
|
}
|
||||||
// 執行初步 Loading
|
// 執行初步 Loading
|
||||||
var loadEle = pageLoading();
|
var loadEle = pageLoading();
|
||||||
|
var errRecTable = null, opeRecTable = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 頁面 Loading 建立
|
* 頁面 Loading 建立
|
||||||
@ -2364,6 +2365,10 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
|
|
||||||
// Card 呈現初始化
|
// Card 呈現初始化
|
||||||
function initPopover(type = null, extOption = {}, selector = "[name=devItem]") {
|
function initPopover(type = null, extOption = {}, selector = "[name=devItem]") {
|
||||||
|
if (type == null && pageAct.sysMainTag == "LT") {
|
||||||
|
type = "light";
|
||||||
|
}
|
||||||
|
|
||||||
$(selector).each((index, ele) => {
|
$(selector).each((index, ele) => {
|
||||||
let devNum = $(ele).data("number"); //設備編號
|
let devNum = $(ele).data("number"); //設備編號
|
||||||
let devGuid = $(ele).data("id"); //guid
|
let devGuid = $(ele).data("id"); //guid
|
||||||
@ -2409,13 +2414,15 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
//loadErrRecTable();
|
//loadErrRecTable();
|
||||||
loadErr($(oriEle).data("number"));
|
loadErr($(oriEle).data("number"));
|
||||||
$(tooltipEle).find("#info").html(typeof drawInfoTabBlo != "undefined" ? drawInfoTabBlo(devGuid) : "");
|
$(tooltipEle).find("#info").html(typeof drawInfoTabBlo != "undefined" ? drawInfoTabBlo(devGuid) : "");
|
||||||
changeColorForHotspot($(oriEle).data("dbId"));
|
if ($(oriEle).data("dbId")) {
|
||||||
changeScaleForHotspot($(oriEle).data("dbId"));
|
controlFocusHotspot($(oriEle).data("dbId"));
|
||||||
|
}
|
||||||
typeof subDeviceSetTable != "undefined" ? subDeviceSetTable($(oriEle).data("number")) : ""
|
typeof subDeviceSetTable != "undefined" ? subDeviceSetTable($(oriEle).data("number")) : ""
|
||||||
},
|
},
|
||||||
onHide: function (tooltipEle, oriEle) {
|
onHide: function (tooltipEle, oriEle) {
|
||||||
changeColorForHotspot($(oriEle).data("dbId"),false);
|
controlFocusHotspot($(oriEle).data("dbId"),false);
|
||||||
changeScaleForHotspot($(oriEle).data("dbId"),false);
|
// sysMonFloor Echart 解除 focus
|
||||||
|
typeof chartUnFocus != "undefined" ? chartUnFocus(oriEle) : "";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2427,7 +2434,9 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
|
|
||||||
// Card - 運維紀錄 Table
|
// Card - 運維紀錄 Table
|
||||||
function loadOpeRecTable(devGuid) {
|
function loadOpeRecTable(devGuid) {
|
||||||
|
if (opeRecTable) {
|
||||||
|
opeRecTable.destroy();
|
||||||
|
}
|
||||||
let url = baseApiUrl + "/api/Device/GetOpeDevice?device_guid=" + devGuid;
|
let url = baseApiUrl + "/api/Device/GetOpeDevice?device_guid=" + devGuid;
|
||||||
let tag = "#opeRecTable";
|
let tag = "#opeRecTable";
|
||||||
|
|
||||||
@ -2461,7 +2470,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
let opeRecTable = new YourTeam.JqDataTables.getTableByAjax(url, tag, null, columns, column_defs, null, null, null, null, null, null, "tpi");
|
opeRecTable = new YourTeam.JqDataTables.getTableByAjax(url, tag, null, columns, column_defs, null, null, null, null, null, null, "tpi");
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadLightSchTable(devGuid) {
|
function loadLightSchTable(devGuid) {
|
||||||
@ -2525,12 +2534,16 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
let lightSchTable = new YourTeam.JqDataTables.getTableByAjax(url, tag, null, columns, column_defs, null, null, null, null, null, null, "tpi");
|
let lightSchTable = new YourTeam.JqDataTables.getTableByAjax(url, tag, null, columns, column_defs, null, null, null, null, null, null, "tpi");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function controlFocusHotspot(dbId,open = true) {
|
||||||
|
changeColorForHotspot(dbId, open);
|
||||||
|
changeScaleForHotspot(dbId, open);
|
||||||
|
}
|
||||||
|
|
||||||
// Baja 取得異常紀錄
|
// Baja 取得異常紀錄
|
||||||
function loadErr(allPath) {
|
function loadErr(allPath) {
|
||||||
if (allPath != undefined && allPath != null) {
|
if (allPath != undefined && allPath != null) {
|
||||||
let _pathArr = allPath.split("_");//TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1
|
|
||||||
let _devicePath = _pathArr[0] + "_" + _pathArr[1] + "_" + _pathArr[2] + "_" + _pathArr[3] + "_" + _pathArr[4] + "_" + _pathArr[5];
|
getOneDeviceAlarmTop10ByBaja(allPath, callbackForErr);
|
||||||
getOneDeviceAlarmTop10ByBaja(_devicePath, callbackForErr);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
console.log("no device");
|
console.log("no device");
|
||||||
@ -2539,6 +2552,10 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
|
|
||||||
// Card - 異常紀錄 Table
|
// Card - 異常紀錄 Table
|
||||||
function callbackForErr(result) {
|
function callbackForErr(result) {
|
||||||
|
if (errRecTable) {
|
||||||
|
errRecTable.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
let tag = "#errRecTable";
|
let tag = "#errRecTable";
|
||||||
let datas;
|
let datas;
|
||||||
|
|
||||||
@ -2607,6 +2624,22 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function crePosPopover(position, obj) {
|
||||||
|
let _position = {};
|
||||||
|
_position.tpLeft = position[0];
|
||||||
|
_position.tpTop = position[1];
|
||||||
|
_position.tpOffHeight = 24;
|
||||||
|
let parentEle = creDiv();
|
||||||
|
parentEle.append(`<a href="javascript:;" name="devItem" class=" ml-2 mb-0 ">詳細資料</a>`);
|
||||||
|
parentEle.data("id", obj.device_guid);
|
||||||
|
parentEle.data("number", obj.device_number);
|
||||||
|
parentEle.data("dbId", obj._dbId);
|
||||||
|
parentEle.data("name", obj.full_name);
|
||||||
|
initPopover(null, _position, parentEle);
|
||||||
|
|
||||||
|
return parentEle;
|
||||||
|
}
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
// ↑ 系統監控 - 共用 Function ↑
|
// ↑ 系統監控 - 共用 Function ↑
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
var viewer;
|
var viewer;
|
||||||
|
|
||||||
let fragProxy;
|
let fragProxy;
|
||||||
var targetFloorZ;
|
var targetFloorZ;
|
||||||
var elevatorSpeed;
|
var elevatorSpeed;
|
||||||
var selector = "#forgeViewer";
|
var selector = "#forgeViewer";
|
||||||
var myDataList;//設備list
|
let myDataList;
|
||||||
var levels;//剖面用
|
var levels;//剖面用
|
||||||
var lowerIdx;//剖面的下方樓層
|
var lowerIdx;//剖面的下方樓層
|
||||||
var upperIdx;//剖面的上方樓層
|
var upperIdx;//剖面的上方樓層
|
||||||
@ -27,6 +28,31 @@ function launchViewer(urn, callback, _selector = "#forgeViewer") {
|
|||||||
callback ? callback(viewer, nodeIds) : "";
|
callback ? callback(viewer, nodeIds) : "";
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
//test
|
||||||
|
// for (let i = 0; i < urn.length; i++) {
|
||||||
|
// Autodesk.Viewing.Document.load(urn[i]["urn"], async (doc) => {
|
||||||
|
// let viewables = doc.getRoot().getDefaultGeometry();
|
||||||
|
// let model = await viewer.loadDocumentNode(doc, viewables, {
|
||||||
|
// preserveView: false,
|
||||||
|
// keepCurrentModels: true,
|
||||||
|
// placementTransform: (new THREE.Matrix4()).setPosition(urn[i]["xform"]),
|
||||||
|
// keepCurrentModels: true,
|
||||||
|
// globalOffset: {
|
||||||
|
// x: 0,
|
||||||
|
// y: 0,
|
||||||
|
// z: 0
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
|
||||||
|
// await viewer.waitForLoadDone(); //!<<< Wait for loading materials, properties and geometries for this model (URN)
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
//loadHeatmaps(viewer.getAllModels()[0]); //!<<< equals to viewer.model
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,6 +273,13 @@ class elevator3D {
|
|||||||
hideColor(nodeId);
|
hideColor(nodeId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
//let fragPosition = new THREE.Vector3(position);// 一樓0 二樓15 三樓 26
|
||||||
|
|
||||||
|
//fragProxy.position = fragPosition;
|
||||||
|
|
||||||
|
//fragProxy.updateAnimTransform();
|
||||||
|
|
||||||
|
//viewer.impl.sceneUpdated(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,7 +287,14 @@ function onDocumentLoadSuccess(doc, eleOption) {
|
|||||||
var viewables = doc.getRoot().getDefaultGeometry();
|
var viewables = doc.getRoot().getDefaultGeometry();
|
||||||
viewer.loadDocumentNode(doc, viewables).then(i => {
|
viewer.loadDocumentNode(doc, viewables).then(i => {
|
||||||
// documented loaded, any action?
|
// documented loaded, any action?
|
||||||
|
|
||||||
});
|
});
|
||||||
|
// viewer.addEventListener(Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT, (args) => {
|
||||||
|
// var currSelection = viewer.getSelection();
|
||||||
|
// var domElem = document.getElementById('id_printer');
|
||||||
|
// domElem.innerText = currSelection[0];
|
||||||
|
// });
|
||||||
|
|
||||||
viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, function () {
|
viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, function () {
|
||||||
let instanceTree = viewer.model.getData().instanceTree;
|
let instanceTree = viewer.model.getData().instanceTree;
|
||||||
console.log(instanceTree.nodeAccess)
|
console.log(instanceTree.nodeAccess)
|
||||||
@ -264,6 +304,8 @@ function onDocumentLoadSuccess(doc, eleOption) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 輔助函數,使用 Promise 封裝 viewer.getProperties 函數
|
// 輔助函數,使用 Promise 封裝 viewer.getProperties 函數
|
||||||
@ -303,7 +345,7 @@ async function getNodeIdByDbIds(checkName = "【電梯】", callback = null) {
|
|||||||
let elements = await viewerGetProperties(targetNodeIds,"【tag_id】");
|
let elements = await viewerGetProperties(targetNodeIds,"【tag_id】");
|
||||||
|
|
||||||
// 從 elements 中篩選出包含 【tag_id】 屬性的元素
|
// 從 elements 中篩選出包含 【tag_id】 屬性的元素
|
||||||
elements = elements.filter(x => x.properties.findIndex(y => y.displayName == "【tag_id】" && y.displayValue == checkName) != -1);
|
elements = elements.filter(x => x.properties.findIndex(y => y.displayName == "【tag_id】" && y.displayValue.indexOf(checkName) != -1) != -1);
|
||||||
|
|
||||||
if (elements) {
|
if (elements) {
|
||||||
hasElement = true;
|
hasElement = true;
|
||||||
@ -351,11 +393,14 @@ function setElevatorSpeed(speed) { //0.01 ~ 1
|
|||||||
}
|
}
|
||||||
|
|
||||||
function movElevator() {
|
function movElevator() {
|
||||||
|
|
||||||
|
|
||||||
let tree = viewer.model.getData().instanceTree;
|
let tree = viewer.model.getData().instanceTree;
|
||||||
let nodeId = 10952;
|
let nodeId = 10952;
|
||||||
let fragProxyZ = 0;
|
let fragProxyZ = 0;
|
||||||
var movStatus = 0; // 0=no 1=up 2=down
|
var movStatus = 0; // 0=no 1=up 2=down
|
||||||
|
|
||||||
|
|
||||||
if (fragProxy.position.z > targetFloorZ) {
|
if (fragProxy.position.z > targetFloorZ) {
|
||||||
movStatus = 2
|
movStatus = 2
|
||||||
}
|
}
|
||||||
@ -370,6 +415,7 @@ function movElevator() {
|
|||||||
tree.enumNodeFragments(nodeId, function (frag) {
|
tree.enumNodeFragments(nodeId, function (frag) {
|
||||||
fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
|
fragProxy = viewer.impl.getFragmentProxy(viewer.model, frag);
|
||||||
fragProxy.getAnimTransform();
|
fragProxy.getAnimTransform();
|
||||||
|
//let fragPosition = new THREE.Vector3(0, 0, 15);// 一樓0 二樓15 三樓 26
|
||||||
if (movStatus == 2) {
|
if (movStatus == 2) {
|
||||||
fragProxy.position.z -= elevatorSpeed;
|
fragProxy.position.z -= elevatorSpeed;
|
||||||
}
|
}
|
||||||
@ -393,6 +439,15 @@ function movElevator() {
|
|||||||
requestAnimationFrame(movElevator);
|
requestAnimationFrame(movElevator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//let fragPosition = new THREE.Vector3(position);// 一樓0 二樓15 三樓 26
|
||||||
|
|
||||||
|
//fragProxy.position = fragPosition;
|
||||||
|
|
||||||
|
//fragProxy.updateAnimTransform();
|
||||||
|
|
||||||
|
//viewer.impl.sceneUpdated(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAllDbIds(viewer) {
|
function getAllDbIds(viewer) {
|
||||||
@ -440,7 +495,7 @@ class ADHeatMaps {
|
|||||||
constructor(option = {}) {
|
constructor(option = {}) {
|
||||||
this.devices = option.devices ?? [];
|
this.devices = option.devices ?? [];
|
||||||
this.checkNodeString = "【ROOM】";
|
this.checkNodeString = "【ROOM】";
|
||||||
this.tempVal = 0;
|
this.tempVals = [];
|
||||||
this.roomDbIds = []; //房間 dbId
|
this.roomDbIds = []; //房間 dbId
|
||||||
this.model = null;
|
this.model = null;
|
||||||
this.dataVizExtn = null;
|
this.dataVizExtn = null;
|
||||||
@ -479,6 +534,7 @@ class ADHeatMaps {
|
|||||||
device.sensorTypes
|
device.sensorTypes
|
||||||
);
|
);
|
||||||
shadingNode.addPoint(shadingPoint);
|
shadingNode.addPoint(shadingPoint);
|
||||||
|
device.temp = 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
heatmapData.addChild(shadingNode);
|
heatmapData.addChild(shadingNode);
|
||||||
@ -495,34 +551,59 @@ class ADHeatMaps {
|
|||||||
|
|
||||||
this.dataVizExtn = dataVizExtn;
|
this.dataVizExtn = dataVizExtn;
|
||||||
|
|
||||||
this.changeTemp(this.tempVal);
|
$.each(this.roomDbIds.map(x => x.nodeId), (idx, rDbid) => {
|
||||||
|
this.dataVizExtn.renderSurfaceShading("RoomPanel" + rDbid, "temperature", this.getSensorValue.bind(this));
|
||||||
|
})
|
||||||
|
|
||||||
|
/*this.changeTemp(this.tempVal);*/
|
||||||
this.onComplete ? this.onComplete() : "";
|
this.onComplete ? this.onComplete() : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getSensorValue = function(device, sensorType) {
|
||||||
|
let dev = this.devices.filter(x => x.id == device.id)[0];
|
||||||
|
return dev.temp / 40;
|
||||||
|
}
|
||||||
|
|
||||||
// 改變溫度
|
// 改變溫度
|
||||||
changeTemp = function (devId, temp) {
|
changeTemp = function (devId, temp) {
|
||||||
this.tempVal = temp;
|
this.tempVal = temp;
|
||||||
// 透過 device id 取得 roomDbId
|
// 透過 device id 取得 roomDbId
|
||||||
/*const rDbid = this.roomDbIds.filter(x => x.)[0]?.roomDbId;*/
|
this.devices.forEach((dev) => {
|
||||||
if (rDbid != null) {
|
if (devId == dev.id) {
|
||||||
// 取得新的溫度值
|
dev.temp = temp;
|
||||||
let getSensorValue = (device, sensorType) => {
|
|
||||||
return this.tempVal / 40;
|
|
||||||
}
|
|
||||||
// 對 "Room Panel" 做表面顏色的渲染,並使用新的溫度值
|
|
||||||
this.dataVizExtn.renderSurfaceShading("RoomPanel" + rDbid, "temperature", getSensorValue);
|
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
this.dataVizExtn.updateSurfaceShading(this.getSensorValue.bind(this));
|
||||||
|
|
||||||
|
//if (rDbid != null) {
|
||||||
|
// // 取得新的溫度值
|
||||||
|
// let getSensorValue = (device, sensorType) => {
|
||||||
|
// return this.tempVal / 40;
|
||||||
|
// }
|
||||||
|
// // 對 "Room Panel" 做表面顏色的渲染,並使用新的溫度值
|
||||||
|
// this.dataVizExtn.renderSurfaceShading("RoomPanel" + rDbid, "temperature", getSensorValue);
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function setTransparentBuilding() {
|
function setTransparentBuilding() {
|
||||||
|
//allDbIdsStr.forEach((dbId) => {
|
||||||
|
// setTransparency(dbId, 0.2);
|
||||||
|
//})
|
||||||
|
|
||||||
for (var i = 0; i < allDbIdsStr.length; i++) {
|
for (var i = 0; i < allDbIdsStr.length; i++) {
|
||||||
setTransparency(parseInt(allDbIdsStr[i]), 0.2);
|
setTransparency(parseInt(allDbIdsStr[i]), 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function recoverTransparentBuilding() {
|
function recoverTransparentBuilding() {
|
||||||
|
//allDbIdsStr.forEach((dbId) => {
|
||||||
|
// setTransparency(dbId, 1);
|
||||||
|
//})
|
||||||
|
|
||||||
for (var i = 0; i < allDbIdsStr.length; i++) {
|
for (var i = 0; i < allDbIdsStr.length; i++) {
|
||||||
setTransparency(parseInt(allDbIdsStr[i]), 1);
|
setTransparency(parseInt(allDbIdsStr[i]), 1);
|
||||||
}
|
}
|
||||||
@ -575,6 +656,16 @@ function hideColor(nodeId) {//顏色改成透明
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------ 紀錄熱點座標 ---------------
|
||||||
|
function getHopspotPoint(data) {
|
||||||
|
//var av = Autodesk.Viewing;
|
||||||
|
myDataList = data;
|
||||||
|
//viewer.addEventListener(av.GEOMETRY_LOADED_EVENT, addHotPoint, {
|
||||||
|
// once: true,
|
||||||
|
//});
|
||||||
|
}
|
||||||
|
//-------------------- end ----------------------
|
||||||
|
|
||||||
//------------------- 加入熱點 -----------------
|
//------------------- 加入熱點 -----------------
|
||||||
async function addHotPoint(data) {
|
async function addHotPoint(data) {
|
||||||
var viewer = data.target;
|
var viewer = data.target;
|
||||||
@ -604,7 +695,7 @@ async function addHotPoint(data) {
|
|||||||
|
|
||||||
myDataList.forEach((myData, index) => {
|
myDataList.forEach((myData, index) => {
|
||||||
const dbId = 10 + index;
|
const dbId = 10 + index;
|
||||||
const myPosition = JSON.parse(myData.device_coordinate_3d);
|
const myPosition = myData.position;
|
||||||
const viewable = new DataVizCore.SpriteViewable(myPosition, style, dbId);
|
const viewable = new DataVizCore.SpriteViewable(myPosition, style, dbId);
|
||||||
myData._dbId = dbId;
|
myData._dbId = dbId;
|
||||||
viewableData.addViewable(viewable);
|
viewableData.addViewable(viewable);
|
||||||
@ -620,6 +711,7 @@ async function addHotPoint(data) {
|
|||||||
if (event != undefined && event != null) {
|
if (event != undefined && event != null) {
|
||||||
if (event.dbId >= dbIdStart && event.dbId <= dbIdEnd) {//event.dbId > 0 && event.dbId < 19
|
if (event.dbId >= dbIdStart && event.dbId <= dbIdEnd) {//event.dbId > 0 && event.dbId < 19
|
||||||
console.log(`Sprite clicked: ${event.dbId}`);
|
console.log(`Sprite clicked: ${event.dbId}`);
|
||||||
|
openHotspotModal();
|
||||||
for (let i = dbIdStart; i <= dbIdEnd; i++) {
|
for (let i = dbIdStart; i <= dbIdEnd; i++) {
|
||||||
changeColorForHotspot(i, false);
|
changeColorForHotspot(i, false);
|
||||||
changeScaleForHotspot(i, false);
|
changeScaleForHotspot(i, false);
|
||||||
@ -646,6 +738,7 @@ async function addHotPoint(data) {
|
|||||||
// if (dbIds.length > 0) {
|
// if (dbIds.length > 0) {
|
||||||
// // 處理已選取元件的邏輯
|
// // 處理已選取元件的邏輯
|
||||||
// $(selector).trigger("autodesk:click:sprite", event);
|
// $(selector).trigger("autodesk:click:sprite", event);
|
||||||
|
// //openHotspotModal();
|
||||||
// console.log(`------ name: ${viewer.model.getInstanceTree().getNodeName(dbIds)} , dbId: ${dbIds}`);//, id: ${event.clickInfo.object.id}, position.x: ${event.clickInfo.point.x}, y: ${event.clickInfo.point.y}, z: ${event.clickInfo.point.z}
|
// console.log(`------ name: ${viewer.model.getInstanceTree().getNodeName(dbIds)} , dbId: ${dbIds}`);//, id: ${event.clickInfo.object.id}, position.x: ${event.clickInfo.point.x}, y: ${event.clickInfo.point.y}, z: ${event.clickInfo.point.z}
|
||||||
// } else {
|
// } else {
|
||||||
// // 處理沒有選取元件的邏輯
|
// // 處理沒有選取元件的邏輯
|
||||||
@ -687,16 +780,52 @@ async function changeScaleForHotspot(dbId, type = true) {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
//------------------------------ end ----------------------------------
|
|
||||||
|
|
||||||
//------------------------------ 熱圖 ---------------------------------
|
//------------------- end --------------
|
||||||
async function loadHeatmaps(model, roomsArr) {
|
|
||||||
|
//----------------- 開關熱點小視窗 ----------------------
|
||||||
|
function openHotspotModal() {
|
||||||
|
//var modal = document.getElementById("hotspotModal");
|
||||||
|
//modal.style.display = "block";
|
||||||
|
//$("#pills-register-tab").removeClass("active");
|
||||||
|
//$("#pills-alarm-tab").removeClass("active");
|
||||||
|
//$("#pills-operation-tab").removeClass("active");
|
||||||
|
//$("#pills-login-tab").tab("show");
|
||||||
|
}
|
||||||
|
|
||||||
|
function closeHotspotModal() {
|
||||||
|
//var modal = document.getElementById("hotspotModal");
|
||||||
|
//modal.style.display = "none";
|
||||||
|
|
||||||
|
}
|
||||||
|
//------------------ end --------------------------------
|
||||||
|
|
||||||
|
//------------------ 熱圖 -------------------------------
|
||||||
|
async function loadHeatmaps(model) {
|
||||||
const dataVizExtn = await viewer.loadExtension("Autodesk.DataVisualization");
|
const dataVizExtn = await viewer.loadExtension("Autodesk.DataVisualization");
|
||||||
var devices = [];
|
|
||||||
|
|
||||||
myDataList.forEach((myData, index) => {
|
//取三個空調設備的位置打點
|
||||||
devices.push({ id: index, position: JSON.parse(myData.device_coordinate_3d), sensorTypes: ["temperature", "humidity"] });
|
const devices = [
|
||||||
});
|
{
|
||||||
|
id: "Oficina 5",
|
||||||
|
//name: "Oficina-",
|
||||||
|
position: { x: 6.98, y: -19.00, z: 16.86 }, // x: 0, y: 25, z: -2.5 (-4.93, -20.61, 16.86)
|
||||||
|
sensorTypes: ["temperature", "humidity"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "Oficina 4",
|
||||||
|
//name: "Oficina-",
|
||||||
|
position: { x: 35.85, y: -2.24, z: 16.86 }, // x: 0, y: 25.03, z: -2.52 (23.94, -3.85, 16.86)
|
||||||
|
sensorTypes: ["temperature", "humidity"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "Oficina 3",
|
||||||
|
//name: "Oficina-",
|
||||||
|
position: { x: 6.98, y: -2.24, z: 16.86 }, // x: 0, y: 25.03, z: -2.52 (-4.93, -3.85, 16.86)
|
||||||
|
sensorTypes: ["temperature", "humidity"]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
//冷氣N5: (-4.93, -20.61, 16.86), N4: (23.94, -3.85, 16.86), N3: (-4.93, -3.85, 16.86)
|
||||||
|
|
||||||
// Initialize sensor values
|
// Initialize sensor values
|
||||||
let sensorVals = [];
|
let sensorVals = [];
|
||||||
@ -705,9 +834,7 @@ async function loadHeatmaps(model, roomsArr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const roomDbIds = [];
|
const roomDbIds = [];
|
||||||
for (var i = 0; i < roomsArr.length; i++) {
|
roomDbIds.push(7567);
|
||||||
roomDbIds.push(roomsArr[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
SurfaceShadingData,
|
SurfaceShadingData,
|
||||||
@ -732,10 +859,11 @@ async function loadHeatmaps(model, roomsArr) {
|
|||||||
|
|
||||||
// Setup surface shading
|
// Setup surface shading
|
||||||
await dataVizExtn.setupSurfaceShading(model, heatmapData);
|
await dataVizExtn.setupSurfaceShading(model, heatmapData);
|
||||||
|
|
||||||
dataVizExtn.registerSurfaceShadingColors("temperature", [0xff0000, 0x0000ff]);
|
dataVizExtn.registerSurfaceShadingColors("temperature", [0xff0000, 0x0000ff]);
|
||||||
|
|
||||||
function getSensorValue(device, sensorType) {
|
function getSensorValue(device, sensorType) {
|
||||||
return sensorVals[parseInt(device.id)];
|
return sensorVals[parseInt(device.id.slice(-1)) - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
dataVizExtn.renderSurfaceShading("Room Panel", "temperature", getSensorValue);
|
dataVizExtn.renderSurfaceShading("Room Panel", "temperature", getSensorValue);
|
||||||
@ -748,9 +876,97 @@ async function loadHeatmaps(model, roomsArr) {
|
|||||||
dataVizExtn.updateSurfaceShading(getSensorValue);
|
dataVizExtn.updateSurfaceShading(getSensorValue);
|
||||||
}, 2000);
|
}, 2000);
|
||||||
}
|
}
|
||||||
//------------------------------ end ----------------------------------
|
//------------------ end --------------------------------
|
||||||
|
async function loadHeatmapsForFloor(model) {
|
||||||
|
|
||||||
//--------------------------- -- 剖面 ---------------------------------
|
const dataVizExtn = await viewer.loadExtension("Autodesk.DataVisualization");
|
||||||
|
|
||||||
|
//x: -17.33, y: 51.03, z: -2.52
|
||||||
|
const devices = [
|
||||||
|
{
|
||||||
|
id: "Oficina 5",
|
||||||
|
//name: "Oficina-",
|
||||||
|
position: { x: 6.98, y: -19.00, z: 16.86 }, // x: 0, y: 25, z: -2.5 (-4.93, -20.61, 16.86)
|
||||||
|
sensorTypes: ["temperature", "humidity"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "Oficina 4",
|
||||||
|
//name: "Oficina-",
|
||||||
|
position: { x: 35.85, y: -2.24, z: 16.86 }, // x: 0, y: 25.03, z: -2.52 (23.94, -3.85, 16.86)
|
||||||
|
sensorTypes: ["temperature", "humidity"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "Oficina 3",
|
||||||
|
//name: "Oficina-",
|
||||||
|
position: { x: 6.98, y: -2.24, z: 16.86 }, // x: 0, y: 25.03, z: -2.52 (-4.93, -3.85, 16.86)
|
||||||
|
sensorTypes: ["temperature", "humidity"]
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
// Initialize sensor values
|
||||||
|
let sensorVals = [];
|
||||||
|
for (let i = 0; i < devices.length; i++) {
|
||||||
|
sensorVals[i] = Math.random();
|
||||||
|
}
|
||||||
|
|
||||||
|
const roomDbIds = [];
|
||||||
|
|
||||||
|
roomDbIds.push(7567);
|
||||||
|
|
||||||
|
const {
|
||||||
|
SurfaceShadingData,
|
||||||
|
SurfaceShadingPoint,
|
||||||
|
SurfaceShadingNode,
|
||||||
|
} = Autodesk.DataVisualization.Core;
|
||||||
|
|
||||||
|
const shadingNode = new SurfaceShadingNode("Room Panel", roomDbIds);
|
||||||
|
|
||||||
|
devices.forEach((device) => {
|
||||||
|
const shadingPoint = new SurfaceShadingPoint(
|
||||||
|
device.id,
|
||||||
|
device.position,
|
||||||
|
device.sensorTypes
|
||||||
|
);
|
||||||
|
shadingNode.addPoint(shadingPoint);
|
||||||
|
});
|
||||||
|
|
||||||
|
const heatmapData = new SurfaceShadingData();
|
||||||
|
heatmapData.addChild(shadingNode);
|
||||||
|
heatmapData.initialize(model);
|
||||||
|
|
||||||
|
// Setup surface shading
|
||||||
|
await dataVizExtn.setupSurfaceShading(model, heatmapData);
|
||||||
|
|
||||||
|
//dataVizExtn.registerSurfaceShadingColors("co2", [0x00ff00, 0xff0000]);
|
||||||
|
dataVizExtn.registerSurfaceShadingColors("temperature", [0xff0000, 0x0000ff]);
|
||||||
|
|
||||||
|
function getSensorValue(device, sensorType) {
|
||||||
|
return sensorVals[parseInt(device.id.slice(-1)) - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
dataVizExtn.renderSurfaceShading("Room Panel", "temperature", getSensorValue);
|
||||||
|
|
||||||
|
setInterval(() => {
|
||||||
|
// Modify sensor values.
|
||||||
|
for (let i = 0; i < devices.length; i++) {
|
||||||
|
sensorVals[i] = Math.random();
|
||||||
|
}
|
||||||
|
dataVizExtn.updateSurfaceShading(getSensorValue);
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
async function loadHeatmap() {
|
||||||
|
const model = viewer.model;
|
||||||
|
loadHeatmaps(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadHeatmapForFloor() {
|
||||||
|
const model = viewer.model;
|
||||||
|
loadHeatmapsForFloor(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------ 剖面 ----------------------
|
||||||
async function getRemoteLevels() {
|
async function getRemoteLevels() {
|
||||||
const aecData = await Autodesk.Viewing.Document.getAecModelData(this.viewer.model.getDocumentNode());
|
const aecData = await Autodesk.Viewing.Document.getAecModelData(this.viewer.model.getDocumentNode());
|
||||||
if (!aecData.levels) return null;
|
if (!aecData.levels) return null;
|
||||||
@ -760,6 +976,21 @@ async function getRemoteLevels() {
|
|||||||
return levels2;
|
return levels2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function getLevelsData(lowerFloor, upperFloor) {
|
||||||
|
|
||||||
|
const data = await this.getRemoteLevels();
|
||||||
|
for (var i = 0; i < data.length; i++) {
|
||||||
|
if ((data[i].name).indexOf(lowerFloor) != -1) {
|
||||||
|
lowerIdx = i;
|
||||||
|
}
|
||||||
|
if ((data[i].name).indexOf(upperFloor) != -1) {
|
||||||
|
upperIdx = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.levels = data;
|
||||||
|
profile();
|
||||||
|
}
|
||||||
|
|
||||||
function getCutPlaneParam(idx, n) {
|
function getCutPlaneParam(idx, n) {
|
||||||
if (idx < 0 || !n) return;
|
if (idx < 0 || !n) return;
|
||||||
|
|
||||||
@ -779,38 +1010,10 @@ function getCutPlaneParam(idx, n) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function profile() {
|
function profile() {
|
||||||
|
//const upperIdx = 6;
|
||||||
const upperCutPlaneParam = this.getCutPlaneParam(upperIdx, 1);
|
const upperCutPlaneParam = this.getCutPlaneParam(upperIdx, 1);
|
||||||
|
//const lowerIdx = 7;
|
||||||
const lowerCutPlaneParam = this.getCutPlaneParam(lowerIdx, -1);
|
const lowerCutPlaneParam = this.getCutPlaneParam(lowerIdx, -1);
|
||||||
this.viewer.setCutPlanes([upperCutPlaneParam, lowerCutPlaneParam]);
|
this.viewer.setCutPlanes([upperCutPlaneParam, lowerCutPlaneParam]);
|
||||||
}
|
}
|
||||||
//------------------------------ end ----------------------------------
|
//----------------- end -----------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
//======================== 外部呼叫function ===========================
|
|
||||||
//紀錄熱點座標
|
|
||||||
function getHopspotPoint(data) {
|
|
||||||
myDataList = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
//呼叫載入熱圖
|
|
||||||
async function toLoadHeatmap(roomArr) {
|
|
||||||
const model = viewer.model;
|
|
||||||
loadHeatmaps(model, roomArr);
|
|
||||||
}
|
|
||||||
|
|
||||||
//取得levels,執行剖面
|
|
||||||
async function getLevelsData(lowerFloor, upperFloor) {
|
|
||||||
|
|
||||||
const data = await this.getRemoteLevels();
|
|
||||||
for (var i = 0; i < data.length; i++) {
|
|
||||||
if ((data[i].name).indexOf(lowerFloor) != -1) {
|
|
||||||
lowerIdx = i;
|
|
||||||
}
|
|
||||||
if ((data[i].name).indexOf(upperFloor) != -1) {
|
|
||||||
upperIdx = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.levels = data;
|
|
||||||
profile();
|
|
||||||
}
|
|
||||||
//============================= end ===================================
|
|
@ -92,6 +92,7 @@ $.fn.YTTooltip = function (option) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
$("body").append(clone);
|
$("body").append(clone);
|
||||||
|
$(obj.ele).trigger("yt:tooltip:show");
|
||||||
//push 已顯示紀錄
|
//push 已顯示紀錄
|
||||||
obj.isShowArr.push(ranId);
|
obj.isShowArr.push(ranId);
|
||||||
obj.tooltipDiv = clone;
|
obj.tooltipDiv = clone;
|
||||||
@ -125,6 +126,7 @@ $.fn.YTTooltip = function (option) {
|
|||||||
}
|
}
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
obj.onShow ? obj.onShow(clone, obj.ele, obj) : "";
|
obj.onShow ? obj.onShow(clone, obj.ele, obj) : "";
|
||||||
|
$(obj.ele).trigger("yt:tooltip:shown");
|
||||||
}, 10)
|
}, 10)
|
||||||
event();
|
event();
|
||||||
} else {
|
} else {
|
||||||
@ -158,6 +160,8 @@ $.fn.YTTooltip = function (option) {
|
|||||||
let _obj = $(obj.ele)[0]._ytTooltip;
|
let _obj = $(obj.ele)[0]._ytTooltip;
|
||||||
onHide ? onHide($("#yt_tooltip_" + tooId), _obj.ele, _obj) : "";
|
onHide ? onHide($("#yt_tooltip_" + tooId), _obj.ele, _obj) : "";
|
||||||
|
|
||||||
|
$(obj.ele).trigger("yt:tooltip:hide");
|
||||||
|
|
||||||
$("#yt_tooltip_" + tooId).remove();
|
$("#yt_tooltip_" + tooId).remove();
|
||||||
obj.isShowArr.splice($.inArray(tooId, obj.isShowArr), 1);
|
obj.isShowArr.splice($.inArray(tooId, obj.isShowArr), 1);
|
||||||
//setTimeout(function () {
|
//setTimeout(function () {
|
||||||
|
Loading…
Reference in New Issue
Block a user