Comments 11
В общем, если у вас есть чертеж с огромным количеством объектов, и нужно все их обработать, и выхода нет, и скоро рассвет — то вот вам ссылочка (англ.), где Андрей Бушман hwd, Александр Ривилис и зарубежные эксперты развлекаются, оптимизируя эту задачку.
Наиболее рациональный и быстрый способ итерации показан здесь в методе, имеющем сигнатуру:
public static Db.ObjectId[] GetDBObjectIds(this Db.Database db, Func<Db.ObjectId, Boolean> filter).
0
Важно! Если объект находится на заблокированном слое — доступ к нему на запись получить не удастся, и мы сможем полюбоваться на такое сообщение:
…
Используйте конструкцию try...catch!
// Обрати внимание на последний параметр
DBObject obj = tr.GetObject(id, OpenMode.ForWrite, false, true);
0
Действительно, сигнатура
выглядит многообещающе.
Документацию я посмотрел, но не нашел там, осуществляется ли блокировка слоя при выходе из транзакции. Не подскажете, будет слой потом блокироваться обратно?
GetObject(ObjectId id, OpenMode mode, Boolean openErased, Boolean forceOpenOnLockedLayer)
выглядит многообещающе.
Документацию я посмотрел, но не нашел там, осуществляется ли блокировка слоя при выходе из транзакции. Не подскажете, будет слой потом блокироваться обратно?
0
Документацию я посмотрел
Это не документация. Документация — это содержимое подкаталога docs распакованного архива с ObjectARX SDK, а так же на официальном сайте в разделе Documentation.
Не подскажете, будет слой потом блокироваться обратно?
Что мешает проверить самому? ;)
0
Ничего, кроме прирожденной лени...))
Действительно, код
отрабатывает корректно даже в случае заблокированного слоя. После отрабатывания кода исходный слой остается в том же состоянии, в котором был до запуска команды.
Интересная штука, не слышал о такой. Добавлю в статью, спасибо.
Действительно, код
Circle cir = (Circle)tr.GetObject(id, OpenMode.ForWrite, false, true);
cir.Radius = cir.Radius * 2;
отрабатывает корректно даже в случае заблокированного слоя. После отрабатывания кода исходный слой остается в том же состоянии, в котором был до запуска команды.
Интересная штука, не слышал о такой. Добавлю в статью, спасибо.
0
Кстати, официальная документация далеко не идеальна (к сожалению). В виду этого очень полезно просматривать реальный состав библиотек AutoCAD .NET API через Object Browser. Можно найти много интересного и полезного из того, что в документации отсутствует, в то время как по факту тот или иной функционал в API присутствует уже не один год (не раз сталкивался с этим).
0
Но ведь в этом случае о назначении функции и ее параметров можно будет только гадать, просматривая сигнатуры?
0
Спасибо за статьи по AutoCAD API! Очень помогли.
0
Спасибо за отзыв! Рад, что пригодились.)
Вообще было у меня в планах еще несколько статей — про динамические блоки, про пример взаимодействия с внешним приложением — но что-то времени стало не хватать катастрофически. Не знаю, когда теперь закончу и закончу ли вообще.
Честно говоря, я изрядно удивлен, что шесть-то смог написать.))
Вообще было у меня в планах еще несколько статей — про динамические блоки, про пример взаимодействия с внешним приложением — но что-то времени стало не хватать катастрофически. Не знаю, когда теперь закончу и закончу ли вообще.
Честно говоря, я изрядно удивлен, что шесть-то смог написать.))
0
Sign up to leave a comment.
Создание плагинов для AutoCAD с помощью .NET API (часть 6 – поиск и изменение объектов на чертеже)