Как автоматически обновлять поля блока? - Страница 2
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как автоматически обновлять поля блока?

Как автоматически обновлять поля блока?

Ответ
Поиск в этой теме
Непрочитано 29.07.2010, 15:59
Как автоматически обновлять поля блока?
Ax3
 
Programming, automation, CADs, GISs. СибМИР
 
Россия, Санкт-Петербург
Регистрация: 02.02.2007
Сообщений: 315

Привет, братья по каду.
Столкнулся с проблемой. Дин. блок содержит lookup-ы и поля, отображающие значеия lookup-ов. Хотел сделать так, чтобы после изменений Lookup-ов пользователем производилось автоматическое обновление полей блока.
Прицепил к блоку vlr-object-reactor, в качестве его callback-функции указал свою функцию upd-fields.
И теперь вот думаю - а что в ней написать-то, в этой upd-fields?
В справке сказано "Do not update the object that issued the event notification." и запрещено использовать (command) и, видимо, (vl-cmdf) тоже запрещено, да они и не работают в реакторе. То есть (command "updatefield") отпадает.

Может, есть варианты? Кто-нибудь сталкивался с подобной задачей?

{2010.09.01}
Решение версии 1.00. Справка внутри (файл !readme!_blk_autoupd.txt)
blk_autoupd_v1.00(c)Danilov_AS_aka_`Hawk`_2010.09.01.rar

{2010.09.06}
Решение версии 1.01. Справка внутри (файл !readme!_blk_autoupd.txt)
blk_autoupd_v1.01(c)Danilov_AS_aka_`Hawk`_2010.09.03.rar

{2010.11.30}
blk_autoupd_v2.1(c)Danilov_AS_aka_`Hawk`_2010.11.30.rar

__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 30.11.2010 в 15:13.
Просмотров: 11945
 
Непрочитано 13.01.2011, 19:22
#21
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Зыбыл добавить описание функции adv-convertdatatype-selset-to-vlalist
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 14.01.2011, 06:47
#22
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


что-то сегодня прога нормально работает только если изменить строку:

Код:
[Выделить все]
(vl-cmdf "_UPDATEFIELD" obj_to_upd "")
на

Код:
[Выделить все]
 
(vl-cmdf "_UPDATEFIELD" obj_to_upd "" "")
VVA,

точно )))

Сейчас откорректирую пост. №20

В принципе, эта функция является "чкстно стыренной" у тебя же


Интересно узнать, как у других сработает код, с каким вариантом строки "(vl-cmdf ...)"


Совместно с реакторами на удаление объекта работать не получается. ПОможет ли здесь удаление первого реактора и запись его пар во второй объект реактора? И как удалить реактотр? Именно удалить, а не остановить (vlr-remove), которая все равно не работает.

Последний раз редактировалось Frigate, 14.01.2011 в 07:29.
Frigate вне форума  
 
Автор темы   Непрочитано 19.01.2011, 12:33
#23
Ax3

Programming, automation, CADs, GISs. СибМИР
 
Регистрация: 02.02.2007
Россия, Санкт-Петербург
Сообщений: 315


>>Frigate
По поводу внешнего приложения.
Я в самом начале так же, как и ты, решил, что (vla-sendcommand) поможет. Но попытка изменения свойств блока из окна properties приводила к Fatal Error (см. пост #7), поэтому я и решил вынести обновление блока во внешнее приложение.

Однако мой опыт работы в этом направлении показал, что работа с реакторами чрезвычайно... (прошу прощения за выражение) геморройна. То есть автообновление полей несложных блоков, пожалуй, имеет смысл, а со сложными динамическими блоками это всё работает как-то через ж... Впрочем, помучившись изрядно, я добился-таки стабильной работы своего блока с автообновлением, но второй раз что-то уже нет желания повторять такое :-)

