Нужно с использованием AutoLISP или Visual LISP (...
创建于:2026年7月20日
创建于:2026年7月20日
Нужно с использованием AutoLISP или Visual LISP (AutoCAD 2021 (RU))
выбрать несколько объектов (это могут быть динамические блоки,тексты (мтексты), круги...)
и разместить их по вертикали с заданным шагом (по умолчанию можно сделать шаг 1000).
За базовый принять верхний объект. /не использовать в коде function STRINGP, CONSP, WHEN/,
можно использовать в коде функции типа vla-, vlax- и подобные, которые есть
в стандартной библиотеке AutoLISP.
Ниже пример AutoLISP/Visual LISP для AutoCAD 2021 RU, который:
vla-, vlax- функции;STRINGP, CONSP, WHEN.Команда: VSTACK
lisp(defun c:VSTACK (/ ss step i ent obj lst p minY baseY baseX n insPt) (vl-load-com) ;; шаг по умолчанию (setq step 1000.0) ;; выбор объектов (setq ss (ssget)) (if ss (progn ;; запрос шага (setq step (getreal (strcat "\nВведите вертикальный шаг <" (rtos step 2 0) ">: " ) ) ) (if (null step) (setq step 1000.0) ) ;; список объектов и их базовых точек (setq lst nil) (setq i 0) (repeat (sslength ss) (setq ent (ssname ss i)) (setq obj (vlax-ename->vla-object ent)) ;; Получаем BoundingBox (vla-GetBoundingBox obj 'minPt 'maxPt) (setq minPt (vlax-safearray->list minPt)) (setq maxPt (vlax-safearray->list maxPt)) ;; сохраняем: ;; объект ;; центр по X ;; верхнюю координату Y (setq p (list ent (/ (+ (car minPt) (car maxPt)) 2.0) (cadr maxPt) ) ) (setq lst (cons p lst)) (setq i (1+ i)) ) ;; сортировка по Y сверху вниз (setq lst (vl-sort lst '(lambda (a b) (> (caddr a) (caddr b)) ) ) ) ;; координата верхнего объекта (setq baseY (caddr (car lst))) (setq baseX (cadr (car lst))) ;; перенос объектов (setq n 0) (foreach item lst (setq ent (car item)) (setq obj (vlax-ename->vla-object ent) ) ;; текущая точка объекта (setq insPt (vlax-3D-point (list (cadr item) (caddr item) 0.0 ) ) ) ;; новая точка (setq newPt (vlax-3D-point (list baseX (- baseY (* n step)) 0.0 ) ) ) ;; смещение объекта (vla-Move obj insPt newPt ) (setq n (1+ n)) ) (princ "\nОбъекты размещены вертикально." ) ) (princ "\nОбъекты не выбраны.") ) (princ) )
vla-GetBoundingBox определяется верхняя точка.textсамый высокий объект | | объект 2 | | объект 3
textОбъект 1 (база) Y Объект 2 -1000 Объект 3 -2000 Объект 4 -3000
STRINGP — нетCONSP — нетWHEN — нетМожно также добавить варианты:
Добавь выбор базового объекта вручную вместо автоматического верхнего
Базовый объект выбирается отдельно вручную и остаётся на месте. Затем выбираются объекты для размещения; сам базовый объект можно включать или не включать в общий выбор.
lisp(defun c:VSTACK (/ baseSel baseEnt baseObj baseMin baseMax baseX baseY ss step i ent obj minPt maxPt objData objList item fromPt toPt targetY n) (vl-load-com) ;; Значение шага по умолчанию (setq step 1000.0) ;; Ручной выбор базового объекта (setq baseSel (entsel "\nВыберите базовый объект: ") ) (if baseSel (progn (setq baseEnt (car baseSel)) (setq baseObj (vlax-ename->vla-object baseEnt)) ;; Габариты базового объекта (vla-GetBoundingBox baseObj 'baseMin 'baseMax) (setq baseMin (vlax-safearray->list baseMin) ) (setq baseMax (vlax-safearray->list baseMax) ) ;; Центр базового объекта по X ;; и верхняя граница по Y (setq baseX (/ (+ (car baseMin) (car baseMax)) 2.0) ) (setq baseY (cadr baseMax) ) ;; Выбор объектов для размещения (princ "\nВыберите объекты для вертикального размещения: " ) (setq ss (ssget)) (if ss (progn ;; Запрос шага (initget 6) (setq step (getreal (strcat "\nВведите вертикальный шаг <" (rtos step 2 0) ">: " ) ) ) (if (null step) (setq step 1000.0) ) ;; Формирование списка объектов. ;; Базовый объект в список не добавляется. (setq objList nil) (setq i 0) (repeat (sslength ss) (setq ent (ssname ss i)) (if (/= ent baseEnt) (progn (setq obj (vlax-ename->vla-object ent) ) (vla-GetBoundingBox obj 'minPt 'maxPt) (setq minPt (vlax-safearray->list minPt) ) (setq maxPt (vlax-safearray->list maxPt) ) ;; Данные объекта: ;; 1. имя объекта; ;; 2. центр BoundingBox по X; ;; 3. верхняя граница BoundingBox по Y. (setq objData (list ent (/ (+ (car minPt) (car maxPt)) 2.0) (cadr maxPt) ) ) (setq objList (cons objData objList) ) ) ) (setq i (1+ i)) ) ;; Сортировка остальных объектов сверху вниз (setq objList (vl-sort objList '(lambda (a b) (> (caddr a) (caddr b)) ) ) ) ;; Первый перемещаемый объект располагается ;; на один шаг ниже базового (setq n 1) (foreach item objList (setq ent (car item)) (setq obj (vlax-ename->vla-object ent) ) ;; Текущая условная точка объекта: ;; центр по X и верхняя граница по Y (setq fromPt (vlax-3D-point (list (cadr item) (caddr item) 0.0 ) ) ) ;; Новая верхняя координата объекта (setq targetY (- baseY (* n step)) ) ;; Новая условная точка (setq toPt (vlax-3D-point (list baseX targetY 0.0 ) ) ) (vla-Move obj fromPt toPt) (setq n (1+ n)) ) (if objList (princ "\nОбъекты размещены вертикально относительно выбранного базового объекта." ) (princ "\nВ наборе нет объектов, отличных от базового." ) ) ) (princ "\nОбъекты для размещения не выбраны.") ) ) (princ "\nБазовый объект не выбран.") ) (princ) )
Базовой точкой считается центр верхней границы BoundingBox выбранного объекта. Остальные объекты выравниваются по этому же X и располагаются вниз с указанным шагом. Команда для запуска — VSTACK.