Как получить идентификатор выбранного объекта оборудования

мы использовали Forge Aggregate Viewer для отображения нескольких моделей BIM. Но если мы щелкнем/двойным щелчком по любому оборудованию в Aggregate Forge Viewer, оно будет увеличено. но не может получить идентификатор выбранного объекта оборудования с помощью кода С#. Примечание. Если мы загрузим один файл, мы сможем получить идентификатор выбранного объекта оборудования в Forge Viewer.

Мы использовали приведенный ниже код, но он не срабатывает при выборе оборудования. viewer.addEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, (args) => {

Пожалуйста, помогите нам получить идентификатор выбранного объекта оборудования в Aggregate Forge View при отображении нескольких файлов. Пожалуйста, поделитесь примером кода для нашей справки.

FITTOVIEW И КОД ИЗМЕНЕНИЯ ВЫБОРА

const Loadedevent = () => {
        var objval = document.getElementById('<%=hid_objectid.ClientID%>').value;
        if (objval != '') {
                   var mdlurn = "";
                    mdlurn = document.getElementById('<%=hid_mdlurn.ClientID%>').value;
            const models = viewer.getVisibleModels().find(m => m.getData().urn === mdlurn);
                viewer.fitToView([parseInt(objval)], models);
                viewer.select([parseInt(objval)], models, Autodesk.Viewing.SelectionType.OVERLAYED);
        }
    }

SelectionChangeEvent

viewer.addEventListener(Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT, (args) => {                       
       if (args.dbIdArray.length === 1) {
                             viewer.getProperties(args.dbIdArray[0], function (data) {
                                 if (FromPage == '') {
                                     if (FromSelection == '') {
                                         if (Count === 0) {                                            
                                             var instanceTree = viewer.model.getData().instanceTree;
                                             var parentId = instanceTree.getNodeParentId(args.dbIdArray[0]);                                             
                                             viewer.select([parentId], viewer.model, Autodesk.Viewing.SelectionType.OVERLAYED);
                                             Count = 1;
                                         } else {                                             
                                             itemobject = args.dbIdArray[0];
                                             Count = 0;
                                         }
                                     } else {                                         
                                         FromSelection = '';
                                         itemobject = args.dbIdArray[0];
                                     }
                                 } else {
                                     FromPage = '';                                     
                                    itemobject = args.dbIdArray[0];
                                 }
                             });
                         }
                     });

Отредактированный код:

viewer.addEventListener(Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT, (args) => {  
                      if (!args.selections || args.selections.length <= 0)                          
                          return;

                      if (args.selections.length == 1 ) {                     
                          viewer.getProperties(args.selections[0].dbIdArray[0], function (data) {
                                 if (FromPage == '') {
                                     if (FromSelection == '') {
                                         if (Count === 0) {
                                             
                                             var instanceTree = viewer.model.getData().instanceTree;                                            
                                             var parentId = instanceTree.getNodeParentId(args.selections[0].dbIdArray);                                            
                                             viewer.select([parentId], viewer.model, Autodesk.Viewing.SelectionType.OVERLAYED);
                                             Count = 1;
                                         } else {                                            
                                             const dbIds = args.selections[0].dbIdArray;                                             
                                             itemobject = dbIds[0];                                             
                                             Count = 0;                                             
                                         }
                                     } else {
                                        
                                         FromSelection = '';                                  
                                         const dbIds = args.selections[0].dbIdArray;
                                             itemobject = dbIds[0];
                                      
                                     }
                                 } else {
                                     FromPage = '';
                                     const dbIds = args.selections[0].dbIdArray;
                                             itemobject = dbIds[0];   
                                 }
                             });
                         }
                     });
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В сценарии с несколькими моделями вместо этого необходимо использовать Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT. См. https://forge.autodesk.com/blog/multi-model-refresher

/**
 * Triggered when objects are selected or deselected.
 * Event payload:
 * {
 *   type: 'aggregateSelection',
 *   target: Viewer3D,
 *   selections: Array<{
 *     model: Model,
 *     nodeArray: Array<number>,
 *     dbIdArray: Array<number>,
 *     fragIdsArray: Array<number>
 *   }>
 * }
 */
viewer.addEventListener(
   Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT,
   (event) => {
        // codes for selecting changed
   });

Чтобы получить выбранные объекты, вместо этого вызовите viewer.getAggregateSelection().

Обновлять

Вот измененные фрагменты кода для вас:

FITTOVIEW И КОД ИЗМЕНЕНИЯ ВЫБОРА

const Loadedevent = () => {
    let objval = document.getElementById('<%=hid_objectid.ClientID%>').value;
    if (objval != '') {
        let mdlurn = "";
        mdlurn = document.getElementById('<%=hid_mdlurn.ClientID%>').value;
        let model = viewer.getVisibleModels().find(m => m.getData().urn === mdlurn); //!<<< find() will return first found item only, so defining the variable in the singular form instead to avoid confusion.

        let dbId = parseInt( objval );
        viewer.select( [ dbId ] , model, Autodesk.Viewing.SelectionType.OVERLAYED );
        // or viewer.setAggregateSelection([ { ids: [ dbId ], model, selectionType: Autodesk.Viewing.SelectionType.OVERLAYED } ]);

        viewer.fitToView( [ dbId ], model );
    }
}

SelectionChangeEvent

viewer.addEventListener(Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT, (event) => {
    if (!event.selections || event.selections.length <= 0 || event.selections.length > 1)
        return;

    let selSet = event.selections[0];
    const dbIds = selSet.dbIdArray;
    const model = selSet.model;
    const dbId = dbIds[0];

    model.getProperties(dbId, function(data) {
        if (FromPage == '') {
            if (FromSelection == '') {
                if (Count === 0) {
                    let instanceTree = model.getInstanceTree();
                    let parentId = instanceTree.getNodeParentId(dbId);
                    viewer.select(parentId, model, Autodesk.Viewing.SelectionType.OVERLAYED);
                    // or viewer.setAggregateSelection([ { ids: [parentId ], model, selectionType: Autodesk.Viewing.SelectionType.OVERLAYED } ])
                    Count = 1;
                } else {
                    itemobject = dbId;
                    Count = 0;
                }
            } else {
                FromSelection = '';
                itemobject = dbId;
            }
        } else {
            FromPage = '';
            itemobject = dbId;
        }
    });
});

Спасибо за помощь, я попробовал приведенный выше код viewer.addEventListener(Autodesk.Viewing.AGGREGATE_SELECTION‌​_CHANGED_EVENT, (args) => {, это вызывает проблему в viewer.fitToView получении ошибки, поскольку невозможно прочитать свойства неопределенного (чтение «длина»). Пожалуйста, обратитесь к коду в моем отредактированном сообщении.

Sabareeshwari Kannan 21.10.2022 14:58

Привет, пожалуйста, проверьте мою полезную нагрузку события выше. поле, на которое вы ссылаетесь, находится в массиве выборок ... см. github.com/Autodesk-Forge/forge-bim360-assets.viewer/blob/…

Eason Kang 22.10.2022 05:37

Спасибо за помощь, я попробовал код, который вы даете в git hub. Теперь получаю objectId, но проблема в том, что я получаю все идентификаторы объектов в viewer.addEventListener. Но нам нужен идентификатор объекта выбранного актива в Forge Viewer. Пожалуйста, помогите нам в этом. Я вставил отредактированный код для вашей справки.

Sabareeshwari Kannan 25.10.2022 09:07

Извините, можно поподробнее? Событие Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT предоставит вам только выбранные идентификаторы объектов, а не все идентификаторы. Вам может понадобиться вызвать соответствующие функции при передаче db Ids средству просмотра. См. forge.autodesk.com/blog/multi-model-refresher, для некоторых из них требуется объект модели.

Eason Kang 25.10.2022 13:29

Пожалуйста, проверьте приведенный выше отредактированный код. Как было предложено, мы использовали приведенный ниже код ``` const dbIds = args.selections[0].dbIdArray; объект объекта = dbIds[0]; ``` чтобы узнать идентификатор выбранного объекта оборудования. Но если мы используем приведенный выше код, у нас будет несколько аргументов, таких как arg1, arg2, arg3 ..... и т. д. Под каждым аргументом мы получили разные идентификаторы объекта в массиве (1). Так что не удалось получить правильный объект.

Sabareeshwari Kannan 26.10.2022 08:01

Вы не можете использовать viewer.model. Он всегда указывает на первую загруженную модель. Вместо этого, пожалуйста, позвоните args.selections[i].model.getProperties( ) instad. Если вы искали мой образец, упомянутый выше, вы могли увидеть похожие реализации. См. также внизу этого блога: forge.autodesk.com/blog/multi-model-refresher

Eason Kang 26.10.2022 09:22

Я изменил ваши фрагменты кода и поделился ими выше.

Eason Kang 26.10.2022 09:58

Спасибо, @Eason Канг. Приведенный выше код работает нормально. мы можем получить правильный идентификатор объекта, если сделаем один клик в Forge Viewer. Но если мы дважды щелкнем по любому оборудованию в Forge Viewer, он получит идентификатор родительского объекта вместо идентификатора выбранного объекта оборудования. Пожалуйста, помогите нам в этом.

Sabareeshwari Kannan 01.11.2022 09:37

Двойной щелчок не изменит выбранную цель в моих тестах. Не могли бы вы предоставить нам неконфиденциальный воспроизводимый тестовый пример aps (dot) help (at) autodesk (dot) com для расследования?

Eason Kang 01.11.2022 12:08

Неконфиденциальный воспроизводимый тестовый пример содержит: 1. Неконфиденциальные воспроизводимые модели. 2. Работающее, минимально завершенное, но все же приложение для просмотра, такое как учебник. 3. Некоторые инструкции по воспроизведению проблемы, например, какой объект выбрать, где нажать

Eason Kang 01.11.2022 12:09

Другие вопросы по теме