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

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

Как lisp-ом вывести список вхождений блоков?

Ответ
Поиск в этой теме
Непрочитано 21.08.2012, 18:28 #1
Как lisp-ом вывести список вхождений блоков?
Unfamous
 
Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133

Пытаюсь написать первый свой лисп. Идея такова: есть на чертеже вхождения блоков, требуется их заменить (redefine) блоками, которые находяться в файлах, из определенной папки (с подпапками). Имя вхождения = имя блока из файла.

Первое, что получилось сделать после прочтения хелпа и форума, это замена одного конкретного блока:
Код:
[Выделить все]
 
(defun rpblock ( / blk_name path)
(setq blk_name "01-01.521")
(setq path "D:\\lisp_training\\01-01.521.dwg")
(command "INSERT" (strcat blk_name "=" path) \e)
)
Далее решил попробовать вывести весь список блоков в чертеже:
Код:
[Выделить все]
 (setq blk (tblnext "block" 0))
(while blk
(setq name_blk (cdr (assoc 2 blk)))
(setq lst (append (list lst) (list name_blk)))
(setq blk (tblnext "block"))
  (princ)
  )
Код вышел ужасным. Не могу никак добиться того, что хочу. Как загнать "куда-то" список вхождений блока для дальнейшей обработки? Натолкните на мысль, плиз...

З.Ы. Для поиска нужного файла в папке нашел на форуме этот скрипт.
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук
Просмотров: 3813
 
Непрочитано 21.08.2012, 19:22
#2
Кулик Алексей aka kpblc
Moderator

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


Если надо перечень описаний блоков, то можно и так, как у тебя, и этак:
Код:
[Выделить все]
 (vl-load-com)

(defun get-block-definitions (/ res name)
  (vlax-for blk_def (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
    (if (not
          (member (setq name (cond
                               ((vlax-property-available-p blk_def 'effectivename) (vla-get-effectivename blk_def))
                               (t (vla-get-name blk_def))
                               ) ;_ end of cond
                        ) ;_ end of setq
                  res
                  ) ;_ end of member
          ) ;_ end of not

      (setq res (cons name res))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vl-sort res '<)
  ) ;_ end of defun
Или надо список именно вхождений блоков?
---
Добавлено: для получения вхождений всех блоков, включая их вхождения внутрь других блоков (я не обрабатывал внешние ссылки) можно использовать нечто типа
Код:
[Выделить все]
 (vl-load-com)

(defun get-block-references (/ res name)
  (vlax-for space (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object)))
    (vlax-for ent space
      (if (wcmatch (strcase (vla-get-objectname ent)) "*BLOCK*")
        (setq
          res (cons (list (cons "obj" ent)
                          (cons "name"
                                (cond
                                  ((vlax-property-available-p blk_def 'effectivename) (vla-get-effectivename blk_def))
                                  (t (vla-get-name blk_def))
                                  ) ;_ end of cond
                                ) ;_ end of cons
                          (cons "layer" (vla-get-layer ent))
                          (cons "ins" (vlax-safearray->list (vlax-variant-value (vla-get-insertionpoint ent))))
                          (cons "ang" (vla-get-rotation ent))
                          ) ;_ end of list
                    res
                    ) ;_ end of cons
          ) ;_ end of setq
        ) ;_ end of if
      ) ;_ end of vlax-for
    ) ;_ end of vlax-for
  (vl-sort res (function (lambda (a b) (< (cdr (assoc "name" a)) (cdr (assoc "name" b))))))
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.08.2012, 10:18
#3
Unfamous

Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133


Эх, ни строчки непонятно Буду разбираться, спасибо! Я как понимаю, без ActiceX функций не обойтись?
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук
Unfamous вне форума  
 
Непрочитано 22.08.2012, 10:23
#4
Кулик Алексей aka kpblc
Moderator

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


Это просто мне проще с ActiveX работать...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.08.2012, 17:27
#5
VVA

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


Код:
[Выделить все]
;;;================================================================================
;;;Written By Michael Puckett. 
;;;Список элементов символьных таблиц АвтоКАДа 
;;; - s- имя таблицы
;;;Пример - список всех слоев - (setq all_layers (tablelist "LAYER"))
;;;(setq all_layers (tablelist "LAYER"))
;;;
;;;AutoLisp should return something like this :
;;;Start Coding Here 
    (defun tablelist (s / d r)
      (while (setq d (tblnext s (null d)))
        (setq r (cons (cdr (assoc 2 d)) r))
      );_ while
    );_ defun
;;;End Coding Here

Цитата:
Сообщение от Unfamous Посмотреть сообщение
Как загнать "куда-то" список вхождений блока для дальнейшей обработки?
То есть если у тебя есть 2 вхождения блока "A", то ты дважды собираешься его переопределять?
Правильнее формировать список имен всех блоков из описания блоков (tablelist "BLOCK"), вызывать команду Insert как ты и делаешь. Для вызова ESC достаточно сделать так: (command)
Код:
[Выделить все]
(command "INSERT" (strcat blk_name "=" path))(command)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 22.08.2012, 18:42
#6
Unfamous

Визайнер-дизуализатор в отставке
 
Регистрация: 12.11.2009
Сообщений: 133


Оу еееее!

VVA, спасибо! Пару строчек и готово) Я приблизительно что-то подобное и имел ввиду)

Раскурю ваш код и буду его дополнять: надо исключить вложенные (nested) и не вставленные блоки.
__________________
Жизнь не сахар, а смерть нам не чай... © Ю.Шевчук
Unfamous вне форума  
 
Непрочитано 23.08.2012, 09:22
#7
VVA

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


Цитата:
Сообщение от Unfamous Посмотреть сообщение
надо исключить вложенные (nested) и не вставленные блоки
Nested Blocks AUGI
nested blocks Autodesk Discussion Groups
Extract Nested Block Lee Mac
Учти, что в таблице блоков описываются так же и внешние ссылки. Плюс динамические блоки имеют эффективное имя. Оно отличается от того, что находится в поле 2. До эффективного имени можно докопаться и без vla-методов
Имена динамических блоков
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как lisp-ом вывести список вхождений блоков?

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Очистка рисунка от "пустых" блоков Makswell Готовые программы 15 26.10.2022 15:24
Извлечение атрибутов из блоков в список proektant-minsk Программирование 10 28.01.2012 13:10
LISP получить список установленных в системе (векторных) шрифтов или хотя бы узнать, установлен ли указанный Ax3 LISP 9 08.02.2011 14:11
Тормозит команда расчленения набора блоков batmax Программирование 4 31.08.2010 17:37
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47