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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 12146
  • Карма: 1574
  • Рыцарь 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
  • *****
  • Сообщений: 900
  • Карма: 149
Только это вообще ни разу не ObjectDBX.
P.S. Может быть, будет достаточно установить REGENMODE в 1.
Все, что сказано - личное мнение.

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

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

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

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

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 12146
  • Карма: 1574
  • Рыцарь 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
И результат:

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

  • Administrator
  • *****
  • Сообщений: 900
  • Карма: 149
Я проверял на таких вариантах:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun test-odbx (file / odbx)
  2.                  ;|
  3. *    Обработка файла через ObjectDBX
  4. *    Параметры вызова:
  5.   file ; полный путь к обрабатываемому файлу. Проверка корректности не выполняется
  6. *    Примеры вызова:
  7. (setq file (getfiled "Файл для обработки" "" "dwg" 4))
  8. (test-odbx file)
  9. |;
  10.   (setq odbx (vla-getinterfaceobject (vlax-get-acad-object)
  11.                                      (strcat "ObjectDBX.AxDbDocument." (itoa (atoi (getvar "acadver"))))
  12.              ) ;_ end of vla-getinterfaceobject
  13.   ) ;_ end of setq
  14.   (vla-open odbx file)
  15.   (put-layer-for-block-ref odbx "R-Тест" 2)
  16.   (vlax-invoke odbx 'saveas file)
  17.   (vlax-release-object odbx)
  18. ) ;_ end of defun
  19.  
  20. (defun test-docs ();|
  21. *    Обработка текущих файлов, без выполнения сохранения
  22. |;
  23.   (vlax-for doc (vla-get-documents (vlax-get-acad-object)) (put-layer-for-block-ref doc "R-Тест" 2))
  24. ) ;_ end of defun
  25.  
  26. (defun put-layer-for-block-ref (doc layer-name layer-color / layer status) ;|
  27. *    Установка слоев для вхождений блоков, где бы они ни находились
  28. |;
  29.   (setq layer (vla-add (vla-get-layers doc) layer-name))
  30.   (vla-put-color layer layer-color)
  31.   (vlax-for item (vla-get-layers doc)
  32.     (setq status (cons (list item
  33.                              (mapcar (function (lambda (pr / temp)
  34.                                                  (setq temp (vlax-get-property item pr))
  35.                                                  (vl-catch-all-apply (function (lambda () (vlax-put-property item pr :vlax-false))))
  36.                                                  (cons pr temp)
  37.                                                ) ;_ end of lambda
  38.                                      ) ;_ end of function
  39.                                      '("freeze" "lock")
  40.                              ) ;_ end of mapcar
  41.                        ) ;_ end of list
  42.                        status
  43.                  ) ;_ end of cons
  44.     ) ;_ end of setq
  45.   ) ;_ end of vlax-for
  46.   (vlax-for def (vla-get-blocks doc)
  47.     (if (equal (vla-get-isxref def) :vlax-false)
  48.       (vlax-for ent def
  49.         (if (= (vla-get-objectname ent) "AcDbBlockReference")
  50.           (progn (vla-put-color ent 256) (vla-put-layer ent name))
  51.         ) ;_ end of if
  52.       ) ;_ end of vlax-for
  53.     ) ;_ end of if
  54.   ) ;_ end of vlax-for
  55.   (foreach item status
  56.     (foreach pr (cdr item)
  57.       (vl-catch-all-apply (function (lambda () (vlax-put-property (car item) (car pr) (cdr pr)))))
  58.     ) ;_ end of foreach
  59.   ) ;_ end of foreach
  60. ) ;_ end of defun
Вроде бы работает.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Спасибо за код. Исправил в строке 50 name на layer-name. Программа выполнилась, но всё равно не заработало на неактивном чертеже:
test-odbx не использовал, запускал test-docs (т.к. с закрытыми чертежами всё ОК — может, потому что происходит процесс сохранения, но неактивный чертёж сохранять не требуется).


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

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

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Интересно и то, что даже когда чертёж становится активным, никакие действия через AutoLISP не приводят к обновлению цвета — только интерактивные (открытие какого-нибудь диалогового окна, например).

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

  • Administrator
  • *****
  • Сообщений: 900
  • Карма: 149
Пока сообразил (повторно скачивать файлы, открывать виртуалку - это долго): в блоках все примитивы на слое "0" и все настройки "ПоБлоку"?
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 12146
  • Карма: 1574
  • Рыцарь ObjectARX
  • Skype: rivilis
Пока сообразил (повторно скачивать файлы, открывать виртуалку - это долго): в блоках все примитивы на слое "0" и все настройки "ПоБлоку"?
"ПоСлою"
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Да, верно: "0" и "По слою".

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

  • Administrator
  • *****
  • Сообщений: 900
  • Карма: 149
Цитировать
- Вы понимаете намек?
- Когда знаю, что это намек.
- Так вот, обратите внимание: намек.
(с) Стругацкие
А что будет, если все же сделать "ПоБлоку"?
Все, что сказано - личное мнение.

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

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

Оффлайн Привалов Дмитрий

  • ADN Club
  • ****
  • Сообщений: 457
  • Карма: 95
Пробовал vla-update, регенерацию (даже просто из командной строки, делая неактивный ранее чертёж активным) — ничего не помогает. И только если скопировать любой объект через CTRL+C --> CTRL+V, цвета блоков меняются согласно цвету слоя.

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

Встречал, что некоторые примитивы вели себя неадекватно, невозможно было выбрать или не обновляли вид. Проявлялось в "старых версиях" 2008, 2010, а в 2014 было нормально. Открытие/сохранение, регенерации не помогали.
Объекты МТекст, Таблица, Выноска, Мультивыноска.

В .NET API бывают дополнительные методы для перестроения, применение их иногда решало проблему, например table.RecomputeTableBlock( true ); И только затем _regen.

Из доступного в Lisp можно попробовать выбрать объекты, сместить по Z +1, -1. А затем  _regen.

Как правило, смещение объектов активирует "перестроение" объектов в старых версиях, которое почему-то не срабатывает при изменении свойств.

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Алексей Кулик, сделал "По блоку" — ничего не изменилось.
Привалов Дмитрий, перемещение ничего не дали. Единственное визуальное действие, которое я пока нашёл и которое обновляет цвет на чертеже, который подвергся изменениям будучи неактивным, это копирование со вставкой блока или открытие диалогового окна какой-нибудь операции.