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

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

Выбор блоков во всем чертеже по маске имени

Ответ
Поиск в этой теме
Непрочитано 28.04.2023, 21:13 #1
Выбор блоков во всем чертеже по маске имени
Сыч
 
Регистрация: 05.04.2011
Сообщений: 43

Здравствуйте.
Возникла необходимость одновременного выбора блоков, разбросанных по разным листам чертежа и при этом имеющих разные (но схожие имена). Быстрый выбор эту задачу решает только в пределах одного листа или только в модели. SIAF выбирает во всем чертеже, но только одно наименование. В итоге поиск в сети готового решения результатов не дал.
Написал пару лиспов, которые решают эту задачу.
Первый выбирает блоки по маске имени во всем чертеже:
Код:
[Выделить все]
 (defun c:vibor_blokov (/ fragment vsebloki k_vsebloki nuzhnie_bloki n blok1 vla_blok1 imya_blok1)
  
  (vl-load-com)
  
  (setq k_vsebloki 0)                                                                       ; задание начальных значений
  (setq nuzhnie_bloki (ssadd))                                                              ; задание начальных значений
  (setq n 0)                                                                                ; задание начальных значений
  
  (setq fragment (getstring T "\nВведите искомый фрагмент имени блоков: "))                 ; получение фрагмента имени блоков, по которым будет осуществляться поиск
  
  (if (= fragment "")
    (progn (princ "\nФрагмент имени не задан! Что же мы ищем?..") (princ))                  ; выход, если фрагмент имени не задан
    
    (progn
      (setq vsebloki (ssget "_X" '((0 . "INSERT"))))                                        ; выбирает все блоки на чертеже
      
      (if vsebloki                                                                          ; если все блоки выбраны
        (progn
          (setq k_vsebloki (sslength vsebloki))                                             ; подсчёт количества выбранных блоков
          (repeat k_vsebloki
            
            (setq blok1 (ssname vsebloki n))                                                ; вычленение блока из набора
            (setq vla_blok1 (vlax-ename->vla-object blok1))                                 ; преобразование блока в VLA-объект
            (setq imya_blok1 (vla-get-effectivename vla_blok1))                             ; получение имени блока
            
            (if (wcmatch (strcase imya_blok1 T) (strcase fragment T))                       ; проверка наличия искомого фрагмента в имени блока
              (ssadd blok1 nuzhnie_bloki)                                                   ; формирование списка нужных блоков          
            )
            
            (setq n (1+ n))                                                                 ; щёлкнул счётчик
          )
          
          (sssetfirst nil nuzhnie_bloki)                                                    ; выделение списка нужных блоков
          (princ "\n")
          
          (if (= (sslength nuzhnie_bloki) 0)
             (progn (princ "\nН-н-да... Скудноватый выбор... Ничего подходящего.") (princ))
             (progn (princ (strcat "\nУдачно зашёл! Ажно " (itoa (sslength nuzhnie_bloki)) " шт. нашлось!")) (princ))
          )
        )
        
        (progn (princ "\nБлоков не нашлось. А существуют ли они вообще?..") (princ))        ; выход, если в чертеже нет блоков
      )
    )
  )
)
----- добавлено через ~3 мин. -----
Второй выполняет выбор блоков только в листах:
Код:
[Выделить все]
 (defun c:vibor_blokov_list (/ fragment vsebloki k_vsebloki nuzhnie_bloki n blok1 vla_blok1 imya_blok1)
  
  (vl-load-com)
  
  (setq k_vsebloki 0)                                                                                                          ; задание начальных значений
  (setq nuzhnie_bloki (ssadd))                                                                                                 ; задание начальных значений
  (setq n 0)                                                                                                                   ; задание начальных значений
  
  (setq fragment (getstring T "\nВведите искомый фрагмент имени блоков: "))                                                    ; получение фрагмента имени блоков, по которым будет осуществляться поиск
  
  (if (= fragment "")
    (progn (princ "\nФрагмент имени не задан! Что же мы ищем?..") (princ))                                                     ; выход, если фрагмент имени не задан
    
    (progn
      (setq vsebloki (ssget "_X" '((-4 . "<AND") (0 . "INSERT") (-4 . "<NOT") (410 . "Model") (-4 . "NOT>") (-4 . "AND>"))))   ; выбирает все блоки на листах
      
      (if vsebloki                                                                                                             ; если все блоки выбраны
        (progn
          (setq k_vsebloki (sslength vsebloki))                                                                                ; подсчёт количества выбранных блоков
          (repeat k_vsebloki
            
            (setq blok1 (ssname vsebloki n))                                                                                   ; вычленение блока из набора
            (setq vla_blok1 (vlax-ename->vla-object blok1))                                                                    ; преобразование блока в VLA-объект
            (setq imya_blok1 (vla-get-effectivename vla_blok1))                                                                ; получение имени блока
            
            (if (wcmatch (strcase imya_blok1 T) (strcase fragment T))                                                          ; проверка наличия искомого фрагмента в имени блока
              (ssadd blok1 nuzhnie_bloki)                                                                                      ; формирование списка нужных блоков          
            )
            
            (setq n (1+ n))                                                                                                    ; щёлкнул счётчик
          )
          
          (sssetfirst nil nuzhnie_bloki)                                                                                       ; выделение списка нужных блоков
          (princ "\n")
          
          (if (= (sslength nuzhnie_bloki) 0)
             (progn (princ "\nН-н-да... Скудноватый выбор... Ничего подходящего.") (princ))                                    ; окончание, если подходящих блоков не найдено
             (progn (princ (strcat "\nУдачно зашёл! Ажно " (itoa (sslength nuzhnie_bloki)) " шт. нашлось!")) (princ))          ; окончание, если подходящие блоки найдены
          )
        )
        
        (if (not (ssget "_X" '((0 . "INSERT"))))
          (progn (princ "\nБлоков нигде не видно. А существуют ли они вообще?..") (princ))                                     ; выход, если в чертеже нет блоков
          (progn (princ "\nТак а на листах-то блоков нету! Чего выделять-то?..") (princ))                                      ; выход, если на листах нет блоков
        )
      )  
    )
  )
)
Всесторонне маску не тестировал, но со * однозначно работает: пишете прямо в запрос *искомый фрагмент имени блока*.

Последний раз редактировалось Сыч, 28.04.2023 в 21:20.
Просмотров: 1331
 
Непрочитано 28.04.2023, 22:01
#2
Кулик Алексей aka kpblc
Moderator

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


А что ты хочешь с этим набором делать в результате?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.04.2023, 07:34
#3
1958


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
что ты хочешь с этим набором делать в результате?
Да что угодно! Элементарно удалить их на фиг. Такой выбор по маске имени добавить бы в SelSim А.Ривилиса было бы классно!
1958 вне форума  
 
Непрочитано 29.04.2023, 07:39
#4
Кулик Алексей aka kpblc
Moderator

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


Так проходи по составу каждого блока, находишь по своему фильтру что надо, удаляешь. Ну и по маске ты гарантированно не найдешь вхождения измененных динамических блоков.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 29.04.2023, 16:40
#5
Сыч


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


Выделяю все блоки везде, затем отправляю их данные atout'ом в txt. Ещё пакетно изменяю атрибуты в свойствах. Ну а вообще да, много чего можно делать.
А вот взорвать разом все блоки после выделения не получается: рвутся только блоки в текущем пространстве.
Изменённые динамические блоки эти лиспы тоже выделяют, проверено.
Сыч вне форума  
 
Непрочитано 30.04.2023, 13:35
#6
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 470


Цитата:
А вот взорвать разом все блоки после выделения не получается: рвутся только блоки в текущем пространстве.
А что мешает изменить пространство перед "взрыванием"? Взял очередной блок,
проверил его пространство. Не совпало с текущим - изменил текущее. "Взорвал".
Берём следующий...

В конце цикла можно вернуться в предварительно запомненное "исходное пространство".
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 30.04.2023, 16:20
#7
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,680


vla-explode взрывает объекты в любом пространстве, в текущем и не в текущем.
__________________
K Lisp
koMon вне форума  
 
Непрочитано 30.04.2023, 18:24
#8
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сыч Посмотреть сообщение
А вот взорвать разом все блоки после выделения не получается: рвутся только блоки в текущем пространстве.
Если командой, то да, И кто мешает применять vla-explode или burst-one - загадка. Правда, там придется голову немного включить на предмет отлова ошибок и блокировок слоев.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.04.2023, 19:20
#9
Сыч


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
А что мешает изменить пространство перед "взрыванием"?
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
И кто мешает применять vla-explode или burst-one - загадка.
Никто и ничто не мешает, но лиспы создавались не для это, а для чего, я написал, обозначив при этом ограничение. Ну и лиспы по подрыву блоков во всех пространствах на форуме уже есть.
Сыч вне форума  
 
Непрочитано 30.04.2023, 19:40
#10
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сыч Посмотреть сообщение
Ну и лиспы по подрыву блоков во всех пространствах на форуме уже есть.
Конечно есть! Но перед собственно взрывом перечень объектов же как-то формируется? Может, именно там и лежит решение твоей задачи?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 01.05.2023, 08:03
#11
Сыч


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Может, именно там и лежит решение твоей задачи?
Я ж написал в первом посте, что не нашёл решения в сети (не только на этом форуме). Ну а дальше, как говорится, ифюкэнхелпюселф.
Собственно, мои задачи представленные лиспы выполняют как задумано. Может и ещё кому-то сгодятся.

Последний раз редактировалось Сыч, 01.05.2023 в 18:18.
Сыч вне форума  
 
Непрочитано 03.05.2023, 13:05
#12
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Сообщение от Сыч Посмотреть сообщение
Я ж написал в первом посте, что не нашёл решения в сети (не только на этом форуме)
Как взорвать все блоки на листах разом ALLSPACESBURST ARMAGEDON
explode all blocks от Lee Mac'a
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 03.05.2023, 18:09
#13
Сыч


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


Так, толи лыжи не едут, толи...
Мне НЕ НАДО взрывать все блоки в чертеже, вообще НИКОГДА не было надо. Мне надо их ТОЛЬКО ВЫДЕЛИТЬ. Что я с ними собираюсь потом делать, я описал выше.
И написанные мной лиспы мою задачу полностью выполняют - ТОЛЬКО ВЫДЕЛЯЮТ БЛОКИ ВЕЗДЕ. И да, я отметил, что взорвать все выделенные блоки разом стандартной командой не получится, но мне это и НЕ НАДО. Это не недоработка лиспов, это просто нюанс, на который я обратил внимание. Почему все дружно зацепились за это, для меня загадка.
Как минимум первую тему из предложенных я читал и не нашёл там решения своей задачи. Может быть был невнимателен, но каяться и платить не буду.
Вот здесь поднимался вопрос https://forum.dwg.ru/showthread.php?t=154420 с отсылом вот сюда https://www.cadtutor.net/forum/topic...comment-516364.

Последний раз редактировалось Сыч, 03.05.2023 в 18:16.
Сыч вне форума  
 
Непрочитано 03.05.2023, 22:29
#14
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сыч Посмотреть сообщение
Так, толи лыжи не едут, толи...
Мне НЕ НАДО взрывать все блоки в чертеже, вообще НИКОГДА не было надо. Мне надо их ТОЛЬКО ВЫДЕЛИТЬ. Что я с ними собираюсь потом делать, я описал выше.
И написанные мной лиспы мою задачу полностью выполняют - ТОЛЬКО ВЫДЕЛЯЮТ БЛОКИ ВЕЗДЕ. И да, я отметил, что взорвать все выделенные блоки разом стандартной командой не получится, но мне это и НЕ НАДО. Это не недоработка лиспов, это просто нюанс, на который я обратил внимание. Почему все дружно зацепились за это, для меня загадка.
Как минимум первую тему из предложенных я читал и не нашёл там решения своей задачи. Может быть был невнимателен, но каяться и платить не буду.
Вот здесь поднимался вопрос https://forum.dwg.ru/showthread.php?t=154420 с отсылом вот сюда https://www.cadtutor.net/forum/topic...comment-516364.
В таком случае я вообще не понимаю сути вопроса. Выделить, насколько я соображаю в структуру ACAD'a, примитивы можно только в текущем пространстве, если использовать sssetfirst. Поэтому - ну найдены вхождения блоков, возможно, даже в какой-то список засунуты - а дальше-то что? Что с этими данными делать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 04.05.2023, 13:51
#15
Сыч


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В таком случае я вообще не понимаю сути вопроса.
У меня не было вопросов, я просто выложил готовые протестированные лиспы с целью "берите, кому надо".

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
можно только в текущем пространстве
Приведённые лиспы выделяют блоки, включая измененённые динамические, либо во всём чертеже, либо на всех листах. Не только в текущем пространстве. Проверено в 18-м и 23-м автокадах.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Что с этими данными делать?
В смысле, что с этими данными делать? Ну вот быстрым выбором выбирает человек объекты и что-то с ними делает, может ещё выбрать подобные, выбрать Sesim'ом, SIAF'ом или SSD. Ну и моими лиспами тоже может выбрать. То, что делаю я с выбранными блоками, я написал в #5.
Сыч вне форума  
 
Непрочитано 04.05.2023, 14:02
| 1 #16
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сыч Посмотреть сообщение
У меня не было вопросов, я просто выложил готовые протестированные лиспы с целью "берите, кому надо".
Блин, а раздел "Готовые программы" - для чего существует?!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.05.2023, 18:03
#17
Сыч


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Блин, а раздел "Готовые программы" - для чего существует?!
Ну, слона-то я и не приметил...
Сыч вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Выбор блоков во всем чертеже по маске имени

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Как разнести множество блоков на чертеже без наложения друг на друга? privetdruzia AutoCAD 14 02.11.2018 20:26
AS2018. Стиль чертежа КМД выбор, не всем маркам расставляет позицию, в чем причина? erikbond Advance Steel 3 13.09.2018 16:09
Выбор компьютера для Автокада при работе с большим количеством динамических блоков. Red Nova Компьютерная и бытовая техника, электроника и инструмент 12 18.11.2016 11:43