Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 18-06-2014, 12:06:28

Название: Получить нужный набор примитивов без использования SelectionSet
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 12:06:28
Использую в .NET для выборки набора примитивов класс
SelectionSet. Метод Document.Editor.SelectAll(<selectionFilter>)

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

Как получить набор примитивов или ObjectIdCollection
нужного слоя и типа (Line, text ...) используя класс Database без использования SelectionSet?
 
Название: Re: Получить нужный набор примитивов без использования SelectionSet
Отправлено: Андрей Бушман от 18-06-2014, 12:12:19
Выполняешь итерацию по всем объектам базы данных и выбираешь идентификаторы тех объектов, которые тебе нужны. Тынц (https://sites.google.com/site/bushmansnetlaboratory/sendbox/stati/database).
Название: Re: Получить нужный набор примитивов без использования SelectionSet
Отправлено: Дима_ от 18-06-2014, 12:12:57
Взять все и отфильровать нужное.
з.ы. упс - опоздал.
Название: Re: Получить нужный набор примитивов без использования SelectionSet
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 12:22:38
Взять все и отфильровать нужное.
з.ы. упс - опоздал.
У меня была такая идея.
Можно как вариант конечно пробежаться по циклу вставить в тело цикла проверку 

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

Нужно посмотреть какова будет скорость работы такого алгоритма
Если примитивов, к примеру, 500 000 штук?
Название: Re: Получить нужный набор примитивов без использования SelectionSet
Отправлено: Андрей Бушман от 18-06-2014, 12:24:40
Я ссылку кому и для чего дал? Там и отчёт по скорости приведён. Не ленись мышкой клацать и читать то, на что указывают... А то как-то и желание отвечать пропадает при таком отношении.
Цитировать
Всего объектов в БД: 736 323
Время итерации: 00:00:00.2781968
Название: Re: Получить нужный набор примитивов без использования SelectionSet
Отправлено: Дима_ от 18-06-2014, 12:31:19
Если фильтрация идет и по типу примитива, то для ускорения можно до получения объекта проверять его ObjectId на тип примитива через свойства ObjectClass.DxfName, и только если тип "нужный" обращаться к транзакции - не проверял, но практически 100% уверен, что будет быстрее.
Название: Re: Получить нужный набор примитивов без использования SelectionSet
Отправлено: Андрей Бушман от 18-06-2014, 12:36:48
через свойства ObjectClass.DxfName

Я обычно проверяю тип через ObjectId.ObjectClass.Name.
Название: Re: Получить нужный набор примитивов без использования SelectionSet
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 12:39:59
Если фильтрация идет и по типу примитива, то для ускорения можно до получения объекта проверять его ObjectId на тип примитива через свойства ObjectClass.DxfName, и только если тип "нужный" обращаться к транзакции - не проверял, но практически 100% уверен, что будет быстрее.

А почему именно ObjectClass.DxfName?
Я использую такую конструкцию
if (TypeOf Entity is Line) or ((TypeOf Entity is DBtext)) then
Или ObjectClass.DxfName будет работать быстрее.
Название: Re: Получить нужный набор примитивов без использования SelectionSet
Отправлено: Андрей Бушман от 18-06-2014, 12:44:32
Я обычно проверяю тип через 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. }
Название: Re: Получить нужный набор примитивов без использования SelectionSet
Отправлено: Алексей (IdeaSoft) от 18-06-2014, 12:49:06
Я ссылку кому и для чего дал?

Ах да только заметил "тынц" сразу не дошло.
Мало опыта работы на форумах.
Теперь буду внимательнее.
Спасибо!
Название: Re: Получить нужный набор примитивов без использования SelectionSet
Отправлено: Дима_ от 18-06-2014, 12:49:39
Я обычно проверяю тип через ObjectId.ObjectClass.Name.
Я думаю это не принципиально (у меня dxf т.к. я их имена по лиспу помню) - суть вопроса - не создавать объект до проверки на пригодность - что в большинстве случаев даст выйгрыш (если только не окажется, что практически все объекты нужного типа).