Не удалось получить ограничивающую рамку для 2D-элемента в средстве просмотра IOS UIWebView Forge

Я использовал приведенный ниже код, чтобы получить ограничивающую рамку 2D-элемента.

function find2DBounds( fragList, fragId, dbId, bc ) {
    const mesh = fragList.getVizmesh( fragId );
    const vbr = new Autodesk.Viewing.Private.VertexBufferReader( mesh.geometry );
    vbr.enumGeomsForObject( dbId, bc );
}

function get2DBounds( dbId, model ) {
    const it = model.getData().instanceTree;
    const fragList = model.getFragmentList();

    let bounds = new THREE.Box3();
    let bc = new Autodesk.Viewing.Private.BoundsCallback( bounds );
    const dbId2fragId = model.getData().fragments.dbId2fragId;
    const fragIds = dbId2fragId[dbId];

    if( Array.isArray( fragIds ) ) {
        for( let i = 0; i < fragIds.length; i++ ) {
            find2DBounds( fragList, fragIds[i], dbId, bc );
        }
    } else if( typeof fragIds === 'number' ) {
        find2DBounds( fragList, fragIds, dbId, bc );
    }

    return bc.bounds;
}


var model = this.viewer.model; 
 var modelData = model.getData();
 var itree = modelData.instanceTree;
itree.enumNodeChildren(itree.getRootId(), function (dbId) {   
// Here you go
cosnt bondingBox = get2DBounds( dbId, viewer.model );

}

Этот код правильно отображается в браузере и получает правильную ограничительную рамку для 2D-элементов. Но когда я попытался выполнить этот код в браузере через IOS, я не получил ограничивающую рамку для 2D-элементов.

Процесс использования вышеприведенного кода через IOS: - Создайте UIWebView в IOS - Вставьте html-страницу - Вставьте приведенный выше код java-скрипта в html-страницу - Получите все идентификаторы элементов для 2D-листа. - Получите ограничивающую рамку для тех, кто использует код выше.

заметил, что ограничивающая рамка бесконечна для всех 2D-объектов.

Не могли бы вы сказать мне, что не так с этим подходом?


person Amit Mandal    schedule 15.01.2018    source источник
comment
Это может быть проблема с Forge Viewer, я уточняю у нашей инженерной команды и верну вам как можно скорее.   -  person Eason Kang    schedule 16.01.2018


Ответы (1)


Возможно, это проблема внутреннего API средства просмотра. Я зарегистрировал запрос как LMV-3154 в нашей внутренней системе дел, чтобы позволить нашей команде инженеров выделить время для расследования. Возможно, потребуется время, чтобы понять, что произошло. Вы можете отправить идентификатор запроса на [email protected], чтобы отслеживать обновления в будущем.

Приносим извинения за доставленные неудобства.

Обновление 2021

Вот рабочий фрагмент кода для просмотра v7.x

function find2DBounds( fragList, fragId, dbId, bc ) {
    const mesh = fragList.getVizmesh( fragId );
    const vbr = new Autodesk.Viewing.Private.VertexBufferReader( mesh.geometry );
    vbr.enumGeomsForObject( dbId, bc );
}

function get2DBounds( dbId, model, useInstancing ) {
    const it = model.getData().instanceTree;
    const fragList = model.getFragmentList();

    let bounds = new THREE.Box3();
    let bc = new Autodesk.Viewing.Private.BoundsCallback( bounds );
    const dbId2fragId = model.getData().fragments.dbId2fragId;
    const remappedId = model.reverseMapDbId(dbId);
    const fragIds = dbId2fragId[remappedId];

    if( Array.isArray( fragIds ) ) {
        for( let i = 0; i < fragIds.length; i++ ) {
            find2DBounds( fragList, fragIds[i], remappedId, bc );
        }
    } else if( typeof fragIds === 'number' ) {
        find2DBounds( fragList, fragIds, remappedId, bc );
    }

    return bc.bounds;
}

// Here you go
let bondingBox = get2DBounds( 5314, viewer.model );

Обновление:

Исправление для LMV-3154 было выпущено начиная с версии 4.2.2, вот обновленный код. С этим патчем вы должны передать use2dInstancing в VertexBufferReader, чтобы избежать проблемы с бесконечными границами на iOS.

function find2DBounds( fragList, fragId, dbId, useInstancing, bc ) {
    const mesh = fragList.getVizmesh( fragId );
    const vbr = new Autodesk.Viewing.Private.VertexBufferReader( mesh.geometry, useInstancing );
    vbr.enumGeomsForObject( dbId, bc );
}

function get2DBounds( dbId, model, useInstancing ) {
    const it = model.getData().instanceTree;
    const fragList = model.getFragmentList();

    let bounds = new THREE.Box3();
    let bc = new Autodesk.Viewing.Private.BoundsCallback( bounds );
    const dbId2fragId = model.getData().fragments.dbId2fragId;
    const fragIds = dbId2fragId[dbId];

    if( Array.isArray( fragIds ) ) {
        for( let i = 0; i < fragIds.length; i++ ) {
            find2DBounds( fragList, fragIds[i], dbId, useInstancing, bc );
        }
    } else if( typeof fragIds === 'number' ) {
        find2DBounds( fragList, fragIds, dbId, useInstancing, bc );
    }

    return bc.bounds;
}

let use2dInstancing = viewer.impl.use2dInstancing;
// Here you go
let bondingBox = get2DBounds( 5314, viewer.model, use2dInstancing );
person Eason Kang    schedule 18.01.2018