使用数据可视化扩展在不同时间添加多个精灵的问题

问题描述

如果您拥有最新的查看器版本 (7.46),则此问题中的所有内容都适用于仅使用控制台,因此如果您想自己尝试,只需将其复制并粘贴到控制台

问题来了,我想在不同的时间插入精灵,从视觉上看下一个代码工作正常

      this.dataVizExtn = await viewer.loadExtension("Autodesk.DataVisualization");
      this.DataVizCore =  Autodesk.DataVisualization.Core;

      this.style = new this.DataVizCore.ViewableStyle(this.DataVizCore.ViewableType.SPRITE,new THREE.Color(0xffffff),'https://avatars.githubusercontent.com/u/16883010');

      this.viewableData = new this.DataVizCore.ViewableData();
      this.viewableData.spriteSize = 20; // Size in px
     
      this.worldPoint = {x:Math.floor(Math.random() * 10),y:Math.floor(Math.random() * 10),z:Math.floor(Math.random() * 10)};

      this.viewable = new this.DataVizCore.SpriteViewable(this.worldPoint,style,Math.floor(Math.random() * 1000000));

      this.viewableData.addViewable(viewable);
   
      await this.viewableData.finish();
      this.dataVizExtn.addViewables(this.viewableData);

问题是当我使用on the documentation方法获取精灵的信息时,我得到的只是最后添加的精灵的信息

      console.log(viewableData.viewables)

我知道这是为什么,是因为每次添加新精灵时我都会再次创建 viewableData 变量。

但是进行更改,所以我只在控制台中声明一次

    this.dataVizExtn = await viewer.loadExtension("Autodesk.DataVisualization");
    this.DataVizCore =  Autodesk.DataVisualization.Core;
    this.viewableData = new this.DataVizCore.ViewableData();

然后多次执行新的更新代码而无需再次声明 viewableData

          this.style = new this.DataVizCore.ViewableStyle(this.DataVizCore.ViewableType.SPRITE,'https://avatars.githubusercontent.com/u/16883010');
    
          
          this.viewableData.spriteSize = 20; // Size in px
         
          this.worldPoint = {x:Math.floor(Math.random() * 10),z:Math.floor(Math.random() * 10)};

          this.viewable = new this.DataVizCore.SpriteViewable(this.worldPoint,Math.floor(Math.random() * 1000000));
    
          this.viewableData.addViewable(viewable);
       
          await this.viewableData.finish();
          this.dataVizExtn.addViewables(this.viewableData);

将使 console.log(viewableData.viewables) 返回所有插入的精灵,但它只会在查看器中绘制第一个

我不确定这是否是一个错误,因为数据可视化扩展是在不到 2 个月前发布的,或者我做错了什么

编辑:我做了一些似乎可以解决问题的事情,可能有更好的解决方案,但现在这似乎对我有

    let oldViewableData = this.viewableData;
    this.viewableData = new this.DataVizCore.ViewableData();
    if(oldViewableData){
        this.dataVizExtn.removeAllViewables()
        for (let value of oldViewableData.viewables) {
            this.viewableData.addViewable(value);
        }
    }

现在让我们向现有的精灵添加新的精灵,现在看起来它工作正常

解决方法

您的代码的第二个版本似乎仍然不正确,因为每当向该对象添加新精灵 (this.viewableData) 时,您都会反复向查看器添加相同的 viewable 对象。

最后一个片段可能是您想要做的:仅创建 ViewableData 的单个实例,并在需要时不断向其中添加 sprites/viewables。如果您需要删除此对象并创建 ViewableData 的另一个实例,使用您找到的 removeAllViewables 方法删除原始实例是个好主意。