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

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

Как вывести список всех подпримитивов блока или др. элемента.

Ответ
Поиск в этой теме
Непрочитано 20.01.2010, 23:39 #1
Как вывести список всех подпримитивов блока или др. элемента.
Neo_
 
матрица
 
Регистрация: 06.04.2006
Сообщений: 401

чтобы прийти к подэлементу приходиться идти entnext entnext... пытаясь отыскать нужный элемент, можно ли вывести все подэлементы блока например по порядку найти нужный ??
Просмотров: 4359
 
Непрочитано 20.01.2010, 23:55
#2
Дима_

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


Что значит нужный? - посмотри функцию ssget - для lispa есть "святое" правило - все данные вначале в список - а затем их обработка.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.01.2010, 00:08
#3
Neo_

матрица
 
Регистрация: 06.04.2006
Сообщений: 401


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Что значит нужный? - посмотри функцию ssget - для lispa есть "святое" правило - все данные вначале в список - а затем их обработка.
Так в составе блока есть подпримитивы я должен разбить блок а потом выбрать все примитивы ssget? Тогда мне не нужно тыкаться внутриблочно...
Neo_ вне форума  
 
Непрочитано 21.01.2010, 08:07
#4
Кулик Алексей aka kpblc
Moderator

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


Вывести - можно. Но, действительно,
Цитата:
Сообщение от Дима_ Посмотреть сообщение
Что значит нужный?
А так - лови. Выводит список vla-указателей на примитивы блока (насчет порядка не уверен, не проверял). Для дин.блоков выводит список текущего представления. Обрабатывает вложенные блоки.
Код:
[Выделить все]
(vl-load-com)

