Autodesk forge viewer api v7.* 对齐多个 2d dwg 模型
Posted
技术标签:
【中文标题】Autodesk forge viewer api v7.* 对齐多个 2d dwg 模型【英文标题】:Autodesk forge viewer api v7.* align multiple 2d dwg models 【发布时间】:2020-03-09 06:17:54 【问题描述】:我在项目中使用 Autodesk Forge 查看器 v7.*。在这个项目中,我必须展示来自上传到 BIM360 的 .dwg
文件的多个 2d 模型。我可以加载每个模型,它们彼此堆叠,但它们的对齐似乎完全错误。我已经尝试了各种loadOptions
并尝试发布调整模型的整体转换,但它们的对齐仍然看起来很随机。以下是部分代码:
onDocumentLoaded = (doc, id, resolve, reject) =>
// A document contains references to 3D and 2D geometries.
let geometries = doc.getRoot().search( 'type': 'geometry' )
if (geometries.length === 0)
console.error('Document contains no geometries.')
return
// Choose any of the avialable geometries
let initGeom = geometries[0]
let ops =
placementTransform: new window.THREE.Matrix4(),
modelSpace: true,
globalOffset: x: 0, y: 0, z: 0 ,
applyRefPoint: true,
isAEC: true, // to align the models,
// Load the chosen geometry
let svfUrl = doc.getViewablePath(initGeom)
this.viewerApp.loadModel(svfUrl, ops, (model) => this.onModelLoaded(model, id, resolve, reject), (error) => reject(error))
如您所见,我尝试了一些加载选项,但在加载 2d 模型时它们似乎都无关紧要。它们确实对 3d(.ifc、.rvt、.nwd)模型有影响。
我还尝试在模型加载后更新转换:
transformModel = (viewer, model, transform) =>
let translation = new window.THREE.Vector3();
let rotation = new window.THREE.Quaternion();
let scale = new window.THREE.Vector3();
transform.decompose(translation, rotation, scale);
function transformFragProxy(fragId)
var fragProxy = viewer.impl.getFragmentProxy(
model,
fragId);
fragProxy.getAnimTransform();
fragProxy.position = translation;
fragProxy.scale = scale;
fragProxy.quaternion._x = rotation.x;
fragProxy.quaternion._y = rotation.y;
fragProxy.quaternion._z = rotation.z;
fragProxy.quaternion._w = rotation.w;
fragProxy.updateAnimTransform();
var fragCount = model.getFragmentList().fragments.fragId2dbId.length;
//fragIds range from 0 to fragCount-1
for (var fragId = 0; fragId < fragCount; ++fragId)
transformFragProxy(fragId);
onModelLoaded = (model, id, resolve) =>
if (!model.isLoadDone())
// wait for loading complete, 2d models are not completely loaded even though onModelLoaded is called
setTimeout(this.onModelLoaded, 0.1, model, id, resolve)
else
// done loading
// force transformation
this.transformModel(this.viewerApp, model, new window.THREE.Matrix4());
this.viewerApp.impl.sceneUpdated(true);
// .. rest op code here
【问题讨论】:
尝试使用loadDocumentNode 加载模型 - 它应该对齐模型,但如果这不起作用,您可以将有问题的模型上传到 GDrive/weTransfer/Dropbox 等并删除链接以进行伪造.help at autodesk.com,以便我们可以尝试重现该问题?谢谢! @BryanHuangloadDocumentNode
是否有可能从查看器中清除以前加载的模型?如果我第二次执行loadDocumentNode
,第一次加载的模型将从视图中清除。
抱歉,您需要在模型加载选项中设置 keepCurrentModels:true
才能加载多个模型。
【参考方案1】:
如果所有其他方法都失败,请尝试使用 placementTransform
选项手动应用翻译:
const mat4 = new THREE.Matrix4()
mat4.makeTranslation(10,10,10)
//...
NOP_VIEWER.loadDocumentNode(document, geometry,
placementTransform: mat4,
keepCurrentModels: true
)
【讨论】:
以上是关于Autodesk forge viewer api v7.* 对齐多个 2d dwg 模型的主要内容,如果未能解决你的问题,请参考以下文章
Autodesk Forge Viewer 7.24.0 未加载模型
如何在 Autodesk Forge Viewer 中通过对象的 dbid 设置对象的自定义属性?
将模型从 Autodesk Viewer 加载到 Forge Viewer