Обновление вхождений блока, не используя regen
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Обновление вхождений блока, не используя regen

Обновление вхождений блока, не используя regen

Ответ
Поиск в этой теме
Непрочитано 27.08.2010, 15:42 #1
Обновление вхождений блока, не используя regen
молодой человек
 
Регистрация: 14.11.2007
Сообщений: 159

Здравствуйте. Не могу найти команду, которая бы обновила только нужный блок, а не все примитивы чертежа.
(setq obj (vlax-ename->vla-object (car(nentsel))))
(vla-put-Color obj 1)
А потом требуется, чтобы изменился цвет на экране.
vla-update- тоже не помагает
Просмотров: 2952
 
Непрочитано 27.08.2010, 19:23
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450


У тебя запрашивается nentsel, т.е. примитив "самого нижнего уровня вложения". Его обновляй - не обновляй, все едино - работать не будет. Попробуй заменить nentsel на entsel.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.08.2010, 00:38
#3
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


(entmod (entget (car (entsel)))) и ткнуть в блок, где поменяли цвет внутреннего элемента.
Можно усложнить задачу. Надо вычислить родителя элемента полученного через nentsel и ему сделать (entmod (entget ...

Вот так, к примеру.
Код:
[Выделить все]
(setq obj2 (vlax-ename->vla-object (car (setq obj (nentsel)))))
(vla-put-Color obj2 1)
(entmod (entget (caar (reverse obj))))

Последний раз редактировалось Supermax, 30.08.2010 в 01:11.
Supermax вне форума  
 
Непрочитано 30.08.2010, 09:36
#4
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


В справке после entmod всегда рекомендуют entupd, значит entmod - тут бессмысленно, хотя лично не проверял.
Так можно, например:

Код:
[Выделить все]
(and (setq lst (nentsel))
     (or (setq ename (last (cadddr lst))) (setq ename (car lst)))
     (ENTUPD ename)
     )

Последний раз редактировалось Евгений А., 30.08.2010 в 09:49.
Евгений А. вне форума  
 
Непрочитано 30.08.2010, 11:33
#5
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Ну, во-первых получив через nentsel указатель на объект, его надо для начала изменить. Во-вторых ни entmod, ни entupd перерисовывать вложенный примитив не собираются. Перерисовывается только весь блок.
При перерисовывании всего блока перерисовывается только то вхождение, которое мы потрошим, другие вхождения остаются неизменными.
Если войти после этого в редактор блока, то мы там увидим старое значение измененного примитива, и если выйти хоть с сохранением, хоть без - измененное вхождение восстановит свое прежнее состояние.
Если сохранить файл и перезагрузить его - все вхождения данного блока примут новое значение.

Код:
[Выделить все]
(setq obj2 (vlax-ename->vla-object (car (setq obj (nentsel))))); записали указатели
(vla-put-Color obj2 1); изменили свойство элементу вхождения блока

(entmod (entget (caar (reverse obj)))); перерисовали вхождение
;или
(ENTUPD (caar (reverse obj)))
Supermax вне форума  
 
Непрочитано 30.08.2010, 13:31
#6
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Supermax, извини, но ты бредишь.
Евгений А. вне форума  
 
Непрочитано 30.08.2010, 15:54
#7
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Как говорил Жванецкий "Давайте спорить до хрипоты, до драки, о вкусе устриц, с теми, кто их ел"

Возьми и попробуй.
Supermax вне форума  
 
Непрочитано 30.08.2010, 18:31
#8
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355



Я не пробуя вижу, что не пойдёт, НО попробовал - не пошло всё равно.
Эта строка -
Код:
[Выделить все]
(entmod (entget (caar (reverse obj)))); перерисовали вхождение
- полный бред! зачем переопределять вхождение блока, когда изменения применяются к примитиву в блоке? Это три разных объекта. Достаточно только обновить вхождение на самый внешний блок с нужным примитивом (о чём Крыс уже написал).
Потом это
Код:
[Выделить все]
(caar (reverse obj))
, а откуда известно, что вложенность одноуровневая? У меня к примеру вложенность и глубже бывает.
Вот добавил в код смену цвета для тестирования
Код:
[Выделить все]
(and (setq lst (nentsel))
       (setq vlo (vlax-ename->vla-object (car lst)))
       (null (vla-put-color vlo 1))
       (or (setq ename (last (cadddr lst))) (setq ename (car lst)))
       (ENTUPD ename)
       )
пробуй
Евгений А. вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Обновление вхождений блока, не используя regen



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP: Переименование одного из вхождений блока Кочетков Андрей Готовые программы 23 13.02.2015 09:12
Хранение определения блока в отдельном файле. Динамические изменения вхождений hwd Динамические блоки 25 18.10.2011 15:52
Обновление атрибутов блока trafbite AutoCAD 8 15.06.2009 07:05
Редактирование блока, используя значение его атрибутов Mazai Программирование 14 19.01.2009 20:49
Обновление поля в атрибуте при редактировании дин. блока молодой человек AutoCAD 5 10.11.2008 14:12