基于vue3 BIMFACE 单楼层平滑切换

news2024/9/21 4:39:50

模型加载

vue3使用hooks实现模型的加载

hooks文件: useBimLoad.js

import { getAccessToken, getViewToken } from "@/api/bimface";//获取accessToken和viewToken,自行编写
import { toRefs } from "vue";

export function useBimLoad(props) {
  const { renderDone,backgroundColor= [84,111,33,1] } = props;
  const pdata = reactive({
    viewer3D: null,
    timer: null,
    drawableContainer: null,
  });
  const { viewer3D, drawableContainer} = toRefs(pdata);
  const getAccessTokenData = async () => {
    const accessTokenRes = await getAccessToken();
    let accessToken = "";
    if (typeof accessTokenRes === "string") {
      accessToken = accessTokenRes;
    } else {
      const {
        data: { data },
      } = accessTokenRes;
      const { token, expireTime } = data;
      accessToken = token;

      // 写入cookie
      document.cookie = `accessToken=${accessToken};expires=${new Date(
        expireTime
      ).toUTCString()}`;
    }
    return accessToken;
  };
  const getViewTokenData = async (accessToken, fileId) => {
    const viewTokenRes = await getViewToken(accessToken, fileId);
    const { data } = viewTokenRes;
    return data.data;
  };
  // 初始化viewer3D
  const viewer3DInit = () => {
    let view = document.getElementById("view");
    let config = new Glodon.Bimface.Application.WebApplication3DConfig();
    // 背景色
    config.backgroundColor = [
      {
        // color: new Glodon.Web.Graphics.Color(0, 0, 0, 0),
        color: new Glodon.Web.Graphics.Color(backgroundColor[0],backgroundColor[1],backgroundColor[2],backgroundColor[3],),
      },
    ];
    // 关闭线框
    config.enableWireframe = false;
    // 设置容器
    config.domElement = view;
    // 隐藏视图操作按钮
    config.enableViewHouse = false;
    // 关闭目录树
    config.Toolbars = [""];
    config.Buttons = [""];
    config.enableRealisticMiniMap = true;
    config.renderMode = "incremental";
    config.enableConstraintZoom = true;
    config.enableIBLBackground = true;
    config.enableCoordinateSystem = true;
    config.enableCSMShadow = false;
    config.enableReplaceMaterial = true;
    config.enableLogarithmicDepthBuffer = true;
    // config.exposure = -0.02
    config.enableSSAO = false;
    config.effectMode = "fluency";
    // 设置全局单位
    config.globalUnit = Glodon.Bimface.Common.Units.LengthUnits.Millimeter;

    var app = new Glodon.Bimface.Application.WebApplication3D(config);
    pdata.viewer3D = app.getViewer();
    // 禁用右键菜单
    pdata.viewer3D.toggleContextMenuDisplay(false);
  };
  // 标签容器初始化
  const drawableContainerInit = () => {
    let _this = pdata;
    let drawableConfig =
      new Glodon.Bimface.Plugins.Drawable.DrawableContainerConfig();
    drawableConfig.viewer = _this.viewer3D;
    let drawableContainer =
      new Glodon.Bimface.Plugins.Drawable.DrawableContainer(drawableConfig);
    if (_this.drawableContainer != null) {
      _this.drawableContainer.clear();
    }
    _this.drawableContainer = drawableContainer;

   
  }
  //   模型加载
  const bimLoad = async (modelId, successCallback) => {
    if(modelId && modelId!=''){
      const accessToken = await getAccessTokenData();
      const viewToken = await getViewTokenData(accessToken, modelId);
      let BimfaceLoaderConfig = new BimfaceSDKLoaderConfig();
      BimfaceLoaderConfig.viewToken = viewToken;
      BimfaceSDKLoader.load(BimfaceLoaderConfig, (viewMetaData) => {
        if (pdata.viewer3D == null) {
          viewer3DInit();
          pdata.viewer3D.addEventListener(
            Glodon.Bimface.Viewer.Viewer3DEvent.Rendered,
            renderEvent
          );
          viewAdd();
        } else {
        }
  
        pdata.viewer3D.loadModel({ viewMetaData: viewMetaData });
  
        if (successCallback) {
          successCallback();
          pdata.viewer3D.setView(Glodon.Bimface.Viewer.ViewOption.Home);
  
          let w = document.body.clientWidth;
          let h = document.body.clientHeight;
          pdata.viewer3D.resize(w, h);
        }
      });
    }
    
  };
  const renderEvent = () => {
    if (pdata.timer) {
      window.clearTimeout(pdata.timer);
    }
    console.log("渲染中");
    pdata.timer = window.setTimeout(() => {
      // 移除首次渲染监听事件
      pdata.viewer3D.removeEventListener(
        Glodon.Bimface.Viewer.Viewer3DEvent.Rendered,
        renderEvent
      );

      console.log("渲染完成 renderDone");
      if (renderDone) {
        renderDone(pdata.viewer3D);
      }

      
    }, 50);
  };
  //   const renderDoneEvent = () => {
  //     props.renderDone? props.renderDone():''
  //   };
  const viewAdd = () => {
    pdata.viewer3D.addEventListener(
      Glodon.Bimface.Viewer.Viewer3DEvent.ViewAdded,
      () => {
        lightInit();
        // 初始化标签容器
        drawableContainerInit();
      }
    );
  };
  const lightInit = () => {
    let lightManager = pdata.viewer3D.getLightManager();
    let directionalLight = lightManager.getAllDirectionalLights()[0];
    directionalLight.setColor(new Glodon.Web.Graphics.Color("#ffffff", 0.6));
    directionalLight.setIntensity(0.2);
    let fillLights = lightManager.getAllFillLights();

    fillLights.map((item, index) => {
      item.enableLight(false);
    });
    let CSMLight = lightManager.getCSMLight();
    // // this.viewer3D.setExposureShift(0.6)
    CSMLight.enableShadow(true);
  };
  
  return {
    viewer3D: viewer3D,
    drawableContainer: drawableContainer,
    bimLoad: bimLoad
  };
}

