Не обновляется цвет блока в неактивном чертеже

Автор Тема: Не обновляется цвет блока в неактивном чертеже  (Прочитано 8792 раз)

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

Оффлайн MacondoАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Есть два чертежа — активный и неактивный. По методике работы с ObjectDBX, которую описал Алексей Кулик, я меняю слой для вхождений блоков. Результат — слой меняется на обоих чертежах, а вот цвет блоков на неактивном чертеже не меняется согласно цвету этого слоя. На активном всё нормально.
Пробовал vla-update, регенерацию (даже просто из командной строки, делая неактивный ранее чертёж активным) — ничего не помогает. И только если скопировать любой объект через CTRL+C --> CTRL+V, цвета блоков меняются согласно цвету слоя.

Может, есть какой-то ещё способ обновления этих свойств, пусть даже искусственный (как в моём примере, только программный)?


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Macondo,
Без кода и примера чертежей о чем можно говорить?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Так по идее надо файл сохранить, если работа с ним ведется через нормальный ObjectDBX.
Согласен с Александром: код в студию и примеры файлов. А если еще и видео будет - то совсем шикарно получится ))
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Так по идее надо файл сохранить, если работа с ним ведется через нормальный ObjectDBX.
У меня подозрение, что работа ведётся через ObjectDBX с файлом, который уже открыт в AutoCAD, но он не активный. Но пока можно только гадать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн MacondoАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Пытался подготовить пример чертежей и кода, чтобы не было ничего лишнего, но в процессе подготовки на этом примере у меня всё заработало. Речь всё-таки не о применении odbx (с ним на закрытых чертежах всё отлично), а о применении изменения слоя на неактивном чертеже. В тестовом примере всё нормально, а рабочий слишком запутанный, чтобы его пытаться выкладывать.
Но в итоге нашёл способ, который помогает обновить такие необновляемые с помощью обычного regen и vla-update:
Код - Auto/Visual Lisp [Выбрать]
  1. (vla-Regen (vla-get-activedocument (vlax-get-Acad-Object)) :vlax-true)
Правда, это вызывается уже после активации неактивного чертежа.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Речь всё-таки не о применении odbx (с ним на закрытых чертежах всё отлично), а о применении изменения слоя на неактивном чертеже.
С этого и надо было начинать.
Но в итоге нашёл способ, который помогает обновить такие необновляемые с помощью обычного regen и vla-update:
Вообще-то это тот-же _REGENALL
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн MacondoАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Ну вот, теперь не работает. Видимо, это была случайность. Хорошая новость: удалось повторить ошибку обновления на тестовом примере.
Последовательность действий: открываем чертежи "1" и "2" (в них по одному одинаковому блоку в слое "0"), выполняем для первого чертежа следующий код:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun ChangeLayer ()
  2.   (vlax-for actdoc (vla-get-documents (vlax-get-acad-object))                                                    
  3.     (vlax-for Blk (vla-get-Blocks actdoc)
  4.       (if (= (vla-get-IsXref Blk) :vlax-false)
  5.         (vlax-for Obj Blk
  6.           (if (= (vla-get-ObjectName Obj) "AcDbBlockReference")
  7.             (progn
  8.               (vla-put-layer Obj "R-один")
  9.               (vla-update Obj)
  10.             );progn
  11.           );if
  12.         );vlax-for
  13.       );if
  14.     );vlax-for
  15.   );vlax-for
  16. );defun
В активном чертеже блок меняет слой (слой заранее создан) и становится красным (по свойству слоя). Переходим на неактивный — там блок по-прежнему белый, хотя и в новом слое.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Переходим на неактивный — там блок по-прежнему белый, хотя и в новом слое.
У меня _REGENALL его там перекрашивает в красный. Но вообще говоря требуется сделать такой чертеж активным.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот этот код у меня перекрашивает цвет и в неактивном чертеже (AutoCAD 2021 со всеми обновлениями):

Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:ChangeLayer ()
  2.   (vlax-for actdoc (vla-get-documents (vlax-get-acad-object))
  3.     (vlax-for Blk (vla-get-Blocks actdoc)
  4.       (if (= (vla-get-IsXref Blk) :vlax-false)
  5.         (vlax-for Obj Blk
  6.           (if (= (vla-get-ObjectName Obj) "AcDbBlockReference")
  7.             (progn
  8.               (vla-put-layer Obj "R-один")
  9.               (vla-update Obj)
  10.             );progn
  11.           );if
  12.         );vlax-for
  13.       );if
  14.     );vlax-for
  15.     (vla-GenerateUsageData (vla-get-Layers actdoc))
  16.     (vla-regen actdoc acAllViewports)
  17.   );vlax-for
  18. );defun
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1096
  • Карма: 172
Только это вообще ни разу не ObjectDBX.
P.S. Может быть, будет достаточно установить REGENMODE в 1.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн MacondoАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Вот такая ситуация: ничего не влияет на цвет блока — только копирование и вставка каким-то образом "обновляет" объекты.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Macondo,
1. Какая версия AutoCAD?
2. Видео записывай как указано у меня в подписи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн MacondoАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
AutoCAD 2016
Что не так? Проверял с твоими чертежами в AutoCAD 2016 со всеми обновлениями.


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн MacondoАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Кажется, нашёл камень преткновения — изменение цвета слоя перед назначением этого слоя объекту на неактивном чертеже.
Вот код:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:ChangeLayer ()
  2.   (vlax-for actdoc (vla-get-documents (vlax-get-acad-object))
  3.     (vlax-for Blk (vla-get-Blocks actdoc)
  4.       (if (= (vla-get-IsXref Blk) :vlax-false)
  5.         (vlax-for Obj Blk
  6.           (if (= (vla-get-ObjectName Obj) "AcDbBlockReference")
  7.             (progn
  8.               (vla-put-color (vla-item (vla-get-layers actdoc) "R-Тест") 2); изменение красного цвета на жёлтый
  9.               (vla-put-layer Obj "R-Тест")
  10.               (vla-update Obj)
  11.             );progn
  12.           );if
  13.         );vlax-for
  14.       );if
  15.     );vlax-for
  16.     (vla-GenerateUsageData (vla-get-Layers actdoc))
  17.     (vla-regen actdoc acAllViewports)
  18.   );vlax-for
  19. );defun
И результат: