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

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

Как выгрузить минимальные и максимальные координаты всех вхождений блоков AutoCAD 2024

Ответ
Поиск в этой теме
Непрочитано 18.08.2025, 00:01 #1
Как выгрузить минимальные и максимальные координаты всех вхождений блоков AutoCAD 2024
Bulls29
 
Регистрация: 17.08.2025
Сообщений: 2

Всем привет. Добрые программисты помогите пожалуйста!!!
Имеется чертеж в котором 300 вхождений блоков, каждый блок имеет индивидуальное имя и представляют из себя одну большую модель. Мне необходимо выгрузить координаты min и max по осям xyz (сразу уточню не точку вставки блока).
Если блок разбить до 3d тела то при вводе команды _List либо _Massprop AutoCAD выдаёт габариты ("ограничивающая рамка" минимальные и максимальные габариты по xyz) вот такие габариты необходимо получить в файл формата .csv либо .txt, но как сделать чтоб они выгружались за один раз со всех имеющихся блоков с привязкой к имени блока?
Вид выгружаемых данных нужен примерно вот такой:
Наименование блока Xmin Xmax Ymin Ymax Zmin Zmax
0134 (отсек 10.5) -87500.00 -69520.00 -21000.00 -14000.00 0.00 17000.00
Сразу уточню я неплохой инженер но вот программист из меня никакой. Буду очень благодарен если у кого то есть такой AutoLisp, либо кто то напишет или доработает уже имеющийся!

Ниже привожу Lisp код, сделал товарищ. В принципе это то что мне надо, но данный Lisp позволяет выгружать данные если на каждый блок нажимать по очереди, а надо чтоб выделил все и получил сразу координаты всех в одном файле!

Код:
[Выделить все]
 (defun c:EBBTF (/ blk name obj minPt maxPt filename f ss)
    (vl-load-com)
    
    ; Запрос файла при первом запуске
    (if (not *export-filename*)
        (progn
            (setq filename (getfiled "Выберите файл для сохранения данных" "" "csv" 1))
            (if (not filename)
                (progn (princ "\nФайл не выбран.") (exit))
            )
            (setq *export-filename* filename)
        )
    )
    
    ; Выбор блока
    (setq blk (car (entsel "\nВыберите блок: ")))
    (if (not blk) (exit))
    
    (setq name (cdr (assoc 2 (entget blk))))
    
    ; Взрываем блок
    (command "_.explode" blk)
    
    ; Выбор всех новых объектов после взрыва
    (setq ss (ssget "_P"))
    (if (not ss) (progn (princ "\nНе удалось выбрать объекты после взрыва.") (exit)))
    
    ; Преобразуем первый выбранный объект в VLA-Object
    (setq obj (vlax-ename->vla-object (ssname ss 0)))
    
    ; Проверяем тип объекта (на всякий случай)
    (if (not (eq (vla-get-objectname obj) "AcDb3dSolid"))
        (progn (princ "\nВыбранный объект не является 3D телом.") (exit))
    )
    
    ; Получаем габариты
    (vla-GetBoundingBox obj 'minPt 'maxPt)
    (setq minPt (vlax-safearray->list minPt))
    (setq maxPt (vlax-safearray->list maxPt))
    
    ; Открываем файл для дополнения
    (setq f (open *export-filename* "a"))
    (write-line 
        (strcat 
            name ","
            (rtos (nth 0 minPt) 2 4) "," (rtos (nth 1 minPt) 2 4) "," (rtos (nth 2 minPt) 2 4) ","
            (rtos (nth 0 maxPt) 2 4) "," (rtos (nth 1 maxPt) 2 4) "," (rtos (nth 2 maxPt) 2 4)
        )
        f
    )
    (close f)
    
    ; Откат взрыва
    (command "_.undo" "1")
    
    (princ (strcat "\nДанные добавлены в файл: " *export-filename*))
    (princ)
) 
Данный код выгружает данные, сыпет ошибки и после команды блок превращается в 3D тело.

Последний раз редактировалось Кулик Алексей aka kpblc, 18.08.2025 в 08:53.
Просмотров: 292
 
Автор темы   Непрочитано 18.08.2025, 09:22
1 | #2
Bulls29


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


Тему можно закрывать! Выкладываю рабочую версию AutoLisp. Вдруг кому понадобится!

Код:
[Выделить все]
 (defun c:VSEBLOCK (/ filename ss f i ent name obj minPt maxPt count res ftest exists)
  (vl-load-com)

  ;; Выбор файла при каждом запуске
  (setq filename (getfiled "Выберите файл для сохранения данных" "" "csv" 1))
  (if (not filename)
    (progn (princ "\nФайл не выбран.") (exit))
  )

  ;; Проверка существования файла
  (setq ftest (open filename "r"))
  (if ftest (progn (close ftest) (setq exists T)) (setq exists nil))

  ;; Открываем файл для добавления; если файл новый — запишем заголовок
  (setq f (open filename "a"))
  (if (not exists)
    (write-line "Название помещения,Xmin,Xmax,Ymin,Ymax,Zmin,Zmax" f)
  )

  ;; Выбор нескольких вхождений блоков (INSERT)
  (princ "\nВыберите блок(и) (только ссылки блоков).")
  (setq ss (ssget '((0 . "INSERT"))))
  (if (not ss)
    (progn (close f) (princ "\nНет выбранных блоков.") (exit))
  )

  ;; Обработка выбранных ссылок
  (setq count 0 i 0)
  (while (< i (sslength ss))
    (setq ent (ssname ss i)
          name (cdr (assoc 2 (entget ent)))
          obj  (vlax-ename->vla-object ent))

    (if (and obj (eq (vla-get-objectname obj) "AcDbBlockReference"))
      (progn
        ;; Получаем bounding box с защитой от ошибок
        (setq res (vl-catch-all-apply 'vla-GetBoundingBox (list obj 'minPt 'maxPt)))
        (if (not (vl-catch-all-error-p res))
          (progn
            (setq minPt (vlax-safearray->list minPt)
                  maxPt (vlax-safearray->list maxPt))
            ;; Запись в CSV в формате: Название,Xmin,Xmax,Ymin,Ymax,Zmin,Zmax
            (write-line
              (strcat
                name ","
                (rtos (nth 0 minPt) 2 4) "," (rtos (nth 0 maxPt) 2 4) ","  ; Xmin,Xmax
                (rtos (nth 1 minPt) 2 4) "," (rtos (nth 1 maxPt) 2 4) ","  ; Ymin,Ymax
                (rtos (nth 2 minPt) 2 4) "," (rtos (nth 2 maxPt) 2 4)       ; Zmin,Zmax
              )
              f
            )
            (setq count (1+ count))
          )
          (princ (strcat "\nНе удалось получить габариты для блока: " name))
        )
      )
      (princ (strcat "\nПропущен объект не являющийся ссылкой блока: " (itoa i)))
    )

    (setq i (1+ i))
  )

  (close f)
  (princ (strcat "\nОбработано блоков: " (itoa count) ". Данные добавлены в файл: " filename))
  (princ)
)

Последний раз редактировалось Кулик Алексей aka kpblc, 18.08.2025 в 10:19.
Bulls29 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как выгрузить минимальные и максимальные координаты всех вхождений блоков AutoCAD 2024

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с отображением библиотеки в палитре блоков (AutoCad 2023) Шнуровский AutoCAD 14 22.02.2023 11:22
Нужно решение (программа) для массового переименования всех блоков gizmo_zx Программирование 14 01.06.2022 15:51
Добавление в модель новых вхождений блоков (уникальных) поштучно Sirius2w AutoCAD 18 26.05.2010 12:19
AUTOCAD и координаты CREDO bike-all AutoCAD 5 05.03.2009 08:50
Экспортировать в excel координаты блоков Влад AutoCAD 6 23.12.2008 17:45