Как стать автором
Обновить

Комментарии 11

В общем, если у вас есть чертеж с огромным количеством объектов, и нужно все их обработать, и выхода нет, и скоро рассвет — то вот вам ссылочка (англ.), где Андрей Бушман hwd, Александр Ривилис и зарубежные эксперты развлекаются, оптимизируя эту задачку.

Наиболее рациональный и быстрый способ итерации показан здесь в методе, имеющем сигнатуру:

public static Db.ObjectId[] GetDBObjectIds(this Db.Database db, Func<Db.ObjectId, Boolean> filter).
Спасибо, дополнил статью.
Важно! Если объект находится на заблокированном слое — доступ к нему на запись получить не удастся, и мы сможем полюбоваться на такое сообщение:

Используйте конструкцию try...catch!

// Обрати внимание на последний параметр
DBObject obj = tr.GetObject(id, OpenMode.ForWrite, false, true);
Действительно, сигнатура

GetObject(ObjectId id, OpenMode mode, Boolean openErased, Boolean forceOpenOnLockedLayer)

выглядит многообещающе.

Документацию я посмотрел, но не нашел там, осуществляется ли блокировка слоя при выходе из транзакции. Не подскажете, будет слой потом блокироваться обратно?
Документацию я посмотрел

Это не документация. Документация — это содержимое подкаталога docs распакованного архива с ObjectARX SDK, а так же на официальном сайте в разделе Documentation.
Не подскажете, будет слой потом блокироваться обратно?

Что мешает проверить самому? ;)
Ничего, кроме прирожденной лени...))

Действительно, код

Circle cir = (Circle)tr.GetObject(id, OpenMode.ForWrite, false, true);
cir.Radius = cir.Radius * 2;

отрабатывает корректно даже в случае заблокированного слоя. После отрабатывания кода исходный слой остается в том же состоянии, в котором был до запуска команды.

Интересная штука, не слышал о такой. Добавлю в статью, спасибо.
Кстати, официальная документация далеко не идеальна (к сожалению). В виду этого очень полезно просматривать реальный состав библиотек AutoCAD .NET API через Object Browser. Можно найти много интересного и полезного из того, что в документации отсутствует, в то время как по факту тот или иной функционал в API присутствует уже не один год (не раз сталкивался с этим).
Но ведь в этом случае о назначении функции и ее параметров можно будет только гадать, просматривая сигнатуры?
Во-первых, нередко имена параметров говорят об их назначении. Во-вторых, если это имя тебе ни о чём не говорит, то никто не запрещает посмотреть код метода при помощи либо бесплатного ILSpy, либо платного .NET Reflector.
Спасибо за статьи по AutoCAD API! Очень помогли.
Спасибо за отзыв! Рад, что пригодились.)

Вообще было у меня в планах еще несколько статей — про динамические блоки, про пример взаимодействия с внешним приложением — но что-то времени стало не хватать катастрофически. Не знаю, когда теперь закончу и закончу ли вообще.
Честно говоря, я изрядно удивлен, что шесть-то смог написать.))
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации