【问题标题】:How can I make clearThemingColors() work on Viewer 6.4.0 and upwards?如何使 clearThemingColors() 在 Viewer 6.4.0 及更高版本上工作?
【发布时间】:2019-09-06 18:05:14
【问题描述】:

我有一个代码,通过应用主题(如博客中所述)并恢复原始颜色,将 Forge Viewer 上的 2D 绘图中的所有线条切换为黑色。但是查看器的 6.4.0 版本在还原时破坏了一些东西,现在所有的行都保持白色。最高 6.3.5 的所有版本都可以使用。是否发生了需要新代码才能完成的更改?

这就是我今天所做的,以前完美无缺,但现在不行:

  color2D.onClick = function (e) {

    if (blackWiteToggle) {
      window._viewerSecondary.impl.toggleSwapBlackAndWhite(false);
      paint2DToBlackAndWhite(_viewerSecondary);
      blackWiteToggle = false;
    } else {
      window._viewerSecondary.impl.toggleSwapBlackAndWhite(true);
      window._viewerSecondary.clearThemingColors();
      window._viewerSecondary.restoreState(stateDefalult);
      blackWiteToggle = true;
    }
  };

function paint2DToBlackAndWhite(viewerToPaint) {
  var frags = viewerToPaint.model.getFragmentList().fragments.fragId2dbId;
  frags.forEach(function(frag){
    frag.forEach(function(dbId){
      if (dbId < 0) return;
      viewerToPaint.setThemingColor(dbId, new THREE.Vector4(0, 0, 0, 1), viewerToPaint.model)
    });
  });
}

之前发生的事情:这幅画原本是有颜色的。当用户按下按钮时,所有线条都会应用黑色主题(和白色背景,但与问题无关)。当用户再次按下时,主题颜色被清除,二维绘图再次着色。

6.4.0 之后会发生什么:线条正确地获得了黑色主题。当用户再次按下时,所有线条都变为白色,此时它们应该恢复原来的颜色。

【问题讨论】:

  • 很遗憾,我无法使用 Viewer v6.5 重现该问题。但是使用 v6.4+,您可以递归地应用颜色,以便绘制整个模型只需执行 viewer.setThemingColor(model.getRootId(),color,model,true)。您可以通过model.getInstanceTree().fragList.db2ThemingColor 检查原始颜色矢量是否正确记录。您可以通过模型将模型发送到 forge.help@autodesk.com(通过共享服务,例如 weTransfer/Dropbox),以便我们重现问题吗?
  • 经过进一步调查,我发现model.getFragmentList().fragments.dbId2fragId 在 6.3- 上是一个数组,在 6.4+ 上是一个对象。所以,以后的版本不能在上面调用.length,在FragmentList.prototype.clearThemingColors上。在两个查看器版本上运行差异,这已经改变:svf.fragments.dbId2fragId = {};(原为[])。 clearThemingColors 是唯一在其上使用.length 的方法,并且没有改变。
  • 我会把这个问题发给forge.help@autodesk,最好把它当作一个bug来处理。

标签: autodesk-forge autodesk-viewer


【解决方案1】:

我们的工程部门正在对此进行调查,并将尽快在即将发布的版本中解决此问题。

与此同时,对于遇到相同问题的任何人来说,以下是我们的 OP Tiago 提出的一种搭载解决方法:

Autodesk.Viewing.Viewer3D.prototype.clearThemingColors = function 
(model) { 
// use default RenderModel by default 
model = model || this.model;

model.getFragmentList().fragments.dbId2fragId.length = 
Object.keys(model.getFragmentList().fragments.dbId2fragId).length;

model.clearThemingColors();

// we changed the scene to apply theming => trigger re-render 
this.impl.invalidate(true); 
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 2014-08-20
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2022-06-18
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多