使用:

<template>
    <div
        class="bimface-con"
        id="view"
        :style="`opacity:${pdata.modelOpacity}`">
    </div>
</template>

<script setup>
import { useBimLoad } from "@/hooks/useBimLoad";
const pdata = reactive({
  modelOpacity: 0,
  model3D: null,
});
const bimloadFun = useBimLoad({
  backgroundColor: [255, 255, 255, 0],//背景色
  renderDone: (viewer3D) => {//模型渲染完毕的回调
    //2.切换楼层
    showFloor(floorNo);
  },
});
const { viewer3D, drawableContainer, bimLoad} = bimloadFun;

const bimInfo = reactive({
  reconmodel3DId: "10000839130036",
  bounding: null,
});
const roomList = ref([]);
const floorNo = ref(1)
//1.加载模型
const bimInit = () => {
  bimLoad(bimInfo.reconmodel3DId, () => {
    pdata.reconModel = viewer3D.value.getModel(bimInfo.reconmodel3DId);
    pdata.reconModel.getAreas((floors) => {
      roomList.value = floors;
    });
  });
};
const showFloor = (floorNo) => {
    //相机设置
    viewer3D.value?.setCameraAnimation(false);
    viewer3D.value?.setView(Glodon.Bimface.Viewer.ViewOption.Top, () => {
        viewer3D.value?.setCameraAnimation(true);
      });
    //3.包围盒获取
    let floorId = getFloorId(roomList.value, floorNo.value);
    pdata.reconModel?.getFloorBoundingBoxById(floorId, (data) => {
        let b = data;
        console.log(b);
        if (b.max.x == 0 && b.min.x == 0) {
          b = JSON.parse(JSON.stringify(bimInfo.bounding));
          b.max.z += 20000;
        } else {
          b.max.z += 25000;
        }
        //缩放到包围盒
        viewer3D.value.zoomToBoundingBox(b); 
    });
    let modelCon = [
      { levelName: "F" + floorNo.value },
      { levelName: floorNo.value + "F" },
    ];
    pdata.reconModel?.showExclusiveComponentsByObjectData(modelCon);
    
})
//获取楼层id
function getFloorId(floors,floorNo){
    let floor = floors.filter((item) => {
        return (
          item.name == floorNo + "F" ||
          item.name == "F" + floorNo
        );
      })[0];
      return floor?floor.id:''
}
bimInit();
</script>

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1480402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Tombstone 分析

