Получить нужный набор примитивов без использования SelectionSet

Автор Тема: Получить нужный набор примитивов без использования SelectionSet  (Прочитано 8522 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Использую в .NET для выборки набора примитивов класс
SelectionSet. Метод Document.Editor.SelectAll(<selectionFilter>)

Мне нужно получать набор примитивов нужного слоя и типа в объекте database
т.к. файл-dwg не будет открывается в AutoCAD и через объект класса DataBase
пока не нашел  методов доступа к классу Document (скорее его
и не может быть, т.к. документ не открыт в AutoCAD).

Как получить набор примитивов или ObjectIdCollection
нужного слоя и типа (Line, text ...) используя класс Database без использования SelectionSet?
 

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Выполняешь итерацию по всем объектам базы данных и выбираешь идентификаторы тех объектов, которые тебе нужны. Тынц.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Взять все и отфильровать нужное.
з.ы. упс - опоздал.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Взять все и отфильровать нужное.
з.ы. упс - опоздал.
У меня была такая идея.
Можно как вариант конечно пробежаться по циклу вставить в тело цикла проверку 

IF <тип примитива> and <имя слоя> then...

Нужно посмотреть какова будет скорость работы такого алгоритма
Если примитивов, к примеру, 500 000 штук?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Я ссылку кому и для чего дал? Там и отчёт по скорости приведён. Не ленись мышкой клацать и читать то, на что указывают... А то как-то и желание отвечать пропадает при таком отношении.
Цитировать
Всего объектов в БД: 736 323
Время итерации: 00:00:00.2781968

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Если фильтрация идет и по типу примитива, то для ускорения можно до получения объекта проверять его ObjectId на тип примитива через свойства ObjectClass.DxfName, и только если тип "нужный" обращаться к транзакции - не проверял, но практически 100% уверен, что будет быстрее.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
через свойства ObjectClass.DxfName

Я обычно проверяю тип через ObjectId.ObjectClass.Name.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Если фильтрация идет и по типу примитива, то для ускорения можно до получения объекта проверять его ObjectId на тип примитива через свойства ObjectClass.DxfName, и только если тип "нужный" обращаться к транзакции - не проверял, но практически 100% уверен, что будет быстрее.

А почему именно ObjectClass.DxfName?
Я использую такую конструкцию
if (TypeOf Entity is Line) or ((TypeOf Entity is DBtext)) then
Или ObjectClass.DxfName будет работать быстрее.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Я обычно проверяю тип через ObjectId.ObjectClass.Name.
А если нужно проверить наследственность, то так:
Код - C# [Выбрать]
  1. Db.ObjectId objectId = Db.ObjectId.Null;
  2. // ...
  3. Rt.RXClass dimenClass = Rt.RXObject.GetClass(typeof(Db.Dimension));
  4. if(objectId.ObjectClass.IsDerivedFrom(dimenClass)) {
  5.   // ...
  6. }

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Я ссылку кому и для чего дал?

Ах да только заметил "тынц" сразу не дошло.
Мало опыта работы на форумах.
Теперь буду внимательнее.
Спасибо!

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Я обычно проверяю тип через ObjectId.ObjectClass.Name.
Я думаю это не принципиально (у меня dxf т.к. я их имена по лиспу помню) - суть вопроса - не создавать объект до проверки на пригодность - что в большинстве случаев даст выйгрыш (если только не окажется, что практически все объекты нужного типа).