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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • ADN Club
  • ****
  • Сообщений: 459
  • Карма: 98
Пробовал 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
Алексей Кулик, сделал "По блоку" — ничего не изменилось.
Привалов Дмитрий, перемещение ничего не дали. Единственное визуальное действие, которое я пока нашёл и которое обновляет цвет на чертеже, который подвергся изменениям будучи неактивным, это копирование со вставкой блока или открытие диалогового окна какой-нибудь операции.