Revit: получить все ViewSheet очень медленно - PullRequest
0 голосов
/ 28 октября 2019

для плагина Мне нужно получить все таблицы просмотра в файле rvt и отобразить информацию из них в диалоге xaml, но мой процесс очень очень медленный при первом использовании (с отладчиком: 500 мс для 83 viewplan,очень медленно и без отладчика) (если я выполню свой код снова, выполнение будет нелегким)

мой код ниже

вы можете мне помочь?

спасибо ваванс

Люк

    protected IEnumerable<Element> GetAllEl(Document document)
    {
        var filteredElementCollector = new FilteredElementCollector(document);
        filteredElementCollector = filteredElementCollector
            .OfCategory(BuiltInCategory.OST_Sheets)
            .WhereElementIsNotElementType()
            .OfClass(typeof(ViewSheet));

        var fcElements = filteredElementCollector.ToElements();

        return fcElements;
    }

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Я думаю, вы, возможно, чрезмерно фильтруете ElementCollector. В моей надстройке я просто использую этот код для просмотра таблиц: new FilteredElementCollector(_doc).OfClass(typeof(ViewSheet));

0 голосов
/ 29 октября 2019

Я не думаю, что в настоящее время существует известное общее решение для этой проблемы.

Вот недавнее обсуждение с командой разработчиков по этому вопросу:

Вопрос: для данного идентификатора элемента нам нужно найти список идентификаторов листов, отображающих его. Текущее решение: мы перебираем все листы и представления и используем FilteredElementCollector( doc, sheet.Id) С полученными результатами мы еще раз вызываем FilteredElementCollector( doc, view.Id) и ищем идентификатор элемента. Проблема: текущее решение занимает много времени и отображает индикатор выполнения Revit с надписью Generating graphics. Есть ли лучший способ узнать, доступен ли данный идентификатор элемента на листе или нет? Например, что-то вроде этого было бы очень полезно:

    getAllSheets(ElementId) // returns array of sheet id
    hasGuid(ElementId,sheetId) // return true/false

Предоставляет ли API какие-либо такие методы, чтобы проверить, доступен ли данный ElementId на листе?

Ответ: Итак, цель состоит в том, чтобы найти представление, отображающее определенный элемент на листе? Многие элементы модели могут быть видны в нескольких видах, в то время как большинство элементов аннотации обычно присутствуют только в одном виде. Какие типы элементов вы проверяете? И что вы будете делать с этой информацией?

Ответ: Цель состоит в том, чтобы найти представление, отображающее определенный элемент на листе. Это может быть элемент любого типа.

Ответ: Вот некоторые предыдущие связанные обсуждения:

Ответ: Проблема в том, что первый вызов FilteredElementCollector( doc, viewId ) показывает generating graphics в индикатор выполнения. Только первый раз поиск делает так. Во второй раз поиск в том же представлении не имеет проблем с производительностью.

Ответ: Первый раз медленный, потому что для итерации по элементам, видимым в представлении, графика для этогопредставление должно быть сгенерировано. Я не могу придумать обходного пути, чтобы получить точный ответ. Возможно, вам удастся пропустить листы, которые не имеют видов моделей в своем списке видов, чтобы сэкономить немного времени. На некоторых листах могут быть только чертежные виды, графики и аннотации.

Команда разработчиков предоставила очень полезное предложение, которое помогло обойти вызов generating graphics в особом случае, чтобы проходить по листам - генерировать графику.

Может быть, вы можете оптимизировать аналогичным образом для вашего конкретного случая?

...