2017-12-26 17 views
-1

거기에 시뮬 질문 : How to get location with dbid in 2D2D 뷰에서 DBID와 위치를 확인하는 방법

는하지만 anwsered되지 않았습니다.

그래서 같은 질문이 있습니다. 2D보기에서 dbid를 사용하여 객체 위치 정보를 가져 오는 방법이 있습니까?

우리는 제품에 특정 객체를 표시하고 외부 데이터베이스에 dbids를 저장해야하며 다음에 모델을 열 때 해당 ID를 사용하여 위치를 찾은 다음 사용자 정의 모양을 그려야합니다 해당 개체를 강조 표시합니다.

나는 viewer.impl.highlightObjectNode를 사용하려고 시도했으나 선택한 대로만 표시 할 수 있으며 사용자 정의 vitualization에는 매우 제한적입니다.

답변

0

다음은 Forge 조각의 메쉬 정보에 액세스하는 일부 코드 단편입니다. 특정 Forge 뷰어 dbId의 위치를 ​​찾는 데 도움이 될 수 있습니다. 자세한 내용을 보려면 다음 범위를 참조하십시오. https://github.com/Autodesk-Forge/library-javascript-viewer-extensions/blob/master/src/Autodesk.ADN.Viewing.Extension.MeshData/Autodesk.ADN.Viewing.Extension.MeshData.js

강조 표시 요소에만 viewer.impl.highlightObjectNode을 입력하면 내 경험으로 다른 용도로 사용할 수 없습니다.

function getLeafFragIds(model, leafId) { 
    const instanceTree = model.getData().instanceTree; 
    const fragIds = []; 

    instanceTree.enumNodeFragments(leafId, function(fragId) { 
     fragIds.push(fragId); 
    }); 

    return fragIds; 
    } 

    function getComponentGeometry(viewer, dbId) { 

    const fragIds = getLeafFragIds(viewer.model, dbId); 

    let matrixWorld = null; 

    const meshes = fragIds.map(function(fragId) { 

     const renderProxy = viewer.impl.getRenderProxy(viewer.model, fragId); 

     const geometry = renderProxy.geometry; 
     const attributes = geometry.attributes; 
     const positions = geometry.vb ? geometry.vb : attributes.position.array; 

     const indices = attributes.index.array || geometry.ib; 
     const stride = geometry.vb ? geometry.vbstride : 3; 
     const offsets = geometry.offsets; 

     matrixWorld = matrixWorld || renderProxy.matrixWorld.elements; 

     return { 
     positions, 
     indices, 
     offsets, 
     stride 
     }; 
    }); 

    return { 
     matrixWorld, 
     meshes 
    }; 
    } 

    var meshInfo = getComponentGeometry(viewer, 1234); 
0

당신은 또한이 기능은 객체 조합의 경계 상자 선택을 산출하고, viewer3D.js에서 "viewer.impl.fitToView"을 확인하고 볼 수있게 맞는, 그래서 나는 상자 센터를 경계 객체를 얻기 위해이 함수에서 코드를 추출 할 수 있습니다 그것의 dbid와 좌표

function getObjectBound2D(viewer, objectId) { 
    var model = viewer.model; 
    // This doesn't guarantee that an object tree will be created but it will be pretty likely 
    var bounds, bc, i; 
    if (model.is2d()) { 
     bounds = new THREE.Box3(); 
     // move this next one up into the calling method 
     bc = new avp.BoundsCallback(bounds); 

     var dbId2fragId = model.getData().fragments.dbId2fragId; 

     var fragIds = dbId2fragId[objectId]; 
     // fragId is either a single vertex buffer or an array of vertex buffers 
     if (Array.isArray(fragIds)) { 
      for (var j = 0; j < fragIds.length; j++) { 
       // go through each vertex buffer, looking for the object id 
       find2DBounds(model, fragIds[j], objectId, bc); 
      } 
     } else if (typeof fragIds === 'number') { 
      // go through the specific vertex buffer, looking for the object id 
      find2DBounds(model, fragIds, objectId, bc); 
     } 

     // should have some real box at this point; check 
     if (!bounds.empty()) { 
      return bounds; 
     } 
    } 

    function find2DBounds(model, fragId, dbId, bc) { 
     var mesh = model.getFragmentList().getVizmesh(fragId); 
     var vbr = new avp.VertexBufferReader(mesh.geometry); 
     vbr.enumGeomsForObject(dbId, bc); 
    } 

    function find2DLayerBounds(model, fragId, bc) { 
     var mesh = model.getFragmentList().getVizmesh(fragId); 
     var vbr = new avp.VertexBufferReader(mesh.geometry); 
     var visibleLayerIds = that.getVisibleLayerIds(); 
     vbr.enumGeomsForVisibleLayer(visibleLayerIds, bc); 
    } 
}; 

var objBoundingbox = getObjectBound2D(viewer,dbid); 

var objCenterCoordinates = objBoundingbox.center();