dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Изменение атрибута блока , который находится в блоке (из пространства модели)

Изменение атрибута блока , который находится в блоке (из пространства модели)

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 25.03.2017, 00:43 #1
Изменение атрибута блока , который находится в блоке (из пространства модели)
konservnii
 
Регистрация: 23.08.2016
Сообщений: 14

konservnii вне форума Вставить имя

Всем привет кто не спит) Такая задача передо мной встала .

Есть динамический блок, назовем его "Первый"! В нем находиться еще один блок, назовем его "Второй". У "Второго" блока есть атрибут. Могу ли я из пространства модели, не заходя в "Первый" блок изменять атрибут "второго" блока??
Кто поможет решить?!)

Может есть лиспы по этой проблеме?

Нашел только это: меняет атрибут выбранного блока на вбиваемый в командную строку

Цитата:
[Выделить все]
(defun mip-conv-to-str (dat)
(cond ((= (type dat) 'INT)(setq dat (itoa dat)))
((= (type dat) 'REAL)(setq dat (rtos dat 2 12)))
((null dat)(setq dat ""))
(t (setq dat (vl-princ-to-string dat)))))
(defun mip-block-setattr-bylist (obj att_list / txt lst)
;; obj - Ename or Vla object of block
;; att_list - list ((Tag_Name1 . Value1)(Tag_Name2 . Value2) ...)
;; Tag_Name - string
;; Value - string

(vl-load-com)
(if (= (type obj) 'ENAME)(setq obj (vlax-ename->vla-object obj)))
(setq att_list (mapcar '(lambda(x)(cons (strcase (mip-conv-to-str(car x)))(mip-conv-to-str(cdr x)))) att_list))
(if (and obj
(not(vlax-erased-p obj))
(= (vla-get-ObjectName obj) "AcDbBlockReference")
(eq :vlax-true (vla-get-HasAttributes obj))
(vlax-property-available-p obj 'Hasattributes)
(vlax-write-enabled-p obj)
)
(vl-catch-all-apply
(function
(lambda ()
(foreach at (vlax-invoke obj 'Getattributes)
(if (setq lst (assoc(strcase(vla-get-TagString at)) att_list))
(vla-put-TextString at (cdr lst))
)
)
)
)
)
)
)
;;;Пример использования
(defun C:TEST ( )
(setq tag1 "TAG1") ;_ таг 1-го атрибута
(setq tag2 "DESK1") ;_ таг 2-го атрибута
(setq str1 (getstring "\nВведите значение для атрибута TAG1: "))
(setq str2 (getstring "\nВведите значение для атрибута DESK1: "))
(if (setq blk (car(entsel "\nВыбери блок :")))
(mip-block-setattr-bylist blk (list (cons tag1 str1)(cons tag2 str2)))
)
(princ)
)
сложно ли его допилить , чтобы он менял атрибут блока который находится в выбранном блоке. Если известно имя блока который находится в блоке и название атрибута тоже известно..

Последний раз редактировалось konservnii, 25.03.2017 в 00:50.
Просмотров: 1167
 
Непрочитано 25.03.2017, 09:16
1 | #2
Кулик Алексей aka kpblc
Moderator

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


Без проверок:
Код:
[Выделить все]
 (defun set-string (/ ent str)
  (if (and (= (type
                (setq ent (vl-catch-all-apply
                            (function (lambda () (vlax-ename->vla-object (car (nentsel "\nSelect attribute <Cancel> : ")))))
                            ) ;_ end of vl-catch-all-apply
                      ) ;_ end of setq
                ) ;_ end of type
              'vla-object
              ) ;_ end of =
           (vlax-property-available-p ent 'textstring)
           (=
             (type
               (setq str (vl-catch-all-apply (function (lambda () (getstring t "\nNew string value <Cancel> : ")))))
               ) ;_ end of type
             ) ;_ end of =
           ) ;_ end of and
    (vla-put-textstring ent str)
    ) ;_ end of if
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.03.2017, 10:06
#3
1958


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(getstring t "\nNew string value <Cancel> : ")
Если дать отмену, то атрибут сбрасывается.
Что надо изменить, чтобы в случае отмены атрибут остался без изменений?
1958 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 25.03.2017, 11:50
#4
konservnii


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Без проверок:
Код:
[Выделить все]
 (defun set-string (/ ent str)
  (if (and (= (type
                (setq ent (vl-catch-all-apply
                            (function (lambda () (vlax-ename->vla-object (car (nentsel "\nSelect attribute <Cancel> : ")))))
                            ) ;_ end of vl-catch-all-apply
                      ) ;_ end of setq
                ) ;_ end of type
              'vla-object
              ) ;_ end of =
           (vlax-property-available-p ent 'textstring)
           (=
             (type
               (setq str (vl-catch-all-apply (function (lambda () (getstring t "\nNew string value <Cancel> : ")))))
               ) ;_ end of type
             ) ;_ end of =
           ) ;_ end of and
    (vla-put-textstring ent str)
    ) ;_ end of if
  ) ;_ end of defun
в итоге со всем разобрался, то что Вы скинули решило мою проблему, спасибо!!)

Последний раз редактировалось konservnii, 25.03.2017 в 17:43.
konservnii вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.03.2017, 02:34
#5
frostmourn


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


Цитата:
Сообщение от 1958 Посмотреть сообщение
Если дать отмену, то атрибут сбрасывается.
Что надо изменить, чтобы в случае отмены атрибут остался без изменений?
Видимо, так
Код:
[Выделить все]
 
(defun set-string (/ ent str)
 (if (and (= (type
               (setq ent (vl-catch-all-apply
                           (function (lambda () (vlax-ename->vla-object (car (nentsel "\nSelect attribute <Cancel> : ")))))
                           ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
             'vla-object
             ) ;_ end of =
          (vlax-property-available-p ent 'textstring)
          (=
            (type
              (setq str (vl-catch-all-apply (function (lambda () (getstring t "\nNew string value <Cancel> : ")))))
              ) ;_ end of type
           'str
            ) ;_ end of =
          ) ;_ end of and
   (vla-put-textstring ent str)
   ) ;_ end of if
 ) ;_ end of defun
frostmourn вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.03.2017, 05:20
#6
1958


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


Цитата:
Сообщение от frostmourn Посмотреть сообщение
15
***********'str
Ваша добавка не срабатывает.
Всё равно при подтверждении <Cancel>, атрибут обнуляется.

----- добавлено через ~5 ч. -----
Мой вариант:
Код:
[Выделить все]
 (defun c:set-atr (/ ent str)
 (setq ent (vl-catch-all-apply
            (function
             (lambda ()
              (vlax-ename->vla-object (car (nentsel "\nУкажите атрибут <Отмена> : ")))
             )
            )
           )
 )
 (if (vlax-property-available-p ent 'textstring)
  (setq str (vl-catch-all-apply
             (function (lambda () (getstring t "\nНаберите новое значение <Отмена> : ")))
            )
  )
  (alert "Объект не содержит атрибутов")
 )
 (if (and (/= (strlen str) 0) (vlax-property-available-p ent 'textstring))
  (vla-put-textstring ent str)
  (alert "Изменение невозможно!")
 )
 (redraw)
)

Последний раз редактировалось 1958, 26.03.2017 в 10:02.
1958 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 26.03.2017, 23:20
#7
Кулик Алексей aka kpblc
Moderator

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


Вот еще бы объяснили, что значит "обнуляется"...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.03.2017, 04:31
#8
1958


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вот еще бы объяснили, что значит "обнуляется"...
В том смысле, что он сбрасывается, удаляется... Вообщем, его значение становится пустым.
1958 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.03.2017, 07:45
#9
Bistri Tormoz

полуконструктор
 
Регистрация: 12.12.2014
Башкирия
Сообщений: 88


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Без проверок:
Код:
[Выделить все]
 (defun set-string (/ ent str)
  (if (and (= (type
                (setq ent (vl-catch-all-apply
                            (function (lambda () (vlax-ename->vla-object (car (nentsel "\nSelect attribute <Cancel> : ")))))
                            ) ;_ end of vl-catch-all-apply
                      ) ;_ end of setq
                ) ;_ end of type
              'vla-object
              ) ;_ end of =
           (vlax-property-available-p ent 'textstring)
           (=
             (type
               (setq str (vl-catch-all-apply (function (lambda () (getstring t "\nNew string value <Cancel> : ")))))
               ) ;_ end of type
             ) ;_ end of =
           ) ;_ end of and
    (vla-put-textstring ent str)
    ) ;_ end of if
  ) ;_ end of defun
Как вызывается?
__________________
?
Bistri Tormoz вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.03.2017, 08:17
| 1 #10
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от 1958 Посмотреть сообщение
В том смысле, что он сбрасывается, удаляется... Вообщем, его значение становится пустым.
А значение в строку вводится? А то уже бывали преценденты...

----- добавлено через 28 сек. -----
Цитата:
Сообщение от Bistri Tormoz Посмотреть сообщение
Как вызывается?
https://dwg.ru/pub/9

----- добавлено через ~3 мин. -----
В некоторых случаях может понадобиться регенерация, код доработал:
Код:
[Выделить все]
 (vl-load-com)

(defun c:set-string () (set-string))

(defun set-string (/ adoc ent str)
  (if (and (= (type
                (setq ent (vl-catch-all-apply
                            (function (lambda () (vlax-ename->vla-object (car (nentsel "\nSelect attribute <Cancel> : ")))))
                            ) ;_ end of vl-catch-all-apply
                      ) ;_ end of setq
                ) ;_ end of type
              'vla-object
              ) ;_ end of =
           (vlax-property-available-p ent 'textstring)
           (=
             (type
               (setq str (vl-catch-all-apply (function (lambda () (getstring t "\nNew string value <Cancel> : ")))))
               ) ;_ end of type
             ) ;_ end of =
           (/= str "")
           ) ;_ end of and
    (progn (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
           (vla-put-textstring ent str)
           (vla-regen adoc acactiveviewport)
           (vla-endundomark adoc)
           ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
Заодно и обычную команду сделал
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 27.03.2017 в 08:23.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.03.2017, 08:51
#11
Bistri Tormoz

полуконструктор
 
Регистрация: 12.12.2014
Башкирия
Сообщений: 88


После добавления (vl-load-com) заработал.
А какой смысл в этом коде? Значение атрибутов блоков можно поменять простым нажатием на блок.
__________________
?
Bistri Tormoz вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.03.2017, 09:20
#12
Кулик Алексей aka kpblc
Moderator

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


Bistri Tormoz, прочитай стартовый пост: поменять атрибут блока (блок1), который находится в блоке (блок2). Без вхождения в редактирование блок2.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.03.2017, 12:12
#13
Bistri Tormoz

полуконструктор
 
Регистрация: 12.12.2014
Башкирия
Сообщений: 88


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Bistri Tormoz, прочитай стартовый пост: поменять атрибут блока (блок1), который находится в блоке (блок2). Без вхождения в редактирование блок2.
Понял. Просто я пытался изменить параметр видимости блока 2 внутри блока 1, не атрибут. На это видимо другой код нужен.
__________________
?
Bistri Tormoz вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.03.2017, 17:39
#14
frostmourn


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


Цитата:
Сообщение от 1958 Посмотреть сообщение
Ваша добавка не срабатывает.
Всё равно при подтверждении <Cancel>, атрибут обнуляется.
Виноват, не проверял. Достаточно ещё в and последним условием добавить (/= str "")

Цитата:
Сообщение от 1958 Посмотреть сообщение
Мой вариант:
А вот здесь при нажатии ESC во время ввода значения будет ошибка.
frostmourn вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.03.2017, 18:26
#15
1958


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


Цитата:
Сообщение от frostmourn Посмотреть сообщение
А вот здесь при нажатии ESC во время ввода значения будет ошибка.
На то он и esc, чтоб вызывать ошибку. У меня вопрос был по <Cancel>, который стоит по умолчанию. Т.е., если мы даем <Cancel> (Отмена), то атрибут должен остаться старым (без изменения). А в первом варианте кода у Алексея это не срабатывало.
1958 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.03.2017, 11:52
#16
frostmourn


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


Цитата:
Сообщение от 1958 Посмотреть сообщение
На то он и esc, чтоб вызывать ошибку.
Offtop: Вон оно как... Ну ладно, хозяин - барин
frostmourn вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.03.2017, 12:12
#17
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от 1958 Посмотреть сообщение
На то он и esc, чтоб вызывать ошибку.
Интересный подход
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 28.03.2017, 15:22
#18
1958


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Интересный подход
Я имел ввиду, что нажатие esc вызывает прерывание процедуры. Можно, конечно, добавить ещё проверку на *error*, ещё что-нибудь, потом ещё ... и раздуть код до бесконечности.
Тот код, который я приводил выше, я уже применил в своей процедуре со всеми проверками.
1958 вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Изменение атрибута блока , который находится в блоке (из пространства модели)

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
изменение поля в блоке kinklim AutoCAD 7 23.01.2012 11:30
Создание динамически изменяемого атрибута для блока. Brobobo AutoCAD 5 29.09.2011 13:20
Как в динамическом блоке вставить значение из атрибута блока в значение параметрического размера(внутри блока)? swcats AutoCAD 3 22.07.2011 08:50
Изменить поле (формула) атрибута блока EfremenkoDO Программирование 5 08.04.2010 11:43
LISP. Разбивка атрибутов блока в блоке Apelsinov LISP 2 23.09.2009 20:47

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


Размещение рекламы