По поводу (vl-cmdf "_UPDATEFIELD" obj_to_upd "" "") и проблем с одной/двумя кавычками - ха, спасибо, друг, подтвердил мои проблемы, описанные в теме http://forum.dwg.ru/showthread.php?p=606042#post606042.
Я этот момент поборол так:
Код:
[Выделить все]
  ;На всякий случай избавляемся от влияния pickfirst:
  (setq ufx__uffe__pickfirst_var_ (getvar 'pickfirst)) ; - запоминаем исходное значение PICKFIRST
  (setvar 'pickfirst 0)
  ;(sssetfirst nil nil) ; - добавлено как попытка устранения Fatal Error при попытке изменения штампа сразу после открытия чертежа. Но не помогло.
  (vl-cmdf "_.updatefield" ufx__uffe__being_updated_object_ "")
  (setvar 'pickfirst ufx__uffe__pickfirst_var_) ; - восстановление пользовательского PICKFIRST
    (setq ufx__uffe__pickfirst_var_ nil)
__________________
На LISPе можно мыслить!

Последний раз редактировалось Ax3, 19.01.2011 в 12:44.
Ax3 вне форума  
 
Непрочитано 19.01.2011, 13:53
#24
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Я не очень понимаю, а в updatefield подставляется указатель на вхождение блока, что ли (просто не сталкивался с такой задачей)? Если да, то почему б не попробовать так:
Код:
[Выделить все]
 (vl-load-com)

(defun test (/ adoc selset layouts blockrefs _dwgru-conv-pickset-to-list active_layout)

  (defun _dwgru-conv-pickset-to-list (value / tab item)
    (repeat (setq tab  nil
                  item (sslength value)
                  ) ;_ end setq
      (setq tab (cons (ssname value (setq item (1- item))) tab))
      ) ;_ end repeat
    ) ;_ end defun

  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (vlax-for item (vla-get-layouts adoc)
    (setq blockrefs (cons (cons item
                                (_dwgru-conv-pickset-to-list
                                  (ssget "_X" (list '(0 . "INSERT") '(66 . 1) (cons 410 (vla-get-name item))))
                                  ) ;_ end of _dwgru-conv-pickset-to-list
                                ) ;_ end of cons
                          blockrefs
                          ) ;_ end of cons
          ) ;_ end of setq
    ) ;_ end of vlax-for
  (setq active_layout (vla-get-activelayout adoc))
  (foreach item blockrefs
    (vla-put-activelayout adoc (car item))
    (foreach blockref (cdr item)
      (command "_.undatefield" blockref "")
      ) ;_ end of foreach
    ) ;_ end of foreach
  (vla-put-activelayout adoc active_layout)
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
Код не проверял вообще.
---
P.S. Спасибо Админу, классную кнопочку сделал!
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 19.01.2011, 13:55
#25
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 422


точно )))
а я не вникал в суть этой переменной раньше...

ее изменение в "0" (если потом не восстановить, в том числе предусмотреть это и в обработике ошибок) может сильно осложнить жизнь юзерам автокада - ничего нельзя привычным способом отредактировать


вот так вот поменял функцию callback:

Код:
[Выделить все]
 
(defun adv-reac-block-update_fields (notifier-object reactor-object parameter-list)
(if (null flag)
    (PROGN         ;PROGN1
    (setq flag T)
    (setq obj_to_upd (vlax-vla-object->ename notifier-object))
(if (null flag_command)
    (PROGN        ;PROGN2
    (setq flag_command T)
    (vla-sendcommand
        (vla-get-activedocument (vlax-get-acad-object))
            (strcat
            (vl-prin1-to-string '(PROGN
  (setq PICKFIRST_old (getvar "PICKFIRST"))
  (setvar "PICKFIRST" 0)
                (vl-cmdf "_UPDATEFIELD" obj_to_upd "")
                (setq flag_command nil)
  (setvar "PICKFIRST" PICKFIRST_old)
  (setq nbr_blocks (ssadd obj_to_upd)) ; <<< эту строку надо убрать
  (sssetfirst nil nbr_blocks)       ; <<< эту строку надо убрать
            ))    
            "\r"
            )
    )
) ;end of PROGN
)
) ;end of PROGN
)
(setq flag nil)
)

пока вроде работает

Лиспер,

что-то я не понимаю, как твою функцию применить в callback функции...

Ведь реактор кинет в callback функцию (у мня пока другого не получалось) только ОДИН указатель на блок, и обновлять надо именно этот блок.

К тому же в твоем коде именно комендный метод, который и применен у меня, именно такой вариант убирает выделение блока после редактирования его динсвойств.

Что заметил:

эти две строки

Код:
[Выделить все]
 (setq nbr_blocks (ssadd obj_to_upd)) ; создали пустой набор
  (sssetfirst nil nbr_blocks)
в реальности-то выделяют измененный блок, на котором висит реактор, НО это выделение становится видно только после _regen.

Ну, как я уже писал, в таком случае можно вообще обойтись регенерацией, не затрагивая обновление полей - и выделение не пропадает и все нормуль, только слабые компы подвисают )))

Есть ли возможность сделать регенерацию для отдельного объекта (у нас - блока)?

ТОлько не _update - это поля не обновляет

Прошу прощения, выделил в коде красным две строки, которые все равно не работают, а иногда и вызывают сбой... Я о выделении через ssetfirst. Их лучше убрать.

Итак вывод: обновление полей автоматом после изменения динсвойства блока возможно. Но оно неприменимо для динблоков, с динсвойствами которых часто и много работают, т.к. при обновлении полей исчезает выделение блока, вернуть выделение у меня не получилось. Нуа ГУРУ ЛИСПа пока тоже не отвечают, возможно этой проблемой никто и не занимался, зная проблемность реакторов.

Единственный вариант, когда возможно обновить поля и сохранить выделение - это использовать вместо _updatefiekd регенерацию _regen. Но - слабые компы такого издевательства не выдержат. Так что это нельзя назвать универсальным инструментом, так как у пользователя не обязательно будет навороченный комп.

Последний раз редактировалось Frigate, 20.01.2011 в 06:49.
Frigate вне форума  
 
Непрочитано 29.04.2014, 16:08
#26
sam_n


 
Регистрация: 04.06.2013
Сообщений: 34


Попробую поднять тему. Так у меня лисп в итоге и не заработал. Хотя сам Frigate говорит, что все отлично работает.
sam_n вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как автоматически обновлять поля блока?

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректно обновляются поля блока NEDIS AutoCAD 50 19.02.2013 15:47
Поля атрибутов вложенного блока не отображают своих значений hwd AutoCAD 7 23.12.2009 08:40
Подскажите, пожалуйста, как сделать описание (description) для блока? Ламер AutoCAD 5 27.08.2009 14:33
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Как в чертеже автоматически прописать полный путь? Соня AutoCAD 5 14.09.2004 16:33