1.什么是tombstone Tombstone是指在分布式系统中用于标记数据已被删除的记录&#xff0c;通常包含删除操作的时间戳和相关信息。 当一个动态库&#xff08;native程序&#xff09;开始执行时&#xff0c;系统会注册一些连接到 debuggerd 的signal handlers。当系统发生崩溃时…

浪潮服务器使用ARCCONF查看RAID配置信息

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、获取ARCCONF二、使用步骤1.Windows Server 20221.查看RAID控制器2.查询控制器属性3.查询虚拟磁盘属性4.查询物理硬盘属性 2.Ubuntu-22.043.CentOS7 三、配置…

精益工程师3000工资与30000工资的区别!

在同一职场征程中&#xff0c;为何有的精益工程师月入仅三千&#xff0c;而另一些则能达到三万&#xff1f;这一差距&#xff0c;远超薪酬数额的简单对比&#xff0c;它深刻反映了专业能力、工作态度和个人品质的全面差异。 首先&#xff0c;对于刚踏入职场的精益工程师而言&a…

1.3 vue ui框架-element-ui框架

1 前言 ElementUI是一套基于VUE2.0的桌面端组件库&#xff0c;ElementUI提供了丰富的组件帮助开发人员快速构建功能强大、风格统一的页面。 ElementUI官网 https://element.eleme.io 2 安装 运行命令 cnpm i element-ui -S -S表示只在该项目下安装&#xff0c;不是全局安…

Springboot配置定时任务

介绍SpringBoot集成定时任务的过程。 目 录 1、引入相关依赖 2、启动类添加注解 3、定时任务类添加注解 4、cron表达式 5、总结 1、引入相关依赖 SpringBoot自带定时任务配置&#xff0c;只要引入springboot相关类即可。 2、启动类添加注解 在启动类上添加注解EnableSch…

【学习心得】Python调用JS的三种常用方法

在做JS逆向的时候&#xff0c;一种情况是直接用Python代码复现JS代码的功能&#xff0c;达成目的。但很多时候这种方法有明显的缺点&#xff0c;那就是一旦JS代码逻辑发生了更改&#xff0c;你就得重写Python的代码逻辑非常不便。于是第二种情况就出现了&#xff0c;我直接得到…

CDN CloudFlare 接入 OCI 对象存储

在当今数字化时代&#xff0c;网站性能和可用性是业务成功的关键。为了提供快速且可靠的访问体验&#xff0c;许多组织正在寻找有效的内容分发网络&#xff08;CDN&#xff09;解决方案。CloudFlare作为业界领先的CDN提供商&#xff0c;其强大的全球网络基础设施能够加速网站内…

UE学习笔记--解决滚轮无法放大蓝图、Panel等

我们发现有时候创建蓝图之后&#xff0c;右上角的缩放是1&#xff1a;1 但是有时候我们可能需要放的更大一点。 发现一直用鼠标滚轮像上滚动&#xff0c;都没有效果。 好像最大只能 1&#xff1a;1. 那是因为 UE 做了限制。如果希望继续放大&#xff0c;我们可以按住 Ctrl 再去…

Excel常用公式总结非常实用

