反馈已提交

网络繁忙

JS实现数据库表字段控制FVS模型显隐

  • 文档创建者:Alicehyy
  • 历史版本:4
  • 最近更新:Alicehyy 于 2023-11-24
  • 1. 概述

    适用场景:安装了「FineVis数据可视化」插件的用户,可参考本文了解 FVS 模板的相关功能。

    1.1 版本

    报表服务器版本
    插件版本
    11.0.16V1.16.1

    1.2 应用场景

    使用 FVS 三维组件设置模型,希望模型可根据数据库表字段改变数据或状态。例如下图所示:

    BFFF8CCD-0FDE-4FCB-9348-4B2AB74C84DD.GIF

    注:不支持移动端。

    1.3 实现思路

    使用刷新数据接口 refreshData 定时刷新模型数据,结合 subscribeMarkerData 订阅监听数据更新,当数据图层中的数据更新,执行回调。

    2. 示例

    2.1 准备数据

    首先请在本地工程所使用的数据库中新建一个表,表名为「车辆监控」,包含三个字段:

    • 车辆编号:自定义车辆编号,与模型名称保持一致(模型名称可修改

    • 是否有车:0 表示没有,即车辆模型不可见;1 表示有,车辆模型可见

    • 车停时长:自定义停车时长

    表样式如下图所示:

    注:可使用 Navicat 新增数据库表,详细操作请自行百度。

    Snag_ee6662de.png

    2.2 准备模板

    关于如何上传模型、添加模型等功能请先查看文档:三维自定义场景组件 。

    本文提供初始模板 停车场模型.fvs ,点击下载模板,将其放置到工程路径 %FR_HOME%\webapps\webroot\WEB-INF\reportlets 下。

    打开设计器,在文件列表中打开该模板。如下图所示:

    Snag_ee745388.png

    2.3 添加页面加载结束事件

    点击「模板>页面加载结束事件」,输入 JavaScript 代码。如下图所示:

    Snag_ee76a9bd.png

    JavaScript 代码如下:

    // 等待 callback 的返回值
    // 每 200 ms 重新执行一次 callback,直到 callback 有返回值为止
    async function future(callback) {
      return new Promise(resolve => {
        const timerId = setInterval(() => {
          const result = callback();
          if (result) {
            // 有返回值时,清除定时器,并通过 resolve 返回最终结果
            clearInterval(timerId);
            resolve(result);
          }
        }, 200);
      });
    }
    async function perform() {
      // 等待场景加载结束,并获取到 widget, dataLayer
      const widget = await future(() => duchamp.getWidgetByName("停车场模型"));
      const dataLayer = await future(() => widget.getDataLayerByName("车辆监控"));

      // 根据数据图层 marker 数据,隐藏指定模型
      const processMarkerData = data => {
        const visible = data["是否有车"] === "1";
        const name = data["车辆编号"];
        const mesh = widget.getMeshByName(name);
        mesh.setVisible(visible);
      };

      // 订阅监听数据图层 Marker 数据,当 Marker 更新时,执行订阅监听函数
      dataLayer.subscribeMarkerData(data => {
        processMarkerData(data);
      });

      // 每隔 3s,刷新组件数据
      setInterval(() => {
        widget.refreshData();
      }, 3000); // 循环执行
    }

    perform();

    注:若存在多个分页,需要指定某个分页中三维组件实现监控刷新时,JavaScript 代码如下:

    // 等待 callback 的返回值
    // 每 200 ms 重新执行一次 callback,直到 callback 有返回值为止
    async function future(callback) {
      return new Promise(resolve => {
        const timerId = setInterval(() => {
          const result = callback();
          if (result) {
            // 有返回值时,清除定时器,并通过 resolve 返回最终结果
            clearInterval(timerId);
            resolve(result);
          }
        }, 200);
      });
    }
    async function perform() {
      // 等待场景加载结束,并获取到 widget, dataLayer
      const widget = await future(() => duchamp.getWidgetByName("停车场模型"));
      const dataLayer = await future(() => widget.getDataLayerByName("车辆监控"));

      // 根据数据图层 marker 数据,隐藏指定模型
      const processMarkerData = data => {
        const visible = data["是否有车"] === "1";
        const name = data["车辆编号"];
        const mesh = widget.getMeshByName(name);
        mesh.setVisible(visible);
      };

      // 订阅监听数据图层 Marker 数据,当 Marker 更新时,执行订阅监听函数
      const observer = dataLayer.subscribeMarkerData(data => {
        processMarkerData(data);
      });

      // 每隔 3s,刷新组件数据
      const refreshTimerId = setInterval(() => {
        widget.refreshData();
      }, 3000); // 循环执行

      const clean = () => {
        observer.unsubscribe();
        clearInterval(refreshTimerId);
      };
    }
    let page1Clean = null;
    duchamp.on("storychange", current => {
      if (current === "页面2") {
        page1Cleaner = perform();
      } else {
        page1Clean && page1Clean();
      }
    });

    2.4 效果预览

    点击右上角「保存」,再点击「预览」。效果如 1.2 节所示。

    3. 模板下载

    附件列表


    主题: FineVis数据可视化
    已经是第一篇
    已经是最后一篇
    • 有帮助
    • 没帮助
    • 只是浏览
    中文(简体)

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭

    联系我们
    在线支持
    获取专业技术支持,快速帮助您解决问题
    工作日9:00-12:00,13:30-17:30在线
    页面反馈
    针对当前网页的建议、问题反馈
    售前咨询
    采购需求/获取报价/预约演示
    或拨打: 400-811-8890 转1
    qr
    热线电话
    咨询/故障救援热线:400-811-8890转2
    总裁办24H投诉:17312781526
    提交页面反馈
    仅适用于当前网页的意见收集,帆软产品问题请在 问答板块提问前往服务平台 获取技术支持