Как получить местоположение с помощью dbid в 2D-виде


person timmy_liu    schedule 26.12.2017    source источник


Ответы (2)


Вот несколько фрагментов кода для доступа к информации о сетке фрагментов 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 );
person Eason Kang    schedule 27.12.2017

вы также можете проверить «viewer.impl.fitToView» в viewer3D.js, эта функция вычисляет ограничивающую рамку объединения выбранных объектов и подгоняет их для просмотра, поэтому я извлекаю код из этой функции, чтобы получить координаты центра ограничивающей рамки объекта с его 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();
person JustinChien    schedule 22.02.2018