Procházet zdrojové kódy

集成工厂模型v1

liling před 5 měsíci
rodič
revize
9d7280ef71
2 změnil soubory, kde provedl 170 přidání a 67 odebrání
  1. 2 2
      global.js
  2. 168 65
      main.html

+ 2 - 2
global.js

@@ -1,5 +1,5 @@
 var AutoPlayer = false; //开启自动漫游
-var SERVER_URL = "http://localhost:8080/api"; //服务接口地址
+var SERVER_URL = "http://127.0.0.1:8080/api"
 var PLAYER3D_URL = "ws://192.168.66.133:8082"; //
 var DEV_ALAR_COLOR = "ff6c00"; //全局设备告警颜色
 var DEV_HINT_COLOR = "d69d85"; //设备盘头剩余20-50之间的提示颜色
@@ -22,4 +22,4 @@ Date.prototype.Format = function(fmt) { //author: meizz
     for (var k in o)
         if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
     return fmt;
-}
+}

+ 168 - 65
main.html

@@ -1390,6 +1390,14 @@
         // 渲染的格式svg/canvas/html,svg性能更优,兼容性更好
         renderer: "svg",
     });
+    var currentTargetType="FAC";//当前视图对象类型。FAC:厂房 IN02:2号楼内部  IN03:3号楼内部
+    //切换点列表
+    var inPoints={
+        "IN02":{"Text001_002":1,"x1":-28.07801,"y1":37.95126,"x2":-23.32394,"y2":31.16921},
+        "IN03":{"Text001_006":1,"x1":46.86921,"y1":24.87041,"x2":51.91054,"y2":17.87417},
+        "IN04":{"Text001_004":1,"x1":-38.46275,"y1":35.65208,"x2":-44.94122,"y2":28.22142},
+        "IN05":{"Text001_005":1,"x1":102.43050,"y1":38.96248,"x2":108.99212,"y2":30.86295}
+    }
     var sam0023;
     var modelsMap = {}
     var modelsAlarmColorMap = {};
@@ -1397,6 +1405,7 @@
     var ALARM_DEVS = [];  //未提醒的告警设备,将在模型加载完成时提醒
     var OFFLINE_DEVS = {};  //未接入设备列表
     var LoadServerDataTimer = null;
+    var zoomCount=0;//放大、缩小次数。为正表示放大次数,为负表示缩小次数
     var DataFill = {
         devStopAutoLoadTimter: null,//停机原因自动切计时器
         devAlarmAutoLoadTimter: null,//告警自动切计时器
@@ -2327,6 +2336,22 @@
         isRTL: false
     };
     $(document).ready(function () {
+        $(window).on('wheel', function(event) {
+            // 检查 event.originalEvent.deltaY 来判断滚动方向
+            if (event.originalEvent.deltaY > 0) {
+                console.log('向下滚动:缩小'+zoomCount);
+                zoomCount = zoomCount>0?-1:zoomCount-1
+                if(zoomCount<=-3 && currentTargetType!="FAC"){
+                    zoomCount=0;
+                    //切换在全厂视图
+                    loadFacModel(playerNative);
+                    backMasterViewByFac();
+                }
+            } else {
+                console.log('向上滚动:放大');
+                zoomCount = zoomCount<0?1:zoomCount+1
+            }
+        });
         $.datepicker.setDefaults($.datepicker.regional['zh-CN']);  //设置日期控制语言
         $("#datepicker1").datepicker({
             dateFormat: "yy-mm-dd",
@@ -2747,8 +2772,36 @@
         })
     }
 
-    //最佳视图
-    function backMasterView() {
+    function backMasterView() {    
+        zoomCount=0;
+        switch(currentTargetType){
+            case "FAC":
+                backMasterViewByFac();
+                break;
+            case "IN02":
+                backMasterViewBy02();
+                break;
+            case "IN03":
+                backMasterViewBy03();
+                break;
+        }
+    }
+
+    //全局厂房最佳视图
+    function backMasterViewByFac(){
+        if (AutoPlayer) {
+            const img = $("#autoplayer_btn").find("img");
+            img.attr("src", "image/auto3d_stop.png");
+            try {
+                player.Native.CameraAnimation.stop();
+            } catch (e) {
+            }
+        }
+        player.Native.Camera.moveTo([235.678127000173, 13.38107286701451, 74.13573809425804], [-1248.3191825020908, -262.59031050373517, -409.93944372657353], [-0.30023176822741604, -0.055832565112502126, 0.9522308596238611], 1);
+    }
+
+    //2号楼内部最佳视图
+    function backMasterViewBy02() {
         if (AutoPlayer) {
             const img = $("#autoplayer_btn").find("img");
             img.attr("src", "image/auto3d_stop.png");
@@ -2785,6 +2838,8 @@
         maxTimeout: 1000, // 会话超时时间,允许掉线后引擎保存多久,在该时间内可重新连接到会话,否则会创建新的会话
         debug: false // 是否启用调试,开启后调用Native接口时会使用console.log进行记录
     });
+    var modelLoadState={};//模型加载状态
+    var playerNative = null;
     var playerConnState = false;
     var reconntimer = null;
     //2.[可选]监听连接成功消息
@@ -2811,68 +2866,84 @@
         console.info(`用户长时间没有操作三维视图,会话即将退出,可调用player.resetTimer()取消退出`);
         if (!AutoPlayer) $("#autoplayer_btn").trigger('click') //开启自动漫游
     });
