Forge, API и программирование – Русский – только для чтения
Задавайте вопросы и делитесь знаниями по Autodesk Forge и программированию на API программного обеспечения Autodesk
отмена
Отображаются результаты для 
Показать  только  | Вместо этого искать 
Вы имели в виду: 

ДОСТУП К ВЛОЖЕННЫМ БЛОКАМ

6 ОТВЕТ 6
РЕШЕНО
Ответить
Сообщение 1 из 7
Anonymous
947 просмотров, 6 ответов

ДОСТУП К ВЛОЖЕННЫМ БЛОКАМ

Подскажите пожалуйста, можно ли, и как методами VLisp получить доступ к вложенному блоку (блок в блок) (имя, атрибуты, текст и т.п.)

 

С внешним блоком проблем не возникает.

 

АТЭКСП и извлечение данных видят всю иерархию блока без вопросов, включая вложенные блоки.

 

Поиск на просторах сети дает на данный момент некие рекурсивные методы.

 

Нет ли простого и изящного решения для доступа к вложенному/вложенным блокам и получения данных из них?

6 ОТВЕТ 6
Сообщение 2 из 7
kpblc2000
в ответ: Anonymous

Во-первых, "И незачем так орать" - это к вопросу о CapsLock
Во-вторых, получаешь указатель на вхождение блока, из него - указатель на описание блока, проходишь по всем примитивам описания и фильтруешь по имени / типу примитива.

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.


Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library

Сообщение 3 из 7
Anonymous
в ответ: kpblc2000

Насчет CapsLock извиняюсь, привычка писать заголовки в верхнем регистре. Прошу прощения.

 

Если можно: как получить из "указатель из вхождения блока" - "указатель на описание блока"? (проход по примитивам описания уже сам)

 

 

Сообщение 4 из 7
kpblc2000
в ответ: Anonymous

Зависит от используемого метода - ename или ActiveX
Для ename: (tblobjname "block" (cdr (assoc 2 (entget (car (entsel)))))), если не вру
Для ActiveX: (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vla-get-name (vlax-ename->vla-object (car (entsel)))))

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.


Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library

Сообщение 5 из 7
Anonymous
в ответ: kpblc2000

Написал не сам, взял отсюда -> http://forum.dwg.ru/showthread.php?t=61754 Автор Кулик Алексей 🙂

 

Насколько я понимаю вот это верно:

 

(vl-load-com)

;;; Запросить у пользователя указать на блок
(setq ent (vlax-ename->vla-object (car (entsel "\nSelect block : "))))

;;; Получить vla-указатель на описание блока
(setq block_def (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                          (vla-get-effectivename ent)
                          ) ;_ end of vla-item
      ) ;_ end of setq

;;; Получить список всех примитивов, входящих в блок
(setq block_cont ((lambda (/ res)
                    (vlax-for sub block_def
                      (setq res (cons sub res))
                      ) ;_ end of vlax-for
                    (reverse res)
                    ) ;_ end of lambda
                  )
      ) ;_ end of setq

;;; Отфильтровать все примитивы, из состава указанного блока, которые не являются блоком
(setq result_ent (vl-remove-if-not
                   (function
                     (lambda (x)
                       (= (vla-get-objectname x) "AcDbBlockReference")
                       ) ;_ end of lambda
                     ) ;_ end of function
                   block_cont
                   ) ;_ end of vl-remove-if-not
      ) ;_ end of setq

Сообщение 6 из 7
kpblc2000
в ответ: Anonymous

Тут есть один момент (хотя автор и я, но тем не менее): есть разница между эффективным именем блока и его реальным именем. Особенно сильно это касается дин.блоков. А так, в принципе, подход ничем не отличается...

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.


Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library

Сообщение 7 из 7
Anonymous
в ответ: kpblc2000

Благодарю. Решение вопроса ясно. Проведу ряд экспериментов для решения своей локальной задачи.

Не нашли то, что искали? Задайте вопросы в сообществе или поделитесь своими знаниями.

Новая тема  

Autodesk Design & Make Report