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

बनाया गया: 16 अप्रैल 2026

का उपयोग करके उत्तर दिया गया GPT-5.4 Thinking द्वारा Chat01

प्रश्न

Нужно с использованием AutoLISP или Visual LISP (AutoCAD 2021 (RU)) выбрать блок на чертеже и расставить блоки вдоль выбранных
LINE,ARC,LWPOLYLINE,POLYLINE,SPLINE,CIRCLE,ELLIPSE с указанным шагом.
/не использовать в коде function STRINGP, CONSP, WHEN,
можно использовать в коде функции типа vla-, vlax- и подобные, которые есть
в стандартной библиотеке AutoLISP/.

प्रश्न

Нужно с использованием AutoLISP или Visual LISP (AutoCAD 2021 (RU)) выбрать блок на чертеже и расставить блоки вдоль выбранных
LINE,ARC,LWPOLYLINE,POLYLINE,SPLINE,CIRCLE,ELLIPSE с указанным шагом.
/не использовать в коде function STRINGP, CONSP, WHEN,
можно использовать в коде функции типа vla-, vlax- и подобные, которые есть
в стандартной библиотеке AutoLISP/.

प्रश्न

Нужно с использованием AutoLISP или Visual LISP (AutoCAD 2021 (RU)) выбрать блок на чертеже и расставить блоки вдоль выбранных
LINE,ARC,LWPOLYLINE,POLYLINE,SPLINE,CIRCLE,ELLIPSE с указанным шагом.
/не использовать в коде function STRINGP, CONSP, WHEN,
можно использовать в коде функции типа vla-, vlax- и подобные, которые есть
в стандартной библиотеке AutoLISP/.

विचार

Сделаю рабочий вариант команды для AutoCAD 2021: выбор одного блока-образца, выбор набора кривых, ввод шага, затем копирование этого блока по длине каждой кривой через vlax-curve-*. Также сохраню свойства исходного блока, потому что буду копировать именно выбранную вставку блока, а не просто вставлять имя блока заново.

Thought for 59s

उत्तर

Ниже готовая команда для AutoCAD 2021 (RU) на Visual LISP / AutoLISP.

Что делает команда:

  • просит выбрать один блок-вставку (INSERT) как образец;
  • просит выбрать объекты: LINE, ARC, LWPOLYLINE, POLYLINE, SPLINE, CIRCLE, ELLIPSE;
  • просит ввести шаг;
  • копирует выбранный блок вдоль каждой выбранной кривой с указанным шагом;
  • копирование идёт через vla-copy, поэтому у копий сохраняются свойства исходного блока:
    • имя блока,
    • масштаб,
    • поворот,
    • слой,
    • атрибуты и их значения,
    • часть прочих параметров самой вставки.

В коде не используются STRINGP, CONSP, WHEN.

lisp
(vl-load-com) (defun _bs-objname (obj) (vla-get-ObjectName obj) ) (defun _bs-supported-curve-p (obj / nm) (setq nm (_bs-objname obj)) (if (or (= nm "AcDbLine") (= nm "AcDbArc") (= nm "AcDbPolyline") (= nm "AcDb2dPolyline") (= nm "AcDb3dPolyline") (= nm "AcDbSpline") (= nm "AcDbCircle") (= nm "AcDbEllipse") ) T nil ) ) (defun _bs-closed-curve-p (obj / nm res) (setq nm (_bs-objname obj)) (setq res nil) (if (or (= nm "AcDbCircle") (= nm "AcDbEllipse")) (setq res T) (progn (if (vlax-property-available-p obj 'Closed) (setq res (vla-get-Closed obj)) ) ) ) res ) (defun _bs-var->list (v) (vlax-safearray->list (vlax-variant-value v)) ) (defun _bs-make-3dpt (pt) (vlax-3d-point pt) ) (defun _bs-copy-block-to-point (blk pt / cp inspt) (setq cp (vla-copy blk)) (setq inspt (_bs-var->list (vla-get-InsertionPoint blk))) (vla-move cp (_bs-make-3dpt inspt) (_bs-make-3dpt pt)) cp ) (defun _bs-place-on-curve (blk obj step / endParam len dist pt closed tol) (setq tol 1e-8) (setq endParam (vlax-curve-getEndParam obj)) (setq len (vlax-curve-getDistAtParam obj endParam)) (setq closed (_bs-closed-curve-p obj)) (setq dist 0.0) (if (> len tol) (progn (while (if closed (< dist (- len tol)) (<= dist (+ len tol)) ) (setq pt (vlax-curve-getPointAtDist obj dist)) (if pt (_bs-copy-block-to-point blk pt) ) (setq dist (+ dist step)) ) ) ) ) (defun c:BLKSTEP ( / eBlk blk ss step i en obj cnt) (vl-load-com) (prompt "\nВыберите блок-образец: ") (setq eBlk (car (entsel))) (if eBlk (progn (setq blk (vlax-ename->vla-object eBlk)) (if (= (_bs-objname blk) "AcDbBlockReference") (progn (prompt "\nВыберите кривые LINE/ARC/LWPOLYLINE/POLYLINE/SPLINE/CIRCLE/ELLIPSE: ") (setq ss (ssget '((0 . "LINE,ARC,LWPOLYLINE,POLYLINE,SPLINE,CIRCLE,ELLIPSE")) ) ) (if ss (progn (setq step (getdist "\nУкажите шаг расстановки: ")) (if (and step (> step 0.0)) (progn (setq i 0) (setq cnt 0) (while (< i (sslength ss)) (setq en (ssname ss i)) (setq obj (vlax-ename->vla-object en)) (if (_bs-supported-curve-p obj) (progn (_bs-place-on-curve blk obj step) (setq cnt (1+ cnt)) ) ) (setq i (1+ i)) ) (prompt (strcat "\nГотово. Обработано объектов: " (itoa cnt) ) ) ) (prompt "\nНекорректный шаг.") ) ) (prompt "\nКривые не выбраны.") ) ) (prompt "\nВыбранный объект не является блоком.") ) ) (prompt "\nБлок не выбран.") ) (princ) )

Как использовать:

  1. Сохраните код в файл, например BLKSTEP.lsp
  2. Загрузите через APPLOAD
  3. Запустите команду:
lisp
BLKSTEP
  1. Выберите блок-образец
  2. Выберите кривые
  3. Введите шаг

Что важно знать:

  • Блок ставится в точки 0, шаг, 2*шаг, 3*шаг... вдоль длины каждой кривой.
  • Для замкнутых объектов (CIRCLE, ELLIPSE, замкнутые полилинии) конечная точка не дублируется, чтобы не получить наложение на стартовую.
  • Ориентация блока не поворачивается по касательной, а сохраняется такой же, как у исходного выбранного блока.

Если нужно, я могу сразу дать вторую версию, где блоки будут: либо поворачиваться по касательной кривой, либо ставиться с отступом от начала, либо без точки в начале.

इस प्रश्नोत्तर को साझा करें