-    //6.监听远程过程调用加载完成消息
-    player.on("NativeLoad", async (Native) => {
-        var devAllCount = 6 * 12 * 2 - 4 //设备总数
-        //var loadedcnt = document.getElementById("loadedcnt")
-        //var totalcnt = document.getElementById("totalcnt")
-        //totalcnt.innerText = devAllCount;
-        //loadedcnt.innerText="0";
-        var cf = "data://models/ALL.pr";
-        var t2File = "data://models/T2.pr";
-        //var SamplerFile = "data://models/sampler.pr";
-        // var errStr = await PlayerUtils.call(Native.NodeProxy.openProject, "data://pprj/test/test.pprj");
-        // 加载工程模型
-        var errStr = await PlayerUtils.call(Native.Model.loadModel, "all", cf);
-        //let cfInfo=await player.Native.Model.getInfo("all");
-        //player.Native.NodeProxy.setNodeRotation(cfInfo.nodePtr, [0,0,90]);
-        var rootItem = await player.Native.ModelTree.getRootItems()
-        var rowItems = await player.Native.ModelTree.getSubItems(rootItem[0].item)
-        for (var row = 0; row < rowItems.length; row++) {
-            if (rowItems[row].name.length < 2 || rowItems[row].name.substr(0, 1) != "R") continue;
-            var devItems = await player.Native.ModelTree.getSubItems(rowItems[row].item)
-            for (var i = 0; i < devItems.length; i++) {
-                if (devItems[i].name.length < 2 || devItems[i].name.substr(0, 2) != 'C_') continue
-                var tmp = devItems[i];// await player.Native.ModelTree.findItemByName(name,0,true,3);
 
-                //计算当前设备在世界坐标
-                var xyz = await player.Native.ModelTree.calcItemAabb(tmp.item)
-                var xyz2 = [(xyz.aabb.max[0] + xyz.aabb.min[0]) * 0.5, (xyz.aabb.max[1] + xyz.aabb.min[1]) * 0.5, (xyz.aabb.max[2] + xyz.aabb.min[2]) * 0.5];
-                // 创建设备编号标记
-                /*
-                var options = {
-                    "text": devItems[i].name.replace("C_", "") + "#",
-                    "visible": true,
-                    "maxLod": 110,
-                    "minLod": 0.1,
-                    "textColor": parseInt("0xffffffff")
-                };
-                options.pos = [xyz2[0] - 1.5, xyz2[1] - 3, 0]
-                var markPtr = await player.Native.GisMarker.create(options);
-                player.Native.GisMarker.update(markPtr, options);
-                */
-                modelsMap[tmp.name] = {item: tmp.item, xyz: xyz2, rowno: rowItems[row].name.substr(1)}
-                //初始化设备状态颜色
-                ChangeModelAlarmState2(tmp.name);
-                //创建指示灯标记
-                /*
-                var alarmColorMarker = {
-                    "text": "●",
-                    "visible": true,
-                    "maxLod": 110,
-                    "minLod": 0.1,
-                    "textFontSize": 14,
-                    "textColor": parseInt("0xffffff00") //透明色
+    async function loadFacModel(Native){
+        await player.Native.Model.setModelVisible("IN02",false);
+        await player.Native.Model.setModelVisible("IN03",false);
+        await player.Native.Model.setModelVisible("IN04",false);
+        await player.Native.Model.setModelVisible("IN05",false);
+        currentTargetType="FAC";
+        if(modelLoadState[currentTargetType]==null){
+            var cf = "data://models/T_ALL.pr";
+            var errStr = await PlayerUtils.call(Native.Model.loadModel, currentTargetType, cf);
+            modelLoadState[currentTargetType] = true;
+        }
+        await player.Native.Model.setModelVisible(currentTargetType,true);
+        player.Native.CameraAnimation.clearKeyFrame();
+    }
+    async function loadIn02Model(Native){
+        currentTargetType="IN02";
+        await player.Native.Model.setModelVisible("FAC",false);
+        if(modelLoadState[currentTargetType]==null){
+            var cf = "data://models/ALL.pr";
+            var errStr = await PlayerUtils.call(Native.Model.loadModel, currentTargetType, cf);
+            modelLoadState[currentTargetType]=true;
+            //let cfInfo=await player.Native.Model.getInfo("all");
+            //player.Native.NodeProxy.setNodeRotation(cfInfo.nodePtr, [0,0,90]);
+            var rootItem = await player.Native.ModelTree.getRootItems()
+            //console.log(rootItem)
+            var rowItems = await player.Native.ModelTree.getSubItems(rootItem[0].item)
+            for (var row = 0; row < rowItems.length; row++) {
+                if (rowItems[row].name.length < 2 || rowItems[row].name.substr(0, 1) != "R") continue;
+                var devItems = await player.Native.ModelTree.getSubItems(rowItems[row].item)
+                for (var i = 0; i < devItems.length; i++) {
+                    if (devItems[i].name.length < 2 || devItems[i].name.substr(0, 2) != 'C_') continue
+                    var tmp = devItems[i];// await player.Native.ModelTree.findItemByName(name,0,true,3);
+
+                    //计算当前设备在世界坐标
+                    var xyz = await player.Native.ModelTree.calcItemAabb(tmp.item)
+                    var xyz2 = [(xyz.aabb.max[0] + xyz.aabb.min[0]) * 0.5, (xyz.aabb.max[1] + xyz.aabb.min[1]) * 0.5, (xyz.aabb.max[2] + xyz.aabb.min[2]) * 0.5];
+                    // 创建设备编号标记
+                    /*
+                    var options = {
+                        "text": devItems[i].name.replace("C_", "") + "#",
+                        "visible": true,
+                        "maxLod": 110,
+                        "minLod": 0.1,
+                        "textColor": parseInt("0xffffffff")
+                    };
+                    options.pos = [xyz2[0] - 1.5, xyz2[1] - 3, 0]
+                    var markPtr = await player.Native.GisMarker.create(options);
+                    player.Native.GisMarker.update(markPtr, options);
+                    */
+                    modelsMap[tmp.name] = {item: tmp.item, xyz: xyz2, rowno: rowItems[row].name.substr(1)}
+                    //初始化设备状态颜色
+                    ChangeModelAlarmState2(tmp.name);
+                    //创建指示灯标记
+                    /*
+                    var alarmColorMarker = {
+                        "text": "●",
+                        "visible": true,
+                        "maxLod": 110,
+                        "minLod": 0.1,
+                        "textFontSize": 14,
+                        "textColor": parseInt("0xffffff00") //透明色
+                    }
+                    alarmColorMarker.pos = [xyz2[0] + 0.7, xyz2[1] - 3, 0]
+                    var colormarkPtr = await player.Native.GisMarker.create(alarmColorMarker);
+                    player.Native.GisMarker.update(colormarkPtr, alarmColorMarker);
+                    modelsAlarmColorMap[tmp.name] = {itemPtr: colormarkPtr, options: alarmColorMarker}
+                    */
                 }
-                alarmColorMarker.pos = [xyz2[0] + 0.7, xyz2[1] - 3, 0]
-                var colormarkPtr = await player.Native.GisMarker.create(alarmColorMarker);
-                player.Native.GisMarker.update(colormarkPtr, alarmColorMarker);
-                modelsAlarmColorMap[tmp.name] = {itemPtr: colormarkPtr, options: alarmColorMarker}
-                */
             }
+            //loadedcnt.innerText=totalcnt.innerText;
+            MODEL_LOADED = 1;
         }
-        //loadedcnt.innerText=totalcnt.innerText;
-        MODEL_LOADED = 1;
+        for (var i in ANIMATION_DATA) {
+            // 添加关键帧
+            player.Native.CameraAnimation.addKeyFrames([ANIMATION_DATA[i]]);
+        }
+        await player.Native.Model.setModelVisible(currentTargetType,true);
         if (ALARM_DEVS.length > 0) {
             for (var i = 0; i < ALARM_DEVS.length; i++) {
                 var s = ALARM_DEVS[i].split(">")
@@ -2883,11 +2954,16 @@
         }
         //获取在线设备列表
         GetOnlineDev();
-
-        for (var i in ANIMATION_DATA) {
-            // 添加关键帧
-            player.Native.CameraAnimation.addKeyFrames([ANIMATION_DATA[i]]);
-        }
+    }
+    //6.监听远程过程调用加载完成消息
+    player.on("NativeLoad", async (Native) => {
+        playerNative =Native;
+        var devAllCount = 6 * 12 * 2 - 4 //设备总数
+        //var loadedcnt = document.getElementById("loadedcnt")
+        //var totalcnt = document.getElementById("totalcnt")
+        //totalcnt.innerText = devAllCount;
+        //loadedcnt.innerText="0";
+        loadFacModel(Native);
         if (document.getElementById("loading") != null) document.getElementById("loading").remove(true) //加载完成,移除Loading
         if (document.getElementById("loading_a1") != null) document.getElementById("loading_a1").remove(true)
         //调整视角,使其达到最佳初始效果
@@ -2913,6 +2989,33 @@
         // 点击事件一般仅用于浏览工具,在点选工具下无效
         Native.Tools.setCurrentTool("system.Browse");
         Native.ModelTree.EventBrowseLClick.connect((event) => {
+            if(currentTargetType=="FAC"){
+                var inTxt = "";
+                if(inPoints[event.object.name]!=null){
+                    //进入楼层内部
+                     inTxt = txt;
+                }else {
+                    for (var txt in inPoints) {
+                        var item = inPoints[txt];
+                        if(event.pos[1]>= item["x1"] && event.pos[2]<= item["y1"] &&event.pos[1]<= item["x2"] && event.pos[2]>= item["y2"]){
+                            inTxt = txt;
+                            break;
+                        }
+                    }
+                }
+                if(inTxt!=""){
+                    currentTargetType=inTxt;
+                    switch(inTxt){
+                        case "IN02":
+                            loadIn02Model(Native);
+                            break;
+                        default:
+                            break;
+                    }
+                    backMasterView();               
+                }
+                return;
+            }
             updateInfo("LClick", event)
         });
         Native.ModelTree.EventBrowseRClick.connect((event) => {