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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > А где АКАД хранит значения атрибутов?

А где АКАД хранит значения атрибутов?

Ответ
Поиск в этой теме
Непрочитано 30.05.2006, 15:10 #1
А где АКАД хранит значения атрибутов?
Tramp
 
Регистрация: 12.01.2006
Сообщений: 114

Т.е. имеется блок с атрибутом. На чертеже несколько вставок этого блока с различными значениями этого атрибута.
Если просмотреть DXF код какого-либо из них (entget (car (entsel))), информации об атрибуте в нём нет. Но ведь где-то она хранится?
Просмотров: 5279
 
Непрочитано 31.05.2006, 00:48
#2
KAI

геологоразведка, строительство
 
Регистрация: 14.10.2003
Магадан
Сообщений: 311


Естественно. В следующими за блоком примитиве, если DXF код 66 примитива INSERT равен 1. Имена этих примитивов ATTRIB.
Их можно получить по функции entnext.
KAI вне форума  
 
Автор темы   Непрочитано 31.05.2006, 08:43
#3
Tramp


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


Спасибо. Ни за что бы не додумался :-)
Tramp вне форума  
 
Непрочитано 31.05.2006, 09:16
#4
Кулик Алексей aka kpblc
Moderator

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


Можно и через vla- добраться
Код:
[Выделить все]
_$ (setq block (vlax-ename->vla-object (car (entsel))))
#<VLA-OBJECT IAcadBlockReference 05588234>
;; Получаем указатель на блок
_$ (vlax-safearray->list (vlax-variant-value (vla-GetAttributes block)))
(#<VLA-OBJECT IAcadAttributeReference 055880b4> #<VLA-OBJECT IAcadAttributeReference 05589644>)
;; Получаем список его атрибутов
_$ (mapcar 'vla-get-TagString (vlax-safearray->list (vlax-variant-value (vla-GetAttributes block))))
("TAG2" "TAG1")
;; Получаем список тэгов атрибутов блока
_$ (mapcar 'vla-get-textString (vlax-safearray->list (vlax-variant-value (vla-GetAttributes block))))
("val2" "val1")
;; А это значения атрибутов :)
Ну и так далее.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 31.05.2006, 11:48
#5
Tramp


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


2 KAI
неа, не работает. По entnext выдаётся следующий блок :-(
Tramp вне форума  
 
Непрочитано 31.05.2006, 12:16
#6
Zouss


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


работает работает

(entnext blockname) надо писать, где blockname имя блока полученное например с помощью (ssname или (entlast)
Zouss вне форума  
 
Автор темы   Непрочитано 31.05.2006, 12:29
#7
Tramp


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


Да, действительно.
С синтаксисом команды не разобрался
Tramp вне форума  
 
Непрочитано 31.05.2006, 12:40
#8
VVA

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


Пример
Ф-ция
Код:
[Выделить все]
;| Ф-ция возвращает список атрибутов блока
   e1 - имя примитива блока (ENAME)
*  Возвращает
   Список
   ((TAG Значение dxf10 dxf11 dxf50 [угол поворота]) ...)
* пример вызова
   (if (setq e1 (car(entsel "\Выберите блок: ")))(mip_get_blk_att e1))
   Вернет
   (("ATT2" "Value_Att2" (217.957 269.772 0.0) (0.0 0.0 0.0) 0.0) ("ATT1" "Value_Att1" (218.377 274.379 0.0) (0.0 0.0 0.0) 0.0))
   |;

(defun mip_get_blk_att ( e1 / ed imattr znattr retlist ptattr ptattr11 ugattr)
    (setq ed (entget e1))
  (if (and
	(= (cdr (assoc 0 ed)) "INSERT") ;_Блок
	(= (cdr (assoc 66 ed)) 1)       ;_След аттриб
      )
    (progn
        (setq e1 (entnext e1))
        (while (AND e1
		  (= (cdr (assoc 0 (setq ed (entget e1)))) "ATTRIB")
	     ) ;_ End of AND
	(setq imattr (cdr (assoc 2 ed))
              znattr (cdr (assoc 1 ed))
              ptattr (cdr (assoc 10 ed))
            ptattr11 (cdr (assoc 11 ed))
              ugattr (cdr (assoc 50 ed)))
	  
	(setq retlist (append retlist (list (list imattr znattr ptattr ptattr11 ugattr))))
	(setq e1 (entnext e1))
      )
    )  
  )
  retlist
)
Вызов
Код:
[Выделить все]
(if (setq e1 (car(entsel "\Выберите блок: ")))(mip_get_blk_att e1))
VVA вне форума  
 
Автор темы   Непрочитано 01.06.2006, 09:58
#9
Tramp


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


Спасибо за добрые советы, всё работает, атрибуты извлекаются и меняются без проблем.

КрЫс, а использование ActiveX даёт какие-то ощутимые преимущества перед традиционными методами AutoLISP? Не понимаю я его, потому не люблю :-)
Tramp вне форума  
 
Непрочитано 01.06.2006, 10:10
#10
Кулик Алексей aka kpblc
Moderator

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


Ну в общем-то ActiveX предоставляет более удобный доступ к свойствам примитивов (для приколу - попробуй понять, где в dxf солида лежат вычисленный объем, к примеру. Через ActiveX это делается за 5 секунд). В принципе, это вопрос вкуса и привычки, ЯТД, не более
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.06.2006, 10:15
#11
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


У ActiveX есть только один недостаток - чтобы им свободно владеть, нужно хотя бы слегка разуметь аглицкой мове. :twisted: Тогда все остальное будет просто тьфу.
Лентяй вне форума  
 
Автор темы   Непрочитано 01.06.2006, 10:38
#12
Tramp


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


Цитата:
Сообщение от Лентяй
У ActiveX есть только один недостаток - чтобы им свободно владеть, нужно хотя бы слегка разуметь аглицкой мове. :twisted: Тогда все остальное будет просто тьфу.
С этим проблем нет :-)
Но я спрашивал не про отсутствие недостатков, а про наличие реальных преимуществ.
Хотя, конечно, КрЫс прав - всё субъективно.
Tramp вне форума  
 
Непрочитано 01.06.2006, 10:47
#13
Кулик Алексей aka kpblc
Moderator

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


Хм... Еще один момент. В многострочном тексте (если текста больше чем 255 символов) его значения хранятся в 1 группе и в 3. Соответственно надо объединять полученные значения, учитывать, что 3 группы может быть несколько экземпляров и проч. Через ActiveX: (vla-get-textstring (vlax-ename->vla-object (car (entsel)))) вернет всю строку любого текста - хоть однострочного, хоть многострочного.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.06.2006, 11:05
#14
Tramp


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


Цитата:
Сообщение от kpblc
Через ActiveX: (vla-get-textstring (vlax-ename->vla-object (car (entsel)))) вернет всю строку любого текста - хоть однострочного, хоть многострочного.
А вот это уже реальный плюс. Я сэтим многострочным текстом в своё время всю голову сломал :-)
Tramp вне форума  
 
Непрочитано 01.06.2006, 11:51
#15
Кулик Алексей aka kpblc
Moderator

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


В продолжение начала темы:
получение атрибутов блока через dxf:
Код:
[Выделить все]
(defun mip_get_blk_att ( e1 / ed imattr znattr retlist ptattr ptattr11 ugattr)
    (setq ed (entget e1))
  (if (and
   (= (cdr (assoc 0 ed)) "INSERT") ;_Блок
   (= (cdr (assoc 66 ed)) 1)       ;_След аттриб
      )
    (progn
        (setq e1 (entnext e1))
        (while (AND e1
        (= (cdr (assoc 0 (setq ed (entget e1)))) "ATTRIB")
        ) ;_ End of AND
   (setq imattr (cdr (assoc 2 ed))
              znattr (cdr (assoc 1 ed))
              ptattr (cdr (assoc 10 ed))
            ptattr11 (cdr (assoc 11 ed))
              ugattr (cdr (assoc 50 ed)))
    
   (setq retlist (append retlist (list (list imattr znattr ptattr ptattr11 ugattr))))
   (setq e1 (entnext e1))
      )
    ) 
  )
  retlist
)
через activex:
Код:
[Выделить все]
(defun _kpblc-block-att	(/ block res)
  (if (and (setq block (entsel))
	   (setq block (vlax-ename->vla-object (car block)))
	   (= (vla-get-objectname block) "AcDbBlockReference")
	   (= (vla-get-hasattributes block) :vlax-true)
	   ) ;_ end of and
    (foreach item (vlax-safearray->list
		    (vlax-variant-value (vla-getattributes block))
		    ) ;_ end of vlax-safearray->list
      (setq
	res
	 (append
	   res
	   (list
	     (list
	       item
	       (cons "tag" (vla-get-tagstring item))
	       (cons "text" (vla-get-textstring item))
	       (cons 10
		     (vlax-safearray->list
		       (vlax-variant-value (vla-get-insertionpoint item))
		       ) ;_ end of vlax-safearray->list
		     ) ;_ end of cons
	       (cons 11
		     (vlax-safearray->list
		       (vlax-variant-value (vla-get-textalignmentpoint item))
		       ) ;_ end of vlax-safearray->list
		     ) ;_ end of cons
	       ) ;_ end of list
	     ) ;_ end of list
	   ) ;_ end of append
	) ;_ end of setq
      ) ;_ end of foreach
    ) ;_ end of if
  res
  ) ;_ end of defun
Просто в принципе эта функция лишняя, имея vla-указатели на атрибуты, можно из них получить все что угодно. Код выполняет аналогичные функции, но, на мой взгляд, он не требует высококлассного знания DXF-кодов и немного более понятен
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.06.2006, 14:00
#16
VVA

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


Или вместо
Код:
[Выделить все]
  (foreach item (vlax-safearray->list 
          (vlax-variant-value (vla-getattributes block)) 
          ) ;_ end of vlax-safearray->list 
        ...
так
Код:
[Выделить все]
(foreach item  (vlax-invoke block 'Getattributes)
      ...
VVA вне форума  
 
Непрочитано 01.06.2006, 14:05
#17
Кулик Алексей aka kpblc
Moderator

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


vlax-invoke не участвует в документации. Как сказал Н.Н.Полещук, недокументированные функции могут прекратить поддерживать. Так что, если есть возможноть, лучше от них избавляться.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > А где АКАД хранит значения атрибутов?