Нужно с использованием AutoLISP или Visual LISP (...

Creato il: 19 luglio 2026

Risposto usando GPT-5.6 Thinking da Chat01

Domanda

Нужно с использованием AutoLISP или Visual LISP (AutoCAD 2021 (RU))
выбрать несколько объектов (это могут быть динамические блоки,тексты (мтексты), круги...)
и разместить их по горизонтали с заданным шагом (по умолчанию можно сделать шаг 1000).
За базовый принять левый объект. /не использовать в коде function STRINGP, CONSP, WHEN/,
можно использовать в коде функции типа vla-, vlax- и подобные, которые есть
в стандартной библиотеке AutoLISP.

Pensiero

Handling UCS for horizontal positioning

I need to ensure object movement is relative to the current UCS, rather than WCS. GetBoundingBox returns coordinates in WCS, so I’ll transform the center to UCS, sort objects by X in UCS, and then move them accordingly. Afterward, I’ll transform the target back into WCS for accurate movement.

Thought for 49s

Risposta

Ниже команда HSTEP. Для объектов разных типов используется центр их габаритной рамки. Левым считается объект с минимальной координатой X центра; он остаётся на месте. Остальные располагаются вдоль оси X текущей ПСК с заданным шагом.

lisp
(vl-load-com) ;; Преобразование SAFEARRAY или VARIANT в обычный список (defun HS:ArrayToList (value) (if (= (type value) 'VARIANT) (setq value (vlax-variant-value value)) ) (vlax-safearray->list value) ) ;; Получение центра габаритной рамки объекта в МСК (defun HS:GetCenter (object / result point-min point-max p1 p2) (setq result (vl-catch-all-apply 'vla-GetBoundingBox (list object 'point-min 'point-max) ) ) (if (vl-catch-all-error-p result) nil (progn (setq p1 (HS:ArrayToList point-min)) (setq p2 (HS:ArrayToList point-max)) (list (/ (+ (car p1) (car p2)) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0) (/ (+ (caddr p1) (caddr p2)) 2.0) ) ) ) ) (defun c:HSTEP ( / *error* acad-object document undo-open selection step items skipped index entity object center-wcs center-ucs sorted-items base-center number item target-ucs target-wcs ) ;; Обработчик ошибок (defun *error* (message) (if undo-open (progn (vla-EndUndoMark document) (setq undo-open nil) ) ) (if (and message (/= message "Function cancelled") (/= message "quit / exit abort") ) (princ (strcat "\nОшибка: " message)) ) (princ) ) (setq acad-object (vlax-get-acad-object)) (setq document (vla-get-ActiveDocument acad-object)) (setq undo-open nil) (prompt "\nВыберите объекты для размещения по горизонтали: " ) ;; Режим :L исключает объекты на заблокированных слоях (setq selection (ssget "_:L")) (if selection (progn ;; Запрос шага (initget 6) (setq step (getdist "\nУкажите шаг между центрами объектов <1000>: " ) ) (if (null step) (setq step 1000.0) ) ;; Формирование списка объектов (setq items nil) (setq skipped 0) (setq index 0) (repeat (sslength selection) (setq entity (ssname selection index)) (setq object (vl-catch-all-apply 'vlax-ename->vla-object (list entity) ) ) (if (vl-catch-all-error-p object) (setq skipped (1+ skipped)) (progn (setq center-wcs (HS:GetCenter object)) (if center-wcs (progn ;; Центр объекта в текущей ПСК (setq center-ucs (trans center-wcs 0 1)) ;; Элемент списка: ;; X, номер выбора, VLA-объект, центр МСК, центр ПСК (setq items (cons (list (car center-ucs) index object center-wcs center-ucs ) items ) ) ) (setq skipped (1+ skipped)) ) ) ) (setq index (1+ index)) ) (if (> (length items) 1) (progn ;; Сортировка слева направо (setq sorted-items (vl-sort items '(lambda (item1 item2) (if (equal (car item1) (car item2) 1.0e-9 ) (< (cadr item1) (cadr item2)) (< (car item1) (car item2)) ) ) ) ) ;; Центр самого левого объекта (setq base-center (nth 4 (car sorted-items)) ) (vla-StartUndoMark document) (setq undo-open T) (setq number 0) (foreach item sorted-items ;; Первый, то есть левый объект, не перемещаем (if (> number 0) (progn ;; Целевая точка в текущей ПСК (setq target-ucs (list (+ (car base-center) (* number step)) (cadr base-center) (caddr base-center) ) ) ;; Перевод целевой точки в МСК (setq target-wcs (trans target-ucs 1 0) ) ;; Перемещение центра объекта в целевую точку (vla-Move (nth 2 item) (vlax-3d-point (nth 3 item)) (vlax-3d-point target-wcs) ) ) ) (setq number (1+ number)) ) (vla-EndUndoMark document) (setq undo-open nil) (princ (strcat "\nРазмещено объектов: " (itoa (length sorted-items)) ". Шаг: " (rtos step 2 3) "." ) ) ) (princ "\nДля выполнения команды необходимо не менее двух подходящих объектов." ) ) (if (> skipped 0) (princ (strcat "\nПропущено объектов без доступной габаритной рамки: " (itoa skipped) "." ) ) ) ) (princ "\nОбъекты не выбраны.") ) (princ) ) (princ "\nКоманда загружена. Введите HSTEP для запуска.") (princ)

Использование

  1. Сохраните код в файл, например HSTEP.lsp.
  2. Загрузите его командой APPLOAD.
  3. Введите HSTEP.
  4. Выберите объекты и нажмите Enter.
  5. Укажите шаг или нажмите Enter для значения 1000.

Шаг измеряется между центрами габаритных рамок. Все объекты получают координату Y центра левого объекта, поэтому выстраиваются в одну горизонтальную линию.

Condividi questa Q&A