Выбрать/изолировать в мультимодельном подходе

В справочнике по API описаны способы выбора/изолирования объектов (при условии, что во вьювер загружена только одна модель):

- select(dbids,selectionType)
- isolate(node)/isolateById(dbids) // that is the difference?

Я знаю, выберите аналог для мультимодели:

viewer.impl.selector.setSelection([objectIds], model);

Вопросы:

  1. Существует ли изолированный аналог для мультимодельного режима?
  2. Как я могу выбрать/изолировать два объекта из разных моделей одновременно?

person Yury Apanasik    schedule 10.10.2017    source источник


Ответы (2)


В последней версии API viewer.impl.visibilityManager возвращает MultiModelVisibilityManager, поэтому вы можете передать модель в качестве второго аргумента:

MultiModelVisibilityManager.prototype.isolate = function (node, model)

Взгляните на viewer3D.js (L#17825), чтобы увидеть доступные методы для этого объекта.

Насколько я знаю, нет способа выбрать два объекта из разных моделей за один вызов, вы просто выдаете один вызов выбора для каждой модели, передавая соответствующие идентификаторы. Я не вижу в этом проблемы.

Надеюсь, это поможет.

person Philippe    schedule 10.10.2017

Для isolate вы можете сделать что-то вроде этого (позаимствовано из Viewer3D.js):

// Get selected elements from each loaded models
var selection = this.viewer.getAggregateSelection();
var allModels = this.viewer.impl.modelQueue().getModels().concat(); // shallow copy
// Isolate selected nodes. 
selection.forEach(function(singleRes){
    singleRes.model.visibilityManager.isolate(singleRes.selection);
    var indx = allModels.indexOf(singleRes.model);
    if (indx >= 0) {
        allModels.splice(indx, 1);
    }
});
// Hide nodes from all other models
while (allModels.length) {
    allModels.pop().visibilityManager.setAllVisibility(false);
}
this.viewer.clearSelection();

Для select вам необходимо передать соответствующую модель и dbId в viewer.impl.selector.setSelection([dbIds], model); и вызвать setSelection для каждого набора, как показано ниже. Его нельзя заархивировать сразу.

var selSet = [
    {
      selection: [1234, 5621],
      model: model1
    },
    {
      selection: [12, 758],
      model: model2
    },
];

selSet.forEach(funciton(sel) {
    viewer.impl.selector.setSelection(sel.selection, sel.model);
});
person Eason Kang    schedule 10.10.2017
comment
Этот код не работает, т.к. выборка курса снимается в моделях, которые не равны данной модели (Viewer3D.js - строка 18580). Чтобы получить выбор нескольких моделей, мне нужно напрямую использовать model.selector.setSelection(ids) и запускать событие изменения вручную. - person Yury Apanasik; 11.10.2017