(defun test (/ adoc ent res)

  (defun fun_get-subent (blk / lst)
    (vlax-for ent blk
      (setq lst (cons
                  (if (= (vla-get-objectname ent) "AcDbBlockReference")
                    (fun_get-subent (vla-item (vla-get-blocks adoc) (vla-get-name ent)))
                    ent
                    ) ;_ end of if
                  lst
                  ) ;_ end of cons
            ) ;_ end of setq
      ) ;_ end of vlax-for
    (reverse lst)
    ) ;_ end of defun

  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (if (and (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (car (entsel "\nУкажите блок <Отмена> : "))
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (cdr (assoc 0 (entget ent))) "INSERT")
           (setq ent (vlax-ename->vla-object ent))
           ) ;_ end of and
    (progn
      (setq res (fun_get-subent (vla-item (vla-get-blocks adoc) (vla-get-name ent))))
      ) ;_ end of progn
    ) ;_ end of if
  res
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.01.2010, 08:34
#5
Do$

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Для дин.блоков выводит список текущего представления.
Да нет, вроде все примитивы в списке, даже те, что не видны в текущем представлении.
Do$ вне форума  
 
Автор темы   Непрочитано 21.01.2010, 08:58
#6
Neo_

матрица
 
Регистрация: 06.04.2006
Сообщений: 401


Спасибо большое! счас протестирую.
Neo_ вне форума  
 
Непрочитано 21.01.2010, 09:29
#7
Do$

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


Можно изменить функцию fun_get-subent
Строчку:
Код:
[Выделить все]
(fun_get-subent (vla-item (vla-get-blocks adoc) (vla-get-name ent)))
Заменить на:
Код:
[Выделить все]
 
(cons ent (fun_get-subent (vla-item (vla-get-blocks adoc) (vla-get-name ent))))
То есть добавить указатели на вложенные блоки.
Тогда получится вместо списка:
Код:
[Выделить все]
 
(<примитив_№1> 
<примитив_№2> ... 
(<примитив_вложенного_блока_№1.1> <примитив_вложенного_блока_№1.1>)
...)
Список:
Код:
[Выделить все]
 
(<примитив_№1> 
<примитив_№2> ... 
(<вложенный_блок_№1> <примитив_вложенного_блока_№1.1> <примитив_вложенного_блока_№1.1>)
...)
ИМХО, такой список правильнее и проще анализировать.
Do$ вне форума  
 
Непрочитано 21.01.2010, 09:31
#8
Кулик Алексей aka kpblc
Moderator

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


Do$, да, верно. Меня тут отвлекли, вот и я и накосячил
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.01.2010, 21:47
#9
Neo_

матрица
 
Регистрация: 06.04.2006
Сообщений: 401


блиинн мне нужен размер в блоке, он по вашей проге идет 20м, но когда я начинаю идти entnext то прохожу только 6 вложений и упираюсь в последнее 7-е "SEQEND" , что за чудная штука не понял, далее не видит и начинает материться, блок динамический, т.е. растягивается и соотв. размер мне нужно снять с него значение, а вот выудить его не могу никак в мутной луже блока, хотя ваша замечательная прога показала все элементы в блоке...

Последний раз редактировалось Neo_, 21.01.2010 в 21:53.
Neo_ вне форума  
 
Непрочитано 21.01.2010, 23:06
#10
Кулик Алексей aka kpblc
Moderator

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


Фильтруй объекты по имени (*Dimension*), и потом смотри уже его свойства (например, Measurement)
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.01.2010, 08:53
#11
Do$

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


Цитата:
Сообщение от Neo_ Посмотреть сообщение
блиинн мне нужен размер в блоке, он по вашей проге идет 20м, но когда я начинаю идти entnext то прохожу только 6 вложений и упираюсь в последнее 7-е "SEQEND" , что за чудная штука не понял, далее не видит и начинает материться, блок динамический, т.е. растягивается и соотв. размер мне нужно снять с него значение, а вот выудить его не могу никак в мутной луже блока, хотя ваша замечательная прога показала все элементы в блоке...
В таком случае, может быть будет проще считывать значение динамического параметра?
Для примера код и файлик для его проверки:
Код:
[Выделить все]
(defun c:test ()
  (GetDynamicBlockPropertyNameValue
    (vlax-ename->vla-object
      (car (entsel "\nУкажите дин. блок:"))
    ) ;_ end of vlax-ename->vla-object
    "Distance"
  ) ;_ end of GetDynamicBlockPropertyNameValue
) ;_ end of defun
 
(defun GetDynamicBlockPropertyList (obj / lstProperties)
;;;  Взято без изменений с
;;;  http://forum.abok.ru/index.php?showt...dpost&p=171367
  (if (and (vlax-property-available-p obj "IsDynamicBlock")
    (= (vla-get-IsDynamicBlock obj) :vlax-true)
    (setq lstProperties
    (vlax-safearray->list
      (variant-value
        (vla-GetDynamicBlockProperties obj)
      ) ;_ end of variant-value
    ) ;_ end of vlax-safearray->list
    ) ;_ end of setq
      ) ;_ end of and
    (progn
      (mapcar '(lambda (x)
   (list (vla-get-propertyname X)
         (variant-value (vla-get-value X))
         x
   ) ;_ end of list
        ) ;_ end of lambda
       lstProperties
      ) ;_ end of mapcar
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun
 
(defun GetDynamicBlockPropertyNameValue (obj PropertyName / Plist)
;;;  Взято без изменений с
;;;  http://forum.abok.ru/index.php?showt...dpost&p=171367
  (and
    (setq PropertyName (strcase PropertyName))
    (setq Plist (GetDynamicBlockPropertyList obj))
    (setq Plist (car (vl-remove-if-not
         '(lambda (x)
     (= (strcase (car x)) PropertyName)
   ) ;_ end of lambda
         Plist
       ) ;_ end of vl-remove-if-not
  ) ;_ end of car
    ) ;_ end of setq
  ) ;_ end of and
  (cadr Plist)
) ;_ end of defun
Вложения
Тип файла: dwg
DWG 2004
Neo_.dwg (26.4 Кб, 644 просмотров)
Do$ вне форума  
 
Автор темы   Непрочитано 23.01.2010, 10:43
#12
Neo_

матрица
 
Регистрация: 06.04.2006
Сообщений: 401


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Фильтруй объекты по имени (*Dimension*), и потом смотри уже его свойства (например, Measurement)

А мне нужно только 2 размера их порядок расположения неизменен.
Цитата:
(setq dd (car blok))
(setq 1yk (cdr
(assoc 42 (entget (vlax-vla-object->ename (nth 32 res))))
)
1yk (rtos 1yk 2 0)
1yk (cons 1 1yk)
1dk (cdr
(assoc 42 (entget (vlax-vla-object->ename (nth 20 res))))
)
1dk (rtos 1dk 2 0)
1dk (cons 1 1dk)
)
и далее запихиваю уже в этот же блок но почмуто только через лисп обьект, а не вба


Цитата:
(setq 11yk (entnext dd)

12yk (entnext (entnext dd))
11dk (entnext (entnext (entnext dd)))
12dk (entnext (entnext (entnext (entnext dd))))
)
(setq 11yk (subst 1yk
(assoc 1 (entget 11yk))
(entget 11yk) ))
(setq 12yk (subst 1yk
(assoc 1 (entget 12yk))
(entget 12yk) ))
(setq 11dk (subst 1dk
(assoc 1 (entget 11dk))
(entget 11dk) ))
(setq 12dk (subst 1dk
(assoc 1 (entget 12dk))
(entget 12dk) ))
(entmod 11dk)
(entmod 12dk)(entmod 11yk)(entmod 12yk)

(entmod (entget dd))
а вот так вот не получается (значение меняеться в списке DD и res. а на экране и в блоке нет:
Цитата:
(entmod (subst 1yk (assoc 1 (entget(vlax-vla-object->ename (nth 0 res))))
(entget(vlax-vla-object->ename (nth 0 res))) ))

Do$
Спасибо, сегодня прокручу ваш вариант.
Neo_ вне форума  
 
Непрочитано 23.01.2010, 22:10
#13
Кулик Алексей aka kpblc
Moderator

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


Neo_, приведи пример своего блока (в смысле - в dwg ). И укажи, чего надо получать и менять. А то я что-то не понимаю.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.01.2010, 10:51
#14
Neo_

матрица
 
Регистрация: 06.04.2006
Сообщений: 401


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Neo_, приведи пример своего блока (в смысле - в dwg ). И укажи, чего надо получать и менять. А то я что-то не понимаю.
Ну дык все получилось уже. Блок еще не доработан но лисп работает, можно конечно считывать динамический параметр но , там есть но.

Единственное, нет смысла перебирать все подпримитивы и вбивать их в res когда уже знаешь, но я не знаю как добраться до 20 и 32 (размеров).

Код:
[Выделить все]
(vl-load-com)

(defun test (/ adoc ent blok)
  (setq blok (entsel "\nУкажите блок <Отмена> : "))
  (defun fun_get-subent	(blk / lst)
    (vlax-for ent blk
      (setq
	lst (cons
	      (if (= (vla-get-objectname ent) "AcDbBlockReference")
		(fun_get-subent
		  (vla-item (vla-get-blocks adoc) (vla-get-name ent))
		)
		ent
	      ) ;_ end of if
	      lst
	    ) ;_ end of cons
      ) ;_ end of setq
    ) ;_ end of vlax-for
    (reverse lst)
  ) ;_ end of defun

  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (if (and (= (type (setq ent (vl-catch-all-apply
				(function
				  (lambda ()
				    (car blok)
				  ) ;_ end of lambda
				) ;_ end of function
			      ) ;_ end of vl-catch-all-apply
		    ) ;_ end of setq
	      ) ;_ end of type
	      'ename
	   ) ;_ end of =
	   (= (cdr (assoc 0 (entget ent))) "INSERT")
	   (setq ent (vlax-ename->vla-object ent))
      ) ;_ end of and
    (progn
      (setq res	(fun_get-subent
		  (vla-item (vla-get-blocks adoc) (vla-get-name ent))
		)
      )
    ) ;_ end of progn
  ) ;_ end of if


  (setq dd (car blok))
  (setq	1yk (cdr
	      (assoc 42 (entget (vlax-vla-object->ename (nth 32 res))))
	    )
1yk (rtos 1yk 2 0)
	1yk (cons 1 1yk)
	1dk (cdr
	      (assoc 42 (entget (vlax-vla-object->ename (nth 20 res))))
	    )
	1dk (rtos 1dk 2 0)
	1dk (cons 1 1dk)
  )

					;(setq yk (subst 2yk (assoc 1 (entget(vlax-vla-object->ename (nth 0 res))))
					;(entget(vlax-vla-object->ename (nth 0 res))) ))
(setq 11yk (entnext dd)

      12yk (entnext (entnext dd))
      11dk (entnext (entnext (entnext dd)))
      12dk (entnext (entnext (entnext (entnext dd))))
)
(setq 11yk (subst 1yk
		  (assoc 1 (entget 11yk))
		  (entget 11yk)	   ))
(setq 12yk (subst 1yk
		  (assoc 1 (entget 12yk))
		  (entget 12yk)	   ))
(setq 11dk (subst 1dk
		  (assoc 1 (entget 11dk))
		  (entget 11dk)	   ))
(setq 12dk (subst 1dk
		  (assoc 1 (entget 12dk))
		  (entget 12dk)	   ))
(entmod 11dk)
  (entmod 12dk)(entmod 11yk)(entmod 12yk)

(entmod (entget dd))
)
Вложения
Тип файла: dwg
DWG 2007
блок moy.dwg (135.8 Кб, 636 просмотров)

Последний раз редактировалось Кулик Алексей aka kpblc, 24.01.2010 в 22:06.
Neo_ вне форума  
 
Непрочитано 24.01.2010, 23:03
#15
Кулик Алексей aka kpblc
Moderator

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


Я говорил про варианты:
Код:
[Выделить все]
(vl-load-com)

(defun test-ent (/ ent res)
  (if (= (type (setq ent (vl-catch-all-apply
                           (function
                             (lambda ()
                               (ssname (ssget "_:S" '((0 . "INSERT"))) 0)
                               ) ;_ end of lambda
                             ) ;_ end of function
                           ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'ename
         ) ;_ end of =
    (progn
      (setq res (mapcar
                  (function vlax-vla-object->ename)
                  (vl-remove-if-not
                    (function
                      (lambda (x)
                        (wcmatch (strcase (vla-get-objectname x)) "*DIMEN*")
                        ) ;_ end of lambda
                      ) ;_ end of function
                    ((lambda (/ lst)
                       (vlax-for item (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                                                (cdr (assoc 2 (entget ent)))
                                                ) ;_ end of vla-item
                         (setq lst (cons item lst))
                         ) ;_ end of vlax-for
                       ) ;_ end of lambda
                     )
                    ) ;_ end of vl-remove-if-not
                  ) ;_ end of mapcar
            ) ;_ end of setq
      ) ;_ end of progn
    ) ;_ end of if
  res
  ) ;_ end of defun

(defun test-vla (/ ent res)
  (if (= (type (setq ent (vl-catch-all-apply
                           (function
                             (lambda ()
                               (ssname (ssget "_:S" '((0 . "INSERT"))) 0)
                               ) ;_ end of lambda
                             ) ;_ end of function
                           ) ;_ end of vl-catch-all-apply
                     ) ;_ end of setq
               ) ;_ end of type
         'ename
         ) ;_ end of =
    (progn
      (setq res (vl-remove-if-not
                  (function
                    (lambda (x)
                      (wcmatch (strcase (vla-get-objectname x)) "*DIMEN*")
                      ) ;_ end of lambda
                    ) ;_ end of function
                  ((lambda (/ lst)
                     (vlax-for item (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                                              (cdr (assoc 2 (entget ent)))
                                              ) ;_ end of vla-item
                       (setq lst (cons item lst))
                       ) ;_ end of vlax-for
                     ) ;_ end of lambda
                   )
                  ) ;_ end of vl-remove-if-not
            ) ;_ end of setq
      ) ;_ end of progn
    ) ;_ end of if
  res
  ) ;_ end of defun
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.01.2010, 19:49
#16
Neo_

матрица
 
Регистрация: 06.04.2006
Сообщений: 401


О прекрасно! Спасибо! Я ж просто не парю пока еще в (vl-load-com)
а только на детском уровне лисп.
Neo_ вне форума  
 
Непрочитано 25.01.2010, 19:53
#17
Кулик Алексей aka kpblc
Moderator

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


Да ну, там все просто. Если с mapcar трудностей нет, то код становится прозрачным как слеза
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как вывести список всех подпримитивов блока или др. элемента.

Система Техэксперт дает уверенность в правильности и эффективности принимаемых инженерных решений!
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как массово изменить текстовый стиль у всех атрибутов блока? Shaft AutoCAD 7 31.10.2017 12:05
Как преобразовать список в строку ivspec Программирование 11 18.03.2015 10:18
Мониторы LCD CRT Разное 94 17.06.2008 10:51
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47
БРЕД СИВОЙ КОБЫЛЫ Kryaker Разное 1876 29.12.2006 23:41