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

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

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

Ответ
Поиск в этой теме
Непрочитано 05.08.2011, 15:22 #1
как из набора блоков получить список значений атрибута?
mamuk
 
Сургут
Регистрация: 06.05.2010
Сообщений: 248

доброго времени! у меня есть блок "rpvr" на чертеже и копий его много. у этого блока есть атрибут "CTR_ALTITUDE" в этом атрибуте записаны данные
я пытаюсь получить список значений атрибута "CTR_ALTITUDE" из всех блоков с именем "rpvr"
как извлечь данные у одного блока я понял но как перебрать все блоки из набора не пойму
я делаю так создаю набор
Код:
[Выделить все]
 (setq set_markers (ssget "_X" (list(cons 2 "rpvr"))))
далее полное извращение не пойму как перебрать атрибуты каждого блока
это одна из попыток и c repeat пробовал.
Код:
[Выделить все]
 (while (/= (sslength set_markers) a)
      (setq i (1+ i))
      (setq name (ssname set_markers i ))
      (setq ename_attr (entnext name))
         (while (/= attr "CTR_ALTITUDE")
 (setq ename_attr (entnext ename_attr))
    (setq attr (cdr(assoc 2 (entget ename_attr))))
	   (setq list_markers (vl-remove-if-not '(lambda(x)(=(car x) 1))(entget ename_attr)))
   )
      (setq a (1+ a))
              )
так и незнаю как осуществить се действие
может есть vla- метод который по имени атрибута блока выдает его содержимое.
Всем удачных выходных!!
Просмотров: 3511
 
Непрочитано 05.08.2011, 16:04
1 | #2
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Код:
[Выделить все]
 
; Вызов: (get-attr-value "rpvr" "CTR_ALTITUDE")
(defun get-attr-value(block_name attr_name / lst_attr_value)
  ((lambda(nbr)
     (if nbr
       (foreach item (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex nbr))))
	 (if (= (vla-get-EffectiveName item) block_name)
	   ((lambda(sf)
	      (if (> (vlax-safearray-get-u-bound sf 1) -1)
		(foreach attr (vlax-safearray->list sf)
		  (if (= (vla-get-TagString attr) attr_name)
		    (setq lst_attr_value (cons (vla-get-TextString attr) lst_attr_value))
		    )
		  )
		)
	      )
	     (vlax-variant-value (vla-GetAttributes item))
	     )
	   )
	 )
       )
     )
    (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat block_name ",`*U*"))))
    )
  (reverse lst_attr_value)
  ); end get-attr-value
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 05.08.2011, 16:30
#3
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


у меня не получается с помощью вашей функции получить список все время возвращает nil что я не так делаю? натыкал блоков и вызвал функцию (get-attr-value "rpvr" "CTR_ALTITUDE") в строке получил nil подскажите пожалуйста!
mamuk вне форума  
 
Непрочитано 05.08.2011, 16:37
#4
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от mamuk Посмотреть сообщение
натыкал блоков и вызвал функцию (get-attr-value "rpvr" "CTR_ALTITUDE") в строке получил nil подскажите пожалуйста!
mamuk, тыкать ничего не надо, после запуска функции (get-attr-value "rpvr" "CTR_ALTITUDE") должны программно выбраться все блоки с именем rpvr и из них считаться значения атрибутов CTR_ALTITUDE. Nil возвращается если указанных блоков нет или если в указанных блоках нет указанных атрибутов.
P. S. Лучше выложи чертеж где у Тебя не работает (версия ACAD'a не позже 2008)
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 05.08.2011, 16:52
#5
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


добавил файл там два блока
Вложения
Тип файла: dwg
DWG 2010
блоки Autocad_2010.dwg (55.5 Кб, 488 просмотров)
mamuk вне форума  
 
Непрочитано 05.08.2011, 16:58
#6
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


mamuk, или я не так выразился или Ты меня не так понял

Цитата:
Сообщение от TararykovDG Посмотреть сообщение
P. S. Лучше выложи чертеж где у Тебя не работает (версия ACAD'a не позже 2008)
Я имел ввиду файл в версии 2008 или более ранней версии 2007 ... 2002 AutoCAD'а, потому что у меня установлен AutoCAD2008 и файл AutoCAD2010 я открыть не могу
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 05.08.2011, 17:04
#7
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


видимо не понял я!
я пересохранил должно открытся
Вложения
Тип файла: dwg
DWG 2007
блоки Autocad_2007.dwg (69.9 Кб, 489 просмотров)
mamuk вне форума  
 
Непрочитано 05.08.2011, 17:14
1 | #8
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


имя блока и имя атрибут в моем варианте кода чувствительна к регистру, поэтому надо вызывать так (get-attr-value "RPVR" "CTR_ALTITUDE")
Хотя Ты написал
Цитата:
Сообщение от mamuk Посмотреть сообщение
доброго времени! у меня есть блок "rpvr" на чертеже и копий его много
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 05.08.2011, 17:30
#9
mamuk


 
Регистрация: 06.05.2010
Сургут
Сообщений: 248


попробую ваш код с регистром только дома уже! а то за сиделся на работе! у нас ужо вечер полвосьмого!
спасибо вам!!
у меня только еще вопрос по поводу выбора (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat block_name ",`*U*"))))
имено в эттой строчке (strcat block_name ",`*U*") что дает данная строка,то что строки сцеляются мне понятно, но как это влияет на выбор?
спасибо!!
mamuk вне форума  
 
Непрочитано 05.08.2011, 17:59
#10
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от mamuk Посмотреть сообщение
у меня только еще вопрос по поводу выбора (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat block_name ",`*U*"))))
имено в эттой строчке (strcat block_name ",`*U*") что дает данная строка,то что строки сцеляются мне понятно, но как это влияет на выбор?
Это позволяет включить в набор вхождения динамических блоков, так как у таких вхождений имя может быть не такое же как имя у описания блока, а например будет *U[какя-нибудь цифра], поэтому я формирую набор из всех вхождений блоков с именем block_name и всех вхождений динамических блоков, а потом с помощью свойства EffectiveName в строке (= (vla-get-EffectiveName item) block_name) оставляю только те вхождения дин. блоков которые действительно являются вхождениями блока block_name.
__________________
cadtools
TararykovDG вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > как из набора блоков получить список значений атрибута?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить Список файлов в директории (поддиректорий) VBA sf Программирование 2 17.12.2010 12:06
как получить список всех видов в чертеже Димас Программирование 12 22.02.2006 02:29
Можно ли получить список загруженных команд? Кулик Алексей aka kpblc Программирование 8 11.10.2005 09:04
Как получить список открытых файлов? ===AAA=== Программирование 2 26.08.2005 11:55
Можно ли получить список реакторов объекта? kos Программирование 1 13.01.2005 13:28