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

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

Проблема извлечения атрибутов одного блока из набора блоков

Ответ
Поиск в этой теме
Непрочитано 26.05.2017, 09:33 #1
Проблема извлечения атрибутов одного блока из набора блоков
Titli-pytli
 
Регистрация: 23.10.2013
Сообщений: 23

Если отдаю функции (attrr) блок (имя объекта) вытащенный посредством (entlast), то проблем с извлечением атрибутов и сцеплением их в одну строку не возникает. Но когда отдаю функции имя блока вытащенного из набора блоков (SSNAME), то в результате функция выдает строку из сцепленных атрибутов ВСЕХ блоков в наборе.

1. Алгоритм действий в первом случае:

(setq blok (entlast))
(attrr blok)

Получаю строку из атрибутов одного блока вроде "А1 А2"

2. Алгорим действий во втором случае:

(setq bloks (ssget '((0 . "INSERT"))))
(setq blok (SSNAME bloks N))
(attrr blok)

Получаю строку из атрибутов всех блоков набора вроде "А1 А2 А1 А2 А1 А2 ......"

Как заставить выдавать строку из атрибутов только одного блока (SSNAME bloks N) ?

Сама функция
Код:
[Выделить все]
 (defun attrr (blok / A att)
  (while (/= nil (setq blok (entnext blok)))

    (if	(eq (cdr (assoc 0 (entget blok)))
	    "ATTRIB"
	)
      (progn
	(setq att (cdr (assoc 1 (entget blok))))
	(if (= nil A)
	  (progn
	    (setq attr att)
	    (setq A 0)
	  )
	  (setq attr (strcat attr " " att))
	)
      )
    )
  )
)
Просмотров: 2811
 
Непрочитано 26.05.2017, 10:21
#2
Кулик Алексей aka kpblc
Moderator

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


Ну так правильно - ты зачем используешь (while (/= nil (setq blok (entnext blok))) ? Вот тебе код и проходит по всей базе, пока до конца не дойдет.
P.S. Может, проще будет все же через ActiveX?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 26.05.2017, 10:41
#3
Titli-pytli


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


Я чета думал, что (while (/= nil (setq blok (entnext blok))) проходится только по подпримитивам примитива под переменной blok. Яж с начала из набора выдергиваю один объект (setq blok (SSNAME (ssget '((0 . "INSERT"))) N)). Или (entnext) только с наборами работает?

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
P.S. Может, проще будет все же через ActiveX?
Книжка толстая, ActiveX с середины идет
Titli-pytli вне форума  
 
Непрочитано 26.05.2017, 10:48
1 | #4
Кулик Алексей aka kpblc
Moderator

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


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


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


Спасибо за ссылку, воспользуюсь. Но мне бы еще для понимания на пальцах показать, как работает энтот (entnext). Он берет следующий примитив из объекта который я ему даю к примеру (entnext blok)? Где blok - не набор, а отдельный обект типа: <Имя объекта: 7ffffbfa960>. Почему (while (/= nil (setq blok (entnext blok))) перебирает не конкретный блок, а весь набор? Набор жеж яж функции не даю. Если бы я набор дал, то (entnext), по идее, должен только блоки как примитивы перебрать не смотря на подпримитивы (состав конкретного блока). Али как?

----- добавлено через ~3 ч. -----
Переформулирую вопрос. В чем принципиальная разница обработки функцией (attrr) результатов присвоения между этим:

(setq blok (SSNAME (ssget '((0 . "INSERT"))) N))

и этим:

(setq blok (entlast))

?

З.Ы. По ссылке сходил. Заработала только последняя функция (на другие акад ругается, что не знает). Ну как заработала, выдает что-то вроде #<VLA-OBJECT IAcadAttributeReference 0000000057773238>. Вот... Поиск конечно дал результат, и нашел _dwgru-conv-value-vla-to-list под твоим же авторством, но акад и тут сказал "не знаю такую". Как загружать библиотеки _dwgru-....?
Titli-pytli вне форума  
 
Непрочитано 26.05.2017, 14:46
#6
frostmourn


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


Цитата:
Сообщение от Titli-pytli Посмотреть сообщение
Переформулирую вопрос. В чем принципиальная разница обработки функцией (attrr) результатов присвоения между этим:

(setq blok (SSNAME (ssget '((0 . "INSERT"))) N))

и этим:

(setq blok (entlast))
В одной маленькой детали - entlast всегда возвращает последний примитив, а SSNAME - нет. Попробуйте ради интереса так (attrr (car (entsel))) и повыбирать разные блоки.
entnext ищет по всей базе, поэтому в цикле надо не на nil проверять, а ждать появления конца последовательности - seqend. В справке по этой функции можно поподробнее почитать.
frostmourn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Проблема извлечения атрибутов одного блока из набора блоков

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неудаляемый слой в атрибуте блока. Смысл синхронизации атрибутов? АлексЮстасу AutoCAD 4 04.06.2016 01:59
Невозможно изменить вид атрибутов блока Nick Fur AutoCAD 2 23.05.2016 08:50
Как отключить отображение параметров атрибутов блока на палитре свойств. Amiskey AutoCAD 2 03.11.2015 20:36
Поля атрибутов вложенного блока не отображают своих значений hwd AutoCAD 7 23.12.2009 08:40
Изменение характеристик атрибутов в вхождении блока zenon AutoCAD 9 27.11.2008 14:43