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

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

Выбор блоков на листе через lisp

Ответ
Поиск в этой теме
Непрочитано 02.01.2020, 19:56 #1
Выбор блоков на листе через lisp
crosandr
 
Инженер-строитель
 
Санкт-Петербург
Регистрация: 09.07.2010
Сообщений: 1,988

Требуется на листе чертежа выбрать все блоки по с именем по маске (типа "Блок_", "Блок_1" и т.п.). Блоки динамические. Наборами не получается, т.к. выделяет блоки из всей базы чертежа, а мне нужно только на текущем листе. Объекты на модели не нужны.
Попробовал конструкцию типа
Код:
[Выделить все]
 (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*")
        (princ ent)
   )
  )
)
затыкается почему-то на втором vlax-for
Спасибо.
Просмотров: 1948
 
Непрочитано 02.01.2020, 20:08
#2
Кулик Алексей aka kpblc
Moderator

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


Потому что у space есть Block, по которому собственно и надо проходить. И princ, кстати, по идее не должен срабатывать.
И кто мешает через ssget, например, пройтись? Ну или нечто типа:
Код:
[Выделить все]
 (vl-load-com)
(defun t1 (/ lst adoc def)
  (vlax-for space (vla-get-layouts (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
    (if (and (setq def (vla-block space)) (not (equal def (vla-get-modelspace adoc))))
      (vlax-for ent def
        (if (and (wcmatch (strcase (vla-get-objectname ent)) "*BLOCK*")
                 (wcmatch (strcase (vla-get-effectivename ent)) "ÁËÎÊ_*")
                 ) ;_ end of and
          (setq lst (cons ent lst))
          ) ;_ end of if
        ) ;_ end of vlax-for
      ) ;_ end of if
    ) ;_ end of vlax-for
  lst
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.01.2020, 20:59
#3
VVA

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


Пробуй. Подсвечивает найденные блоки
Код:
[Выделить все]
 
(setq bname "Блок_*")
(setq ss nil ss (ssadd))
(vlax-for obj (vla-get-block(vla-item (vla-get-Layouts(vla-get-activedocument (vlax-get-acad-object)))(getvar "CTAB")))
  (if (and (vlax-property-available-p obj 'effectivename)
           (wcmatch (vla-get-EffectiveName obj) bname)
           )
    (ssadd (vlax-vla-object->ename obj) ss)
    )
  )
(SSSETFIRST nil ss)



----- добавлено через ~7 мин. -----
Еще вариант - маска имени ssget со всеми анонимными представлениями блока. Ищи функцию на форуме AnonymousInstancesof и читай у Lee Mac'a Get Anonymous References и здесь Automatically filling out the Drawing Property from Titleblock Information
Пример - https://forum.dwg.ru/showthread.php?...60#post1099760 (если почитать тему дальше есть вариант от Эдуарда)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 02.01.2020 в 21:12.
VVA вне форума  
 
Автор темы   Непрочитано 03.01.2020, 14:09
#4
crosandr

Инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,988


VVA, спасибо. Код работает, блок подсвечивает. Получилось-таки добраться до него
Алексей, код спотыкался на функции vla-block
Код:
[Выделить все]
 (setq def (vla-block space))
Заменил vla-block на vla-get-block и заработало.
Только я не смог найти в справке, что делает функция vla-get-block. Судя по названию, она должна возвращать коллекцию блоков, но при пошаговом контроле перебор шел не только по блокам, но еще и по другим примитивам на листе.
crosandr вне форума  
 
Непрочитано 03.01.2020, 23:25
#5
Кулик Алексей aka kpblc
Moderator

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


Да, сорян, описочка вышла.
Цитата:
Сообщение от crosandr Посмотреть сообщение
что делает функция vla-get-block
У пространства листа есть его блок. И внутри этого блока уже располагаются ВЭ и все примитивы внутри листа. Точно так же, как для пространства модели есть свой блок.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Выбор блоков на листе через lisp

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как через лисп произвести быcтрый выбор объектов Project studio? kurstep LISP 22 27.10.2014 12:34
Сложная автонумерация нескольких блоков в LISP DrBerD LISP 11 19.09.2014 10:39
LISP. Сумма значений аттрибутов блоков. dirge LISP 8 16.07.2012 19:05
Не обновляется нединамическая геометрия динамических блоков через Design Center c опцией Redifine Vova Баги и пожелания в Autodesk 4 18.11.2009 04:48
Проблема копирования дин. блоков с многстроч. атрибутами через буфер обмена kp+ AutoCAD 7 21.10.2009 22:23