Нужно с использованием AutoLISP или Visual LISP (A...
作成日: 2025年12月8日
使用モデル GPT-5.1 Thinking by Chat01
作成日: 2025年12月8日
使用モデル GPT-5.1 Thinking by Chat01
Нужно с использованием AutoLISP или Visual LISP (AutoCAD 2021 (RU)) разделить отрезок
или полилинию на одинаковые сегменты, с помощью отрезков в точках деления длиной 100 мм,
на слое "divid" цвет 6, толщина 0.3. Запросить у пользователя длину сегмента.
(не использовать в коде function STRINGP и WHEN)
(не использовать в коде функции типа vlax-curve-p и подобные, которые отсутствует
в стандартной библиотеке AutoLISP)
Вот вариант решения на «чистом» AutoLISP (без STRINGP, WHEN, vlax-curve-* и т.п.), для AutoCAD 2021 (RU).
Что делает программа
MEASURE расставляет точки деления."divid", цвет 6, толщина (lineweight) 0.30 мм.Скопируйте этот код в файл *.lsp, загрузите через APPLOAD и вызовите команду DIVSEG.
lisp;;; ---------------------------------------- ;;; Разделение отрезка/полилинии на части ;;; Делящие отрезки длиной 100 мм на слое "divid" ;;; Цвет 6, толщина (lineweight) 0.30 мм ;;; Команда: DIVSEG ;;; ---------------------------------------- (defun MakeDividLayer (/ lay) ;; Создаем слой "divid", если его нет (setq lay (tblsearch "LAYER" "divid")) (if (not lay) (entmake '( (0 . "LAYER") (2 . "divid") ; имя слоя (70 . 0) (62 . 6) ; цвет 6 (6 . "CONTINUOUS") ; тип линии (370 . 30) ; lineweight 0.30 мм (в сотых долях мм) ) ) ) ) (defun c:DIVSEG (/ ent ed type seglen ss n i pt halfLen oldCmdecho z) (princ "\nКоманда DIVSEG – деление отрезка/полилинии с делящими отрезками.") ;; Выбор объекта (setq ent (car (entsel "\nВыберите отрезок или полилинию: "))) (if ent (progn (setq ed (entget ent) type (cdr (assoc 0 ed))) (if (or (= type "LINE") (= type "LWPOLYLINE") (= type "POLYLINE")) (progn ;; Ввод длины сегмента (setq seglen (getreal "\nВведите длину сегмента (расстояние между делениями): ")) (if (and seglen (> seglen 0.0)) (progn ;; Слой для делящих отрезков (MakeDividLayer) ;; Скрываем эхо команд (setq oldCmdecho (getvar "CMDECHO")) (setvar "CMDECHO" 0) ;; Расставляем точки через заданный шаг (command "_.MEASURE" ent "" seglen) ;; Получаем созданные точки (последний набор объектов) (setq ss (ssget "L")) ;; Возвращаем CMDECHO (setvar "CMDECHO" oldCmdecho) (if ss (progn (setq n (sslength ss) i 0 halfLen 50.0) ; половина 100 мм (while (< i n) (setq pt (cdr (assoc 10 (entget (ssname ss i))))) (if pt (progn ;; Координата Z (если нет – берем 0) (setq z (if (caddr pt) (caddr pt) 0.0)) ;; Строим горизонтальный отрезок длиной 100 мм (entmake (list (cons 0 "LINE") (cons 8 "divid") ; слой (cons 62 6) ; цвет 6 (cons 370 30) ; lineweight 0.30 мм (cons 10 (list (- (car pt) halfLen) (cadr pt) z)) (cons 11 (list (+ (car pt) halfLen) (cadr pt) z)) ) ) ) ) (setq i (1+ i)) ) ;; Удаляем точки деления (command "_.ERASE" ss "") ) (princ "\nТочек деления не создано (возможно, длина сегмента больше длины объекта).") ) ) (princ "\nДлина сегмента должна быть положительным числом.") ) ) (princ "\nВыбранный объект не является отрезком или полилинией.") ) ) (princ "\nОбъект не выбран.") ) (princ) )
APPLOAD).DIVSEG ↵В результате вдоль объекта появятся короткие отрезки длиной 100 мм на слое "divid", цвет 6, lineweight 0.30 мм.