16个最实用的Excel万能公式 1、多条件判断 IF(And(条件1,条件2..条件N),条件成立返回值) IF(or(条件1,条件2..条件N),条件成立返回值) 2、多条件查找 Lookup(1,0/((条件1*条件2*...条件N)),返回值区域&#xff09; 3、多条件求和 Sumifs(值区域,判断区域1,条件1,判断区域2,条…

hive报错:FAILED: NullPointerException null

发现问题 起因是我虚拟机的hive不管执行什么命令都报空指针异常的错误 我也在网上找了很多相关问题的资料&#xff0c;发现都不是我这个问题的解决方法&#xff0c;后来在hive官网上与hive 3.1.3版本相匹配的hadoop版本是3.x的版本&#xff0c;而我的hadoop版本还是2.7.2的版本…

opencv VideoCapture

videocapture顾名思义视频捕捉&#xff0c;主要是从视频文件、摄像头或网络摄像头获取视频流数据&#xff0c;并将其作为一系列帧进行处理。 我们这里主要实现了获取项目文件夹下的1.mp4视频文件&#xff0c;然后经过灰度变化、均值滤波、边缘检测然后将视频显示出来 #include…

MySQL的索引和B+tree结构

目录 0.关于索引的常见面试题 1.什么是索引&#xff1f; 索引的优缺点 2.索引的数据结构&#xff0c;为什么InnoDb引擎使用Btree作为索引的数据结构&#xff1f; 分析怎样的索引才是好的 二插搜索树 红黑树 B-Tree BTree 哈希 为什么 InnoDB 存储引擎选择使用 Btree 索…

初学HTMLCSS——盒子模型

盒子模型 盒子&#xff1a;页面中所有的元素&#xff08;标签&#xff09;&#xff0c;都可以看做是一个 盒子&#xff0c;由盒子将页面中的元素包含在一个矩形区域内&#xff0c;通过盒子的视角更方便的进行页面布局盒子模型组成&#xff1a;内容区域&#xff08;content&…

商城系统_大型商城系统源码_免费开源商城_OctShop

随着互联网对各行各业的渗透&#xff0c;以及人们网络购物的习惯已经形成&#xff0c;很多商家或企业都开始搭建与开发自己的商城系统平台。商城系统是一个以互联网技术为基础&#xff0c;依托电子商务的电商系统平台。一般大型的的商城系统都会有前台各种客户端&#xff0c;如…

JVM原理-基础篇

Java虚拟机&#xff08;JVM, Java Virtual Machine&#xff09;是运行Java应用程序的核心组件&#xff0c;它是一个抽象化的计算机系统模型&#xff0c;为Java字节码提供运行环境。JVM的主要功能包括&#xff1a;类加载机制、内存管理、垃圾回收、指令解释与执行、异常处理与安…

2023年世界前沿科技发展态势及2024年趋势展望——综述篇

源自&#xff1a;全球技术地图 “人工智能技术与咨询” 发布 一、2023年前沿科技发展与竞争态势总结 &#xff08;一&#xff09;人工智能引领前沿技术加速进步&#xff0c;产业应用一触即发&#xff0c;技术奇点苗头出现 &#xff08;二&#xff09;科技之变引发战争形态之…

帆软图片设置之一张图片铺满整个屏幕

1、设置PC端自适应属性&#xff0c;字体自适应&#xff0c;双向自适应&#xff1b; 2、单元格属性–>对齐–>高级–>图片布局–>拉伸。

欧拉-黎曼函数的K阶近似(OpenMP实现和MPI实现)

目录 欧拉-黎曼函数的K阶近似&#xff08;OpenMP实现和MPI实现&#xff09;问题描述OpenMP代码实现MPI代码实现 注意事项运行参考资料 欧拉-黎曼函数的K阶近似&#xff08;OpenMP实现和MPI实现&#xff09; 问题描述 OpenMP代码实现 #include <stdio.h> #include <s…

HarmonyOS云端一体化组件之AGC应用管理

&#xff08;可选&#xff09;在AGC控制台创建同包名应用 如创建工程时&#xff0c;发现尚未在AGC控制台创建与工程包名相同的应用&#xff0c;可进行补充创建。 1.点击界面提示内的“AppGallery Connect”&#xff0c;浏览器打开AGC控制台“我的项目”页面。 2.点击选择您希…

工厂模式:没你想像的那么难

工厂模式 工厂模式是一种创建型设计模式&#xff0c;它允许创建对象而无需指定将要创建的对象的具体类。它通过将对象的创建委托给一个单独的方法或类来完成&#xff0c;从而隐藏了对象的实例化逻辑。这样可以提高代码的灵活性&#xff0c;减少了代码中的重复和耦合。 在工厂…