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

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

Извлечение атрибутов из блоков в список

Ответ
Поиск в этой теме
Непрочитано 07.07.2011, 12:40 #1
Извлечение атрибутов из блоков в список
proektant-minsk
 
Проектировщик ОВ
 
Минск
Регистрация: 15.10.2010
Сообщений: 42

Дано:
В пространстве modelSpace имеется n блоков (не динамических).
Каждый блок имеет около 15 атрибутов.
Найти:
При помощи инструментов VisualLisp, из указанной области, выбрать данные блоки и вывести их атрибуты в один ассоциативный список, (все блоки имеют одинаковое имя и одинаковое число атрибутов) для дальнейшей сортировки его.
Результат должен быть примерно таким:
(list

(list (list x y) (list name_atr1 value_atr1) (list name_atr2 value_atr2) (list name_atr3 value_atr3) ... )
(list (list x y) (list name_atr1 value_atr1) (list name_atr2 value_atr2) (list name_atr3 value_atr3) ... )
(list (list x y) (list name_atr1 value_atr1) (list name_atr2 value_atr2) (list name_atr3 value_atr3) ... )
...
)

где x,y координаты блока
спасибо.
Просмотров: 4568
 
Непрочитано 07.07.2011, 13:13
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от proektant-minsk Посмотреть сообщение
Результат должен быть примерно таким:
(list

(list (list x y) (list name_atr1 value_atr1) (list name_atr2 value_atr2) (list name_atr3 value_atr3) ... )
(list (list x y) (list name_atr1 value_atr1) (list name_atr2 value_atr2) (list name_atr3 value_atr3) ... )
(list (list x y) (list name_atr1 value_atr1) (list name_atr2 value_atr2) (list name_atr3 value_atr3) ... )
...
)
Ты так все красиво расписал, и если нужен именно список - значит ты что-то с ним дальше собираешся делать - видимо с лиспом знаком - в чем сложность аттрибуты вынуть? vla-getattributes в справочнике есть - программа на 10 строк без всяких заковырок.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 07.07.2011, 13:32
#3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


get-all-atts
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 07.07.2011, 15:31
#4
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


;http://www.menziengineering.ch/Downloads/Download.htm
Код HTML:
;-------------------------------------------
;VxGetAtts - Reads all attribute values from a block
;-------------------------------------------
;
; -- Function VxGetAtts
; Reads all attribute values from a block.
; Copyright:
;   ©2000 MENZI ENGINEERING GmbH, Switzerland
; Arguments [Type]:
;   Obj = Object [VLA-OBJECT]
; Return [Type]:
;   > Dotted pair list '(("Tag1" . "Val1")...)[list]
; Notes:
;   - None
;
(defun VxGetAtts (Obj)
 (mapcar 
 '(lambda (Att)
   (cons (vla-get-TagString Att)
         (vla-get-TextString Att)
   )
  )
  (vlax-invoke Obj 'GetAttributes)
 )
)
Олег (jr.) вне форума  
 
Непрочитано 27.01.2012, 06:59
#5
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Ребята, а можно, то же самое (ну естественно без значения, только имена) атрибутов из описания блоков?
Я сам как-то делал, только муторно и по длинному: vla-get-blocks -> tblobjname -> entnext.
Наверняка где-то есть более изящное решения.
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 27.01.2012, 13:07
#6
Кулик Алексей aka kpblc
Moderator

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


Вырвано из библиотеки, но суть, думаю, понятна
Код:
[Выделить все]
(defun _kpblc-block-attr-get-pointer-mask (blk mask / res)
                                          ;|
*    Получение списка атрибутов блока по маске. Учитываются также постоянные атрибуты.
*    Параметры вызова:
*	blk	указатель на вставку блока
*	mask	строка с маской тэга атрибута
|;

  (if (not mask)
    (setq mask "*")
    ) ;_ end ofif
  (if (or (_kpblc-is-ent-block-with-attr blk)
          (_kpblc-is-ent-block-with-constant-attr blk)
          ) ;_ end ofor
    (progn
      (setq blk (_kpblc-conv-ent-to-vla blk))
      (vl-remove-if-not
        (function
          (lambda (x)
            (wcmatch (strcase (_kpblc-property-get x 'tagstring))
                     (strcase mask)
                     ) ;_ end of wcmatch
            ) ;_ end of lambda
          ) ;_ end of function
        (apply (function append)
               (mapcar (function _kpblc-conv-vla-to-list)
                       (list
                         (vla-getattributes blk)
                         (vla-getconstantattributes blk)
                         ) ;_ end of list
                       ) ;_ end of mapcar
               ) ;_ end of apply
        ) ;_ end of vl-remove-if-not
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun]
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.01.2012, 14:30
#7
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Алексей, а на мой вопрос.
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 27.01.2012, 14:45
1 | #8
Кулик Алексей aka kpblc
Moderator

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


А, тебе из описания (определения) блока... Тады ой. Тестируй (я код не проверял - извини, тупо некогда )
Код:
[Выделить все]
 (vl-load-com)

(defun _get-att-by-block-def (doc name / blk_def res)
                             ;|
*    Получение vla-указателей на атрибуты блока
*    Параметры вызова:
  doc     vla-указатель на обрабатываемый документ. nil -> текущий
  name    имя блока (строка)
|;
  (if (not doc)
    (setq doc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of if
  (if (= (type (setq blk_def
                      (vl-catch-all-apply
                        (function
                          (lambda ()
                            (vla-item (vla-get-blocks doc) name)
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'vla-object
         ) ;_ end of =
    (vlax-for ent blk_def
      (if (wcmatch (strcase (vla-get-objectname ent)) "*ATTR*")
        (setq res (cons ent res)
              ) ;_ end of setq
        ) ;_ end of if
      ) ;_ end of vlax-for
    ) ;_ end of if
  (reverse res)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.01.2012, 15:02
#9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


То Disney - можно отфильровать коллекцию примитивов из блока по ObjectName - но будет-ли это более "изящней" - вопрос.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.01.2012, 06:53
#10
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Спасибо, Алексей, всё так.
Я не знал до конца не понимал функцию vlax-for. Раньше я умел только либо применять метод, либо читать\назначать свойства, а вот у определения блока не оказалось метода GetAttributes, теперь научили работать с коллекцией примитивов из объекта.
Цитата:
Сообщение от Дима_
можно отфильровать коллекцию примитивов из блока по ObjectName
Код:
[Выделить все]
 (wcmatch (strcase (vla-get-objectname ent)) "*ATTR*")
Может "красивше" будет тупо проверить есть ли у объекта свойство TagString
Код:
[Выделить все]
 (vlax-property-available-p ent 'TagString t)
__________________
Почему все вдруг становятся умными, когда уже не надо?

Последний раз редактировалось Disney, 28.01.2012 в 07:10.
Disney вне форума  
 
Непрочитано 28.01.2012, 13:10
#11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Имена атрибутов можно достать из описания блока и из лиспа
Код:
[Выделить все]
(defun get-att-name-from-blkdef (name / blk ed lst)
  ;;; Name - string Block name
  (and
    (setq blk (tblobjname "BLOCK" name))
    (while (setq blk (entnext blk))
      (if (eq (cdr(assoc 0 (setq ed (entget blk)))) "ATTDEF")
	(setq lst (cons (cdr(assoc 2 ed)) lst))
	)
      )
    )
    lst
  )
Правда тут может возникнуть проблема с неименованными (*U) блоками
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Извлечение атрибутов из блоков в список

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Корректировка атрибутов блоков в нескольких чертежах AutoCAD из Excel superkot007 Программирование 14 20.10.2011 12:53
Извлечение значений атрибутов блоков AutoCAD Electrical с помощью AutoLisp zaraki_kenpachi LISP 16 19.02.2011 15:30
Тормозит команда расчленения набора блоков batmax Программирование 4 31.08.2010 17:37
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47