мы использовали 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];
}
});
}
});
В сценарии с несколькими моделями вместо этого необходимо использовать 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()
.
Вот измененные фрагменты кода для вас:
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 );
}
}
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;
}
});
});
Привет, пожалуйста, проверьте мою полезную нагрузку события выше. поле, на которое вы ссылаетесь, находится в массиве выборок ... см. github.com/Autodesk-Forge/forge-bim360-assets.viewer/blob/…
Спасибо за помощь, я попробовал код, который вы даете в git hub. Теперь получаю objectId, но проблема в том, что я получаю все идентификаторы объектов в viewer.addEventListener. Но нам нужен идентификатор объекта выбранного актива в Forge Viewer. Пожалуйста, помогите нам в этом. Я вставил отредактированный код для вашей справки.
Извините, можно поподробнее? Событие Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT предоставит вам только выбранные идентификаторы объектов, а не все идентификаторы. Вам может понадобиться вызвать соответствующие функции при передаче db Ids
средству просмотра. См. forge.autodesk.com/blog/multi-model-refresher, для некоторых из них требуется объект модели.
Пожалуйста, проверьте приведенный выше отредактированный код. Как было предложено, мы использовали приведенный ниже код ``` const dbIds = args.selections[0].dbIdArray; объект объекта = dbIds[0]; ``` чтобы узнать идентификатор выбранного объекта оборудования. Но если мы используем приведенный выше код, у нас будет несколько аргументов, таких как arg1, arg2, arg3 ..... и т. д. Под каждым аргументом мы получили разные идентификаторы объекта в массиве (1). Так что не удалось получить правильный объект.
Вы не можете использовать viewer.model
. Он всегда указывает на первую загруженную модель. Вместо этого, пожалуйста, позвоните args.selections[i].model.getProperties( )
instad. Если вы искали мой образец, упомянутый выше, вы могли увидеть похожие реализации. См. также внизу этого блога: forge.autodesk.com/blog/multi-model-refresher
Я изменил ваши фрагменты кода и поделился ими выше.
Спасибо, @Eason Канг. Приведенный выше код работает нормально. мы можем получить правильный идентификатор объекта, если сделаем один клик в Forge Viewer. Но если мы дважды щелкнем по любому оборудованию в Forge Viewer, он получит идентификатор родительского объекта вместо идентификатора выбранного объекта оборудования. Пожалуйста, помогите нам в этом.
Двойной щелчок не изменит выбранную цель в моих тестах. Не могли бы вы предоставить нам неконфиденциальный воспроизводимый тестовый пример aps (dot) help (at) autodesk (dot) com
для расследования?
Неконфиденциальный воспроизводимый тестовый пример содержит: 1. Неконфиденциальные воспроизводимые модели. 2. Работающее, минимально завершенное, но все же приложение для просмотра, такое как учебник. 3. Некоторые инструкции по воспроизведению проблемы, например, какой объект выбрать, где нажать
Спасибо за помощь, я попробовал приведенный выше код
viewer.addEventListener(Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT, (args) => {
, это вызывает проблему вviewer.fitToView
получении ошибки, поскольку невозможно прочитать свойства неопределенного (чтение «длина»). Пожалуйста, обратитесь к коду в моем отредактированном сообщении.