Как создавать 3D-дуги

Источник: http://www.cad.dp.ua/sovets/3d_arc.php

Пишем утилиту для добавления отсутствующих размеров к вашим дугам в AutoCAD

Barry Bowen
Журнал CADALYST

В 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!")