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

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

Как увидть атрибуты блока через лисп?

Ответ
Поиск в этой теме
Непрочитано 27.06.2010, 23:57 #1
Как увидть атрибуты блока через лисп?
Pr9nik
 
Регистрация: 26.02.2009
Сообщений: 25

Как в AutoLisp-е увидеть атрибута блока?
Есть блок с атрибутами в AutoCAD-е...
Чтоб посмотреть данные этого объекта набераю:
(entget (car (entsel))), выделяю блок
AutoCAD мне выдает:
((-1 . <Entity name: 7efc0570>) (0 . "INSERT") (330 . <Entity
name: 7efbecf8>) (5 . "1EE") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"Невидимые") (6 . "Continuous") (100 . "AcDbBlockReference") (66 . 1) (2 .
"ARM-INFO") (10 862.134 1271.86 0.0) (41 . 150.0) (42 . 150.0) (43 . 150.0) (50
. 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
А про атрибуты и значения их нечего нету. Подскажите пожалуйста какой командой можно это посмотреть? И вообще как это можно сделать?
Просмотров: 11868
 
Непрочитано 28.06.2010, 00:22
1 | #2
Кулик Алексей aka kpblc
Moderator

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


http://forum.dwg.ru/showthread.php?t=22653
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.06.2010, 09:46
#3
Pr9nik


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


Спасибо, не подскажешь как ей пользоваться? Загрузил в автокад... а вот дальше какую функцию вводить? _dwgru-block-get-attr-by-mask?
Сильно не бейте, с автолиспом только начинаю знакомится.
Pr9nik вне форума  
 
Непрочитано 29.06.2010, 09:54
1 | #4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Эту функцию можно использовать в своем коде.
Код:
[Выделить все]
<...>
(setq ats (_dwgru-block-get-attr-by-mask (car (entsel "\nУкажите блок с атрибутами:")) nil))
<...>
Главное тут - не забыть, что функция _dwgru-block-get-attr-by-mask использует еще 3 библиотечные функции, которые, в свою очередь, могут использовать другие функции... и все их надо подгрузить в автокад.
Do$ вне форума  
 
Автор темы   Непрочитано 29.06.2010, 10:36
#5
Pr9nik


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


Подгрузил все 5 функции...
1_dwgru-block-get-attr-by-mask.lsp
2_dwgru-is-ent-block-reference.lsp
3_dwgru-property-get.lsp
4_dwgru-conv-ent-to-vla.lsp
5_dwgru-conv-value-vla-to-list.lsp

ввожу (setq ats (_dwgru-block-get-attr-by-mask (car (entsel "\nУкажите блок с атрибутами:")) nil))
выбираю блок...
он мне возвращает nill
Pr9nik вне форума  
 
Непрочитано 29.06.2010, 10:39
#6
Кулик Алексей aka kpblc
Moderator

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


В последнем аргументе используй не nil, а "*".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.06.2010, 10:52
#7
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


В функции есь вот что:
Код:
[Выделить все]
(if (not mask)
    (setq mask "*")
    ) ;_ end of if
Так что мона и nil! А в блоке есть атрибуты-то?
Do$ вне форума  
 
Непрочитано 29.06.2010, 11:10
#8
Кулик Алексей aka kpblc
Moderator

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


Do$, я уж и забыл
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.06.2010, 09:28
#9
Pr9nik


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


Попробовал и nil и "*"
возвращает:
Укажите блок с атрибутами:; error: no function definition: nil
в 1-м файле прописал в начале (vl-load-com)
может надо еще какието команды подгрузить?
Pr9nik вне форума  
 
Непрочитано 30.06.2010, 09:29
1 | #10
Кулик Алексей aka kpblc
Moderator

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


ОБразец файла покажи. Мне уже просто интересно
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.06.2010, 09:36
#11
Pr9nik


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


тут 5 файлов лиспа, сам блок, и какую команду ввожу
Вложения
Тип файла: rar 1.rar (39.1 Кб, 105 просмотров)
Pr9nik вне форума  
 
Непрочитано 30.06.2010, 09:53
1 | #12
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


В функции _dwgru-block-get-attr-by-mask
надо заменить _dwgru-conv-value-to-list на _dwgru-conv-value-vla-to-list.
И вообще, я понимаю - отлов ошибок и пр... но иногда проще надо быть :
Код:
[Выделить все]
(defun do$-blk-get-attributes (ent / lst)
;;(do$-blk-get-attributes (car (entsel "\nSelect block:")))
  (while (and (setq ent (entnext ent))
       (= "ATTRIB" (cdr (assoc 0 (entget ent))))
  ) ;_ end of and
    (setq lst (cons ent lst))
  ) ;_ end of while
  lst
) ;_ end of defun
Do$ вне форума  
 
Автор темы   Непрочитано 30.06.2010, 10:20
#13
Pr9nik


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


Спасибо, заменил и получилось, вернул:
(#<VLA-OBJECT IAcadAttributeReference2 0c993b2c> #<VLA-OBJECT IAcadAttributeReference2 0c993964> #<VLA-OBJECT
IAcadAttributeReference2 0c9938cc> #<VLA-OBJECT IAcadAttributeReference2 0c993834> #<VLA-OBJECT IAcadAttributeReference2 0c99379c> #<VLA-OBJECT IAcadAttributeReference2 0c993704> #<VLA-OBJECT IAcadAttributeReference2 0c99366c>)
Это я так понимаю имена атрибутов, и нужно еще их разложить на списки чтоб добраться до значения этих атрибутов? И еще вопросс это он выдал результат в виде списка? Как их можно обрабатывать?
Вот этот код попроще Только он мне выдал:
Command: (setq ats (do$-blk-get-attributes (car (entsel "\nУкажите блок с
атрибутами:")) nil))

Укажите блок с атрибутами:; error: too many arguments
Pr9nik вне форума  
 
Непрочитано 30.06.2010, 10:31
1 | #14
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


А надо так:
(setq ats (do$-blk-get-attributes (car (entsel "\nSelect block:"))))
Do$ вне форума  
 
Автор темы   Непрочитано 30.06.2010, 10:37
#15
Pr9nik


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


Спасибо получилось! Вернул список с именами
Pr9nik вне форума  
 
Непрочитано 30.06.2010, 12:00
#16
VVA

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


А где АКАД хранит значения атрибутов?
Редактирование атрибутов блока (скрытых и постоянных)
Извлечение значений атрибутов блоков AutoCAD Electrical с помощью AutoLisp
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.06.2010, 13:35
#17
E-degtyarev

Помогаю, кому делать нечего.
 
Регистрация: 27.03.2009
Русская деревня
Сообщений: 394


Pr9nik, Вообще то не обязательно использовать добрый десяток функций "со стороны", а можно развить код начатый Вами в теме используя стандартные функции Lisp:
Код:
[Выделить все]
(setq bl (cdr (assoc -1 (entget (car (entsel))))))
(print bl);;ТУТА ИМЯ БЛОКА
(while (eq (cdr (assoc 0 (entget (setq bl (entnext bl)))))
	   "ATTRIB"
       ) ;_ конец eq
  (progn
    (setq bbll (entget bl))
    (print bbll)	      ;;ТУТА АТРИБУТЫ т.е. ТО, ЧТО ТЕ НАДО!!!
  ) ;_ конец progn
) ;_ конец while
Вот коротенький кусочек кода, попробуй.
PS: Все это уже на форуме многократно обсуждалось.

Последний раз редактировалось E-degtyarev, 30.06.2010 в 13:56.
E-degtyarev вне форума  
 
Непрочитано 04.10.2022, 11:27
#18
pad


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


Добрый день! Как увидеть атрибуты с режимами СКРЫТЫЙ и ПОСТОЯННЫЙ?
pad вне форума  
 
Непрочитано 04.10.2022, 11:55
#19
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Если склероз не подводит, то СКРЫТЫЙ - как обычный, перебором атрибутов
примитива "INSERT", а вот ПОСТОЯННЫЙ - тот живёт уже в таблице определения
блоков "BLOCK".
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 06.10.2022, 09:32
#20
pad


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


С помощью функций LEE MAC LM:getvisibilitystate можно получить состояние видимости динамического блока, а с помощью LM:getvisibilityparametername узнать имя параметра видимости динамического блока (если есть)).
Вопрос, А как считать атрибуты блока с учетом параметра Видимости (они меняются в зависимости от выбора той или иной Видимости)?
С обычного дин. блока я из считываю фунцией get-all-atts
Код:
[Выделить все]
 
(defun  get-all-atts (obj)
  (if (and obj
	   (eq :vlax-true (vla-get-HasAttributes obj))
	   (vlax-property-available-p obj 'Hasattributes)
      )
    (vl-catch-all-apply
      (function
	(lambda	()
	  (mapcar (function (lambda (x)
			      (cons (vla-get-TagString x)
				    (vla-get-TextString x)
			      )
			    )
		  )
		  (append (vlax-invoke obj 'Getattributes)
			  (vlax-invoke obj 'Getconstantattributes)
		  )
	  )
	)
      )
    )
  )
)
pad вне форума  
 
Непрочитано 06.10.2022, 10:17
#21
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


а зачем? извлекаете все атрибуты, но берете только нужные по текущей логике программы.
Сергей812 вне форума  
 
Непрочитано 06.10.2022, 12:19
#22
pad


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


Дак в том то и дело, что атрибуты содержащие текст выставлены в зависимости от состояния Видимости, в этом суть. Должен же быть маркер у них?
pad вне форума  
 
Непрочитано 06.10.2022, 12:43
#23
Кулик Алексей aka kpblc
Moderator

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


По-моему, достаточно проверять свойство видимости. Какой бит в DXF за это отвечает, не помню точно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.10.2022, 13:18
#24
pad


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
По-моему, достаточно проверять свойство видимости. Какой бит в DXF за это отвечает, не помню точно.
Может есть кусок кода, или источник где можно изучить? Читая на форуме ветку от Supermax "Создание дополнительных параметров Visibility Set в динамических блоках" закипел уже
pad вне форума  
 
Непрочитано 06.10.2022, 13:32
#25
Кулик Алексей aka kpblc
Moderator

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


Ну как-то так примерно:
Код:
[Выделить все]
 (defun  get-all-atts (obj)
  (if (and obj
	   (vlax-property-available-p obj 'Hasattributes)
	   (eq :vlax-true (vla-get-HasAttributes obj))
      )
    (vl-catch-all-apply
      (function
	(lambda	()
	 (vl-remove nil (mapcar (function (lambda (x)
			    (if (equal (vla-get-visible x))  (cons (vla-get-TagString x)
				    (vla-get-TextString x)
			      )
			    )
		  ))
		  (append (vlax-invoke obj 'Getattributes)
			  (vlax-invoke obj 'Getconstantattributes)
		  ))
	  )
	)
      )
    )
  )
)
Код не проверял (пишу без ACAD'a)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.10.2022, 14:07
#26
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от pad Посмотреть сообщение
Дак в том то и дело, что атрибуты содержащие текст выставлены в зависимости от состояния Видимости, в этом суть. Должен же быть маркер у них?
с другой стороны, у каждого атрибута есть тэг/имя. И если в динпараметр видимости эти атрибуты заносятся по определенной системе, а не в каждом блоке произвольно - то по состоянию параметра видимости и именам атрибутов можно выбрать нужные. Хотя на лиспе проще видимость атрибута посмотреть, наверно)
Сергей812 вне форума  
 
Непрочитано 06.10.2022, 14:57
#27
Кулик Алексей aka kpblc
Moderator

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


Тэги - как ни парадоксально - могут повторяться.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.10.2022, 15:09
#28
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тэги - как ни парадоксально - могут повторяться.
имхо, не вижу ничего парадоксального, потому что атрибуты - просто список, а не словарь с ключом = имени тэга (сужу на основании того, что нет механизма доступа к значениям отдельных атрибутов по имени).
Сергей812 вне форума  
 
Непрочитано 06.10.2022, 15:57
#29
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Дык атрибуты появились в те времена, когда "словари" только бумажные были...
И стояли на книжных полках. :-)
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 07.10.2022, 10:48
#30
pad


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Тэги - как ни парадоксально - могут повторяться.
Может я не корректно объяснил вопрос, есть блок. В блоке есть N количество видимостей.
На каждой видимости помимо графической части есть два скрытых постоянных атрибута, пусть будут единицы измерения и количество.
Для примера:
"видимость 1" атрибуты имеют значения М и 1,
"видимость 2" атрибуты имеют значения КГ и 100,
"видимость 3" атрибуты имеют значения ШТ и 1000.

Дак вот вопрос был, как считать атрибуты активной (установленной) видимости блока на чертеже, т.е. если пользователь выбрал "видимость 2" то необходимо считать атрибуты КГ и 100.

Предложенный код, выдает весь список атрибутов, т.е. на сколько я понял затею vl-remove не чистит не активные атрибуты других видимостей.

Последний раз редактировалось pad, 07.10.2022 в 10:56.
pad вне форума  
 
Непрочитано 07.10.2022, 10:54
1 | #31
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Код:
[Выделить все]
 (setq insert_object (vlax-ename->vla-object (car (entsel))))
(princ "\n")
(foreach attribute
	(vl-remove-if '(lambda (attribute) (zerop (vlax-get attribute 'visible)))
				   (append (vlax-invoke insert_object 'getattributes)
				   		   (vlax-invoke insert_object 'getconstantattributes)
				   )
	)
	(princ (strcat "\n" (vla-get-tagstring attribute) "/" (vla-get-textstring attribute)))
)
__________________
K Lisp
koMon вне форума  
 
Непрочитано 07.10.2022, 10:58
#32
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


имхо, какой-то усложненный путь - хранить в блоке множество атрибутов, используя лишь небольшую часть для самой работы.
Сергей812 вне форума  
 
Непрочитано 07.10.2022, 14:24
#33
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Ну дык и смотри DXF-код 70. Первый бит - режим скрытности.
0 - видим, 1 - скрыт.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 07.10.2022, 16:53
#34
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


70 группа это флаг атрибута, здесь нужна видимость объекта - 60 группа.
__________________
K Lisp
koMon вне форума  
 
Непрочитано 10.10.2022, 06:43
#35
pad


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Код:
то что надо было!
pad вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как увидть атрибуты блока через лисп?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как переделать атрибуты в тексты? Grinzaid AutoCAD 4 29.08.2016 16:53
Как задать блоку с атрибуты? kosolapi AutoCAD 20 02.12.2009 13:54
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Как изменять, добавлять атрибуты у блока Алексей К. AutoCAD 2 29.01.2007 10:59