Pull to refresh

Comments 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.
Спасибо за отзыв! Рад, что пригодились.)

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

Articles