Skyline(6.x)-Web二次开发-多窗口对比

GitHub上获取源码

1.打开个3D窗口

一个页面加载多个TerraExplorer3DWindow和SGWorld等只有第一个能用(即使用iframe也是一样)

所以我决定打开两个新页面实现多窗口对比,然后我在《主页面》使用window.open打开了两个《新页面》,但这两个新页面使用SGWorld时居然在主页面(使用window.open的页面)产生了效果,感觉和以前的一个页面加载多个TerraExplorer3DWindow 和 SGWorld效果一样了!!!

然后经过测试发现关闭主页面新页面就正常加载三维地图了。可以看出使用window.open时主页面和新页面是有关联的,我一开始试了很多方法都断不开这个关联,最后决定打开新页面时多打开一个主页面,然后关掉主页面这种笨方法。

当使用window.close当前关闭窗口,居然没有关上,我一搜发现了关闭前有这一行代码window.opener=null

opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用。

opener 属性非常有用,创建的窗口可以引用创建它的窗口所定义的属性和函数。

断开主页面和新页面关联的方法找到了!!!

总结:

使用window.open打开两个窗口,然后设置window.opener为null,这样就可以在不同窗口中打开三维场景了。

修正:

今天又测试一下设置window.opener为null不好使,还是使用将主页面关闭这种方法吧=_=

2.多个3D窗口同步

经测试使用HTTP协议通过web服务器进行多窗口联动(在页面摄像机参数改变时修改服务器的浏览器位置数据,所有页面每隔一定时间获取摄像机参数,当获取到的摄像机参数与当前三维场景摄像机参数的改变量大于阈值就更新当前三维场景摄像机参数),在每500ms同步一次的条件下不到一分钟IE浏览器就接收或发送HTTP请求就出现问题。然后经过调查资料使用长连接(WebSocket)技术可以处理这种高频访问并且多客户端通信的请求。使用WebSocket完成此功能只需三步即可:

  1. 客户端摄像机参数的改变发送给服务器,
  2. 服务器接收到请求后发送当前坐标给其他客户端,
  3. 客户端接收到消息后更新摄像机参数。

Node.js后端代码

var express = require(‘express‘);
var http = require(‘http‘);
var WebSocket = require(‘ws‘);
var fs = require(‘fs‘);

var app = express();
var server = http.createServer(app);
var wss = new WebSocket.Server({server});
wss.on(‘connection‘, function connection(ws) {// 创建连接
  console.log(‘链接成功!‘);
  ws.on(‘message‘, function incoming(data) {// 接收消息
    wss.clients.forEach(function each(client) {
      /*
        给全部客户端(创建连接的客户端)中
        除了发送者客户端(本次发送给服务器消息的客户端)的其他客户端发送消息
      */
      if (client != ws) {client.send(data)}
    });
  });
});
// 启动WebSocket
server.listen(18848, function listening() {
  console.log(‘服务器启动成功!‘);
});

前端主要js代码:

import update_pos from ‘./update_pos‘
export default function(){
  // ws
  this.wsServer = new WebSocket(this.ws_url);
  this.wsServer.onopen = function (e) {
    (typeof e == ‘string‘) && this.send(e);//向后台发送数据
  };
  this.wsServer.onclose = function (e) {//当链接关闭的时候触发

  };
  this.wsServer.onmessage = function (e) {//后台返回消息的时候触发
    // console.log(‘get_sync_info‘)
    // console.log(data)
    var sync_info = JSON.parse(e.data).sync_info
    var pos_arr = sync_info.pos
    var pos = SGWorld.Creator.CreatePosition(pos_arr[0], pos_arr[1], pos_arr[2], pos_arr[3], pos_arr[4], pos_arr[5]);
    SGWorld.Navigate.SetPosition(pos);
  };
  this.wsServer.onerror = function (e) {//错误情况触发

  }

  // 定时更新位置
  this.last_pos = {};
  this.sync_interval = setInterval(update_pos.bind(this), this.interval)
}

原文地址:https://www.cnblogs.com/jffun-blog/p/9140987.html

时间: 2024-08-02 20:11:29

Skyline(6.x)-Web二次开发-多窗口对比的相关文章

NX二次开发-NXOpen窗口打印NXMessageBox&ListingWindow

1 NX9+VS2012 2 3 #include <NXOpen/NXObject.hxx> 4 #include <NXOpen/Part.hxx> 5 #include <NXOpen/PartCollection.hxx> 6 #include <NXOpen/UI.hxx> 7 #include <NXOpen/NXMessageBox.hxx> 8 #include <NXOpen/ListingWindow.hxx> 9

Skyline(6.x)-二次开发手册使用技巧

毕业设计选择Skyline的Web端二次开发,由于以前没有接触过ActiveX控件的使用,二次开发手册是英文的读起来有点吃力,并且IE直接控制台输出ActiveX控件创建的对象看不到内部的属性和方法,使得整个毕设快做完了才感觉弄明了Skyline二次开发的套路. 手册存放位置 默认安装是:C:\Program Files (x86)\Skyline\TerraExplorer Pro\Help\ProgrammersGuide.chm 查看ActiveX控件创建的对象看的属性和方法 使用Obje

【0002(基础)】Skyline二次开发入门经典系列教程&mdash;&mdash;目录

这段时间由于个人事务太多,以至于没有按照时间更新系列教程,本人将尽快补上所欠章节,在此说声抱歉!   这一章在我心目中占有很重要的地位,因为我想通过这一章的内容来确定整个系列的大致走向.然而在整理的过程中,发现现实远比想象要复杂得多:首先想尽可能介绍较多的知识点,其次又要考虑学习的简易程度,再次又要确定顺当的知识体系流程-- 由于暂时的考虑无论如何也是不可能完备的,因此为了不影响后面教程的编写,暂定把这一章作为一个[流动性质]的可变章节,在编写每一章时,动态根据实际情况修改(添加.移动.修改)系

【0001(基础)】Skyline二次开发入门经典系列教程总览

本人是从2012年开始接触Skyline二次开发的,经历过 v6.0~v6.5(最新的6.6版本还未使用)的所有版本.作为一名非GIS专业毕业的大学本科生,鬼使神差般地进入了这个瑰丽的GIS领域.因此,在从事了4年多的Skyline二次开发工作后,我不能说我是"授业有专攻",更不能说我是"闻道有先后".在这个领域内,大牛之人比比皆是,正是因为他们的存在与指引,才使得我现在有点东西可以写出来供大家交流沟通.   整理这个系列教程的原因主要出于如下几点的考虑: 1.Sk

[地图SkyLine二次开发]框架(2)

上节讲到,地图加载. 但我们可以发现,当没有页面布局的情况下,<OBJECT>控件,没有占满整个屏幕,这里我们就要用到Extjs的功能了. 这节要讲的是用Extjs为<OBJECT>控件布局,让它适应任何版本的IE浏览器(因为SkyLine目前只支持IE). 1.将Extjs包引进项目. -这里需要注意,网上下载的Extjs5.0包里,包含有很多例子之类的,为了保证项目尽可能的干净,我们只去一小部分. 2.在项目中应用 -我们在上一节,将OBJECT空间直接写在Index.csht

[地图SkyLine二次开发]关于IE内存限制问题(1G)......(续)

二次开发Skyline时(B/S),经常会遇到,IE浏览器内存不够,导致崩溃的问题. 在上一个博文中写到,将IE-32bit浏览器内存限制扩展的解决办法. 上一个博文中做出来的iexplore.exe的基础上,将Skyline的安装包,以及适应浏览器版本的程序,打包成一个安装包. 在客户第一次登陆本系统时,让客户只需安装一次就OK. 一.准备工作: 1.下载.NetFrameWork4.5 2.将IE各个版本,按上一个博文中的方法,对应每一个版本,都做出来iexplore.exe 3.做适应IE

[地图SkyLine二次开发]框架(3)

上节将显示我们地图的OBJECT控件,布了一下局,但地图没有进行加载. 这是因为我们要在另一个页面,对OBJECT控件进行地图加载,并且得到该控件的sgworld,以便对其进行我们想要的开发. 这里,细心的人会说,为什么要在另一个页面加载呢?为什么不在OBJECT所在页面进行加载呢? 这也是一个比较关键性的问题,原因很简单, 因为Object控件上,放置任何DIV,SPAN,或者其他控件时,都会被Object控件覆盖在下面. 在网上找了很多办法,最有效的,而且项目中常用到的就是IFRAME方法.

[地图SkyLine二次开发]框架(4)

继续上一节... 1.Extjs5.0版Menu. -将Extjs包引入MenuPage.html页. 2.前段用Extjs的MVC框架 -在根目录下创建app文件夹,文件夹下分别创建controller,model,store,view文件夹 -根目录下创建app.js文件 -view文件夹下创建MainLayout.js文件 -controller文件夹下创建MainController.js文件 3.菜单页面布局 -MainLayout.js代码 Ext.define('ZZH.view.

Java Web基础教程(二)开发基础

Java Web基础教程(二)开发基础 转载:Future魏来 前言 Java web是一种基于B\S(浏览器\服务器)架构的网络应用程序的技术实现.这种结构的Web应用程序被大量的企业级应用所采用.随着Web应用程序的规模不断扩大,传统的Web开发模式无法满足日渐复杂的业务需要,所以出现了更加合理更加先进的MVC开发模式.随之而来的也出现了一系列的基于MVC模式的开发框架,Struts框架.Spring MVC 等. 1. Web 技术的发展 1. 第一阶段 静态网站 Web技术出现伊始,由于