Нужно с использованием AutoLISP или Visual LISP (...
Creado el: 19 de julio de 2026
Respondido usando GPT-5.6 Thinking por Chat01
Creado el: 19 de julio de 2026
Respondido usando GPT-5.6 Thinking por Chat01
Нужно с использованием AutoLISP или Visual LISP (AutoCAD 2021 (RU))
выбрать несколько объектов (это могут быть динамические блоки,тексты (мтексты), круги...)
и разместить их по горизонтали с заданным шагом (по умолчанию можно сделать шаг 1000).
За базовый принять левый объект. /не использовать в коде function STRINGP, CONSP, WHEN/,
можно использовать в коде функции типа vla-, vlax- и подобные, которые есть
в стандартной библиотеке AutoLISP.
Ниже команда 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)
HSTEP.lsp.APPLOAD.HSTEP.1000.Шаг измеряется между центрами габаритных рамок. Все объекты получают координату Y центра левого объекта, поэтому выстраиваются в одну горизонтальную линию.