模型构建信息读取

<template>

  <div class="body">

    <div id="cesiumContainer"></div>

    <div v-show="bimDataShow" class="bimStyle">

      <div class="bimStyle-title">图例</div>

      <div class="bimStyle-tree">

        <el-tree

          :data="bimDataArr"

          show-checkbox

          node-key="id"

          @check="bimCheckClick"

          :default-expanded-keys="expandedBimData"

          :default-checked-keys="checkBimData"

          :props="defaultProps"

        >

        </el-tree>

      </div>

    </div>

  </div>

</template>

<style scoped>

.bimStyle {

  font-size: 18px;

  font-family: sans-serif;

  width: 300px;

  height: 330px;

  background-color: rgba(255, 255, 255, 1);

  position: absolute;

  left: 0px;

  top: 10px;

}

</style>

<script>

import * as Cesium from "cesium/Cesium";

import "cesium/Widgets/widgets.css";

var arr2 = "";

let tileset_ZHFW = null;

var viewer;

window.tilesetFeatureXH = [];

export default {

  name: "Cesium3DTileset",

  data() {

    return {

      bimDataShow: true,

      checkBimData: [],

      expandedBimData: [],

      bimDataArr: [],

      defaultProps: {

        children: "children",

        label: "name",

      },

    };

  },

  mounted() {

    viewer = this.initCesium();

    this.init();

    tileset_ZHFW.allTilesLoaded.addEventListener(() => {

      tileset_ZHFW.style = new Cesium.Cesium3DTileStyle({

        color: {

          evaluateColor: (feature) => {

            //这里收集feature

            window.tilesetFeatureXH.push(feature);

            return feature.color;

          },

        },

      });

    });

    // 鼠标单击左键事件

    viewer.screenSpaceEventHandler.setInputAction(function onMouseClick(click) {

      const feature = viewer.scene.pick(click.position);

      if (feature instanceof Cesium.Cesium3DTileFeature) {

        const propertyIds = feature.getPropertyIds();

        const length = propertyIds.length;

        for (let i = 0; i < length; ++i) {

          const propertyId = propertyIds[i];

          console.log(`${propertyId}: ${feature.getProperty(propertyId)}`);

        }

      }

    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

  },

  methods: {

    initCesium: function () {

      Cesium.Ion.defaultAccessToken =

        "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJkZjg4ZjljZC1mZGM3LTRlZjEtYjg3MC00MjZkNGU3YjI5ZWUiLCJpZCI6MTU5NTIsImlhdCI6MTYwNTE0ODM5OX0.LjxeKrgAo7Ksk8405kSAhYwF0nKcF2w2DGJnKHh51N8";

      let viewer = new Cesium.Viewer("cesiumContainer", {

        animation: false,

        baseLayerPicker: false,

        fullscreenButton: false,

        geocoder: false,

        homeButton: false,

        infoBox: true,

        sceneModePicker: false,

        navigationHelpButton: false,

        scene3DOnly: true,

        timeline: false,

        selectionIndicator: false, //是否显示选取指示器组件

        shouldAnimate: false, //自动播放动画控件

        shadows: true, //是否显示光照投射的阴影

        terrainShadows: Cesium.ShadowMode.RECEIVE_ONLY, //地质接收阴影

        sceneMode: Cesium.SceneMode.SCENE3D,

        clock: new Cesium.Clock(),

        imageryProvider: new Cesium.ArcGisMapServerImageryProvider({

          url: "https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer?f=jsapi",

        }),

        // terrainProvider: new Cesium.CesiumTerrainProvider({

        //   url: "http://data.marsgis.cn/terrain",

        //   requestVertexNormals: true,

        // }),

      });

      return viewer;

    },

    init() {

      const that = this;

      Cesium.Resource.fetchJson({

        url: "http://localhost:8888/model/SampleData/testfk/model/scenetree.json",

      }).then((response) => {

        this.bimDataArr = response.scenes;

        that.getAllNodes(this.bimDataArr);

        this.bimDataArr = [];

        this.expandedBimData = [];

        this.checkBimData = [];

        this.bimDataArr = response.scenes;

        this.bimDataArr[0].name = "BIM";

        this.expandedBimData.push(this.bimDataArr[0].id);

        this.checkBimData.push(this.bimDataArr[0].id);

      });

      tileset_ZHFW = viewer.scene.primitives.add(

        new Cesium.Cesium3DTileset({

          url: "http://localhost:8888/model/SampleData/testfk/model/tileset.json",

        })

      );

      tileset_ZHFW.readyPromise.then((tileset) => {

        window.tileset = tileset;

        tileset.style = new Cesium.Cesium3DTileStyle({

          color: "rgba(255,255,255,0.5)",

          show: true,

        });

      });

      // 定位

      viewer.zoomTo(tileset_ZHFW);

    },

    getAllNodes(node = [], arr = []) {

      for (let item of node) {

        // arr.push(item.id)

        let data = Object.assign({}, item);

        delete data["children"];

        delete data["type"];

        data.modelId = "FKPSD";

        arr.push(data);

        // INSERT INTO model_relation(model_code, `name`, sphere, model_Id) VALUES ('XHPSD', 'geometry_104', '-2176941.82931018', '36660e59856b4de58a219bcf4e27eba3');

       

        data.name = data.name?data.name.replaceAll('_', '-'):'';

        data.businessId = data.businessId?data.businessId.replaceAll('_', '-'):'';

        arr2 +=

          "INSERT INTO model_relation(model_Id, `name`, sphere, glid, business_Id) VALUES ('" +

          data.modelId +

          "', '" +

          data.name +

          "', '" +

          data.sphere.join(",") +

          "', '" +

          data.id +

          "', '" +

          data.businessId +

          "');";

        console.log(

          "🚀 ~ file: 01Cesium3DTilesetCopy2.vue:176 ~ getAllNodes ~ arr2:",

          arr2

        );

        let parentArr = [];

        if (item.children) {

          // parentArr.push(...item.children);

          parentArr = item.children;

          parentArr.forEach((item2) => {

            item2.businessId = item.name;

          });

        }

        if (parentArr && parentArr.length) {

          this.getAllNodes(parentArr, arr);

        }

      }

      return arr;

    },

    bimCheckClick(node) {

      window.tilesetFeatureXH.forEach((item) => {

        if (item.getProperty("id") == node.id) {

          if (window.seleced) {

            window.seleced.color = window.selecedColor;

            window.selecedColor = undefined;

            window.seleced = undefined;

          }

          window.seleced = item;

          window.selecedColor = item.color;

          item.color = Cesium.Color.AQUA;

        }

      });

      let tileset = window.tileset;

      var center = new Cesium.Cartesian3(

        node.sphere[0],

        node.sphere[1],

        node.sphere[2]

      );

      if (tileset._orginMatrixInverse && tileset._root.transform) {

        var mat = Cesium.Matrix4.multiply(

          tileset._root.transform,

          tileset._orginMatrixInverse,

          new Cesium.Matrix4()

        );

        center = Cesium.Matrix4.multiplyByPoint(

          mat,

          center,

          new Cesium.Cartesian3()

        );

      }

      var boundingSphere = new Cesium.BoundingSphere(center, node.sphere[3]);

      viewer.scene.camera.flyToBoundingSphere(boundingSphere, { duration: 2 });

    },

    bimCheckClick1(node, data) {


 

      const conditionBimArr = [];

      const checkedKeys = data.checkedKeys;

      if (data.checkedKeys.length) {

        this.bimDataArr[0].children.forEach((item) => {

          console.log(

            "🚀 ~ file: 01Cesium3DTilesetCopy2.vue:250 ~ this.bimDataArr[0].children.forEach ~ item:",

            item

          );

          if (item.children) {

            item.children.forEach((it) => {

              checkedKeys.forEach((res) => {

                if (it.id == res) {

                  const a = [

                    "${name} === '" + it.name + "'",

                    "rgba(255,255,255,1)",

                  ];

                  conditionBimArr.push(a);

                }

              });

            });

          } else {

            checkedKeys.forEach((res) => {

              if (item.id == res) {

                const a = [

                  "${name} === '" + item.name + "'",

                  "rgba(255,255,255,1)",

                ];

                conditionBimArr.push(a);

              }

            });

          }

        });

      }

      conditionBimArr.push(["true", "rgba(255,255,255,0)"]);

      tileset_ZHFW.style = new Cesium.Cesium3DTileStyle({

        color: {

          conditions: conditionBimArr,

        },

      });

    },

  },

};

</script>


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值