Источник:
http://www.cad.dp.ua/sovets/3d_arc.php
Пишем утилиту для добавления отсутствующих размеров к вашим дугам в AutoCAD
В AutoCAD отсутствует команда черчение 3D-дуг. Чтобы создавать некоторые 3D-поверхности, вы должны импровизировать дуги, изогнутые вверх или вниз по оси Z. На рисунке показана 2D дуга голубым цветом и конечная 3D-дуга показана красным. Вертикальные линии показывают 24 приращения 0.25" в направленни Z. Начнем чертить дугу:
(setq SPT (list 3 0 0) EPT (list 0 3 0)) (command "._arc" "_c" "0,0" SPT EPT)
AutoLISP программа Arc3D использует последнюю созданую дугу, из ее стартовой точки, назанченной переменной SPT, к своей завершающей точке, назначенной переменной EPT. Прежде всего, разделим дугу, назначив переменной EL, требуемое число приращений, 24 в нашем случае:
(command "._divide" EL 24)
Команда AutoCAD Divide отмечает указанное число равных длин на дуге размещая объекты "точка". Соберем эти точки в набор выбора SS2:
(setq EL1 (entnext EL)) (while EL1 (ssadd EL1 SS2) (setq EL1 (entnext EL1)))<
Посколько EL - последний объект, размещенный перед этими точками, Arc3D "собирает" точки используя функции (entnext) и (ssadd) для точек, созданных командой Divide. Строка ниже добавляет стартовую точку , SPT, первой к набору точек:
(setq PT_LIST (append (list SPT) PT_LIST))и конвертирует каждую точку в 3D-координаты.
Цикл (while) берет x и y координаты каждой точки и строит новую 3D-точку добавлением значения z-расстояния на основе добавления 0.25" для каждой точки:
(setq X (car PT) Y (cadr PT)) (setq 3DPT (list X Y DST))
Arc3D сохраняет это расстояние в переменную DST и добавляет это к предыдущему расстоянию, по мере создания каждой 3D-точки:
(setq DST (+ DST 0.25))
И в конце программа добавляет конечную точку дуги, EPT, к списку точек вместе с конечным расстоянием в направлении Z:
(setq X (car EPT) Y (cadr EPT)) (setq 3DPT (list X Y DST)) (setq PT_LIST (append (list 3DPT) PT_LIST))
Реверсия списка точек начинает трехмерную полилинейную дугу с стартовой точки SPT, и продолжает ее с добавлением значения 0.25" по дуге до достижения последней точки. Arc3D затем удаляет исходную дугу и добавленные точки.
Код для Arc3D.lsp:(defun C:ARC3D ( / SS2 PT_LIST EL EL1 ELIST EN IN PT X Y 3DPT DST PTLIST ) (setvar "osmode" 0) (command "._UCS" "_w") (setq SS2 nil SS2 (ssadd)) (setq PT_LIST nil PT_LIST '()) (setq EL (entlast)) (command "._divide" EL 24) (setq EL1 (entnext EL1)) (while EL1 (ssadd EL1 SS2) (setq EL1 (entnext EL1))) (setq IN 0 EN (ssname SS2 IN) DST 0.25) (setq PT_LIST (append (list SPT) PT_LIST)) (while EN (setq ELIST (entget EN)) (setq PT (cdr (assoc 10 ELIST))) (setq X (car PT) Y (cadr PT)) (setq 3DPT (list X Y DST)) (setq PT_LIST (append (list 3DPT) PT_LIST)) (setq DST (+ DST 0.25)) (setq IN (1+ IN) EN (ssname SS2 IN)) ) (setq X (car EPT) Y (cadr EPT)) (setq 3DPT (list X Y DST)) (setq PT_LIST (append (list 3DPT) PT_LIST)) (setq IN 0)(command "._3DPOLY") (repeat (length PTLIST) (setq PT (nth IN PTLIST)) (command PT) (setq IN (1+ IN)) ) (command "") (command "._erase" SS2 EL "") ) (prompt "\nType ARC3D to Execute!")