Here is a lsp routine that creates helix geometry hope this works for you
Once you have the helix, you should be able to use the 3dpoly as your extrusion path.
;;-----------------------------------------------
;; Programmer's Toolbox #9-97
;; Bill Kramer
;;
;; Draw a Helix type spiral with a 3D polyline.
;;
;;------------------------------------------------------
(if (null (findfile "HELIX.DCL"

)
(prompt "\nFile HELIX.DCL must be in search path!"

)
;;------------------------------------------------------
;;
;; Listing 1 : Call back function for radio buttons
;;
(defun HELIX_RADIO (key)
(cond
((= Key "CON"

;;constant radius
(setq R2D RAD
RID 0.0)
(set_tile "R2D" (rtos R2D))
(set_tile "RID" (rtos RID))
(mode_tile "R2D" 1)
(mode_tile "RID" 1)
)
((= KEY "R2"

;;ending radius
(setq RID (/ (- R2D RAD) REV))
(mode_tile "R2D" 0)
(mode_tile "RID" 1)
(set_tile "RID" (rtos RID))
(mode_tile "R2D" 2)
)
((= Key "RI"

;incremental radius
(setq R2D (+ RAD (* RID REV)))
(mode_tile "R2D" 1)
(mode_tile "RID" 0)
(set_tile "R2D" (rtos R2D))
(mode_tile "RID" 2)
)
)
)
;;-----------------------------------------------
;;
;; Listing 2 - the DCL data file- see HELIX.DCL
;;
;;-----------------------------------------------
;;
;; Listing 3: Call Back function for edit boxes
;;
(defun HELIX_1 (Key Val)
(cond
((and (= Key "RAD"

(> (atof Val) 0.0))
(setq RAD (atof Val))
(set_tile "RAD" (rtos RAD))
(if (= (get_tile "CON"

"1"

(progn
(setq R2D RAD)
(set_tile "R2D" (rtos R2D))
))
(if (= (get_tile "RI"

"1"

(progn
(setq R2D (+ RAD (* RID REV)))
(set_tile "R2D" (rtos R2D))
))
(if (= (get_tile "R2"

"1"

(progn
(setq RID (/ (- R2D RAD) REV)
)
(set_tile "RID" (rtos RID))
))
)
((= Key "ANG"

(setq ANG (angtof Val))
(set_tile "ANG" (angtos ANG))
)
((= Key "HGT"

(setq HGT (atof Val))
(set_tile "HGT" (rtos HGT))
)
((= Key "R2D"

(setq R2D (atof Val)
RID (/ (- R2D RAD) REV)
)
(set_tile "R2D" (rtos R2D))
(set_tile "RID" (rtos RID))
)
((= Key "RID"

(setq RID (atof Val)
R2D (+ RAD (* RID REV))
)
(set_tile "RID" (rtos RID))
(set_tile "R2D" (rtos R2D))
)
((or (= Key "RES"

(= Key "RSS"

)
(setq RES (atoi Val))
(set_tile "RES" (itoa RES))
(set_tile "RSS" (itoa RES))
)
((= Key "REV"

(setq REV (atof Val))
(set_tile "REV" (rtos REV))
(if (= (get_tile "RI"

"1"

(progn
(setq R2D (+ RAD (* RID REV)))
(set_tile "R2D" (rtos R2D))
))
(if (= (get_tile "R2"

"1"

(progn
(setq RID (/ (- R2D RAD) REV))
(set_tile "RID" (rtos RID))
))
)
)
(HELIX_SEE)
)
;;-----------------------------------------------
;;
;; Listing 4 : Intialize dialog settings
;;
(defun HELIX_INIT ()
(setq RES 25
REV 2.0
HGT 0.25
ANG 0.0
RAD 1.0
RID 0.0
R2D 1.0
)
(set_tile "RES" (itoa RES))
(set_tile "RSS" (itoa RES))
(set_tile "REV" (rtos REV))
(set_tile "HGT" (rtos HGT))
(set_tile "ANG" (angtos ANG))
(set_tile "RAD" (rtos RAD))
(set_tile "R2D" (rtos R2D))
(set_tile "RID" (rtos RID))
(set_tile "CON" "1"

)
;;-----------------------------------------------
;; Listing 5 : Load and run dialog box.
;;
(defun HELIX_IN ()
(setq DH (load_dialog "HELIX.DCL"

)
(if (or (null DH)
(null (new_dialog "HELIX" DH)))
(alert "File HELIX.DCL missing!"

(progn ;;else file is okay, proceed
(HELIX_INIT)
(HELIX_SEE)
(setq TMP (start_dialog))
(done_dialog DH)
(if (= TMP 1) (progn
(setq CEN
(getpoint
"\nLocate HELIX center point: "

)
(if CEN 'T nil)
))
)
)
)
;;-----------------------------------------------
;;
;; Listing 6 - The Helix Generator
;;
(defun C:HELIX (
/
REV ;;number of revolutions
RES ;;resolution/ #of vertices
CEN ;;center point
RAD ;;radius
RID ;;radius increment
R2D ;;ending radius
ANG ;;angle
HGT ;;Z change / revolution
A360 ;; 2 * PI
Z ;;Z value of each point
AI ;;angle increment
ZI ;;Z increment
RI ;;rev counter increment/vertex
RDI ;;radius increment
CX ;;center point X
CY ;;center point Y
R ;;revolutions counter
PP ;;perentage over run at end
)
(if (HELIX_IN) (progn
(setq Z (caddr CEN)
A360 (* 2.0 PI)
AI (/ A360 RES)
ZI (/ HGT RES)
RDI (/ RID RES)
RI (/ 1.0 RES)
R 0.0
CX (car CEN)
CY (cadr CEN)
)
(prompt "\nGenerating helix..."

(entmake '((0 . "POLYLINE"

(10 0.0 0.0 0.0)
(70 . 8)
(8 . "0"

(66 . 1)
))
(while (< R REV)
(setq X (+ CX (* RAD (cos ANG)))
Y (+ CY (* RAD (sin ANG))))
(entmake (list
'(0 . "VERTEX"

(list 10 X Y Z)
'(8 . "0"

'(42 . 0.0)
'(70 . 32)
))
(setq ANG (rem (+ ANG AI) A360)
Z (+ Z ZI)
R (+ R RI)
RAD (+ RAD RDI)
)
)
(if (> R REV) (progn
(setq PP (/ (- R REV) RI)
ANG (- ANG (* PP AI))
RAD R2D
Z (- Z (* PP ZI))
)
(entmake (list
'(0 . "VERTEX"

(list 10 (+ CX (* RAD (cos ANG)))
(+ CY (* RAD (sin ANG)))
Z)
'(8 . "0"

'(42 . 0.0)
'(70 . 32)
))
))
(entmake '((0 . "SEQEND"

))
))
(princ)
)
;;-----------------------------------------------
;;
;; Listing 7 : View helix in image box
;;
(defun HELIX_SEE (
/
RES ;;resolution, set to 10 for image
ANGL ;;angle
DX ;;DimX multiplier
DY ;;DimY multiplier
DX2 ;;Center of X
DY2 ;;Center of Y
DYS ;;DimY size
SN ;;sine of 30
CS ;;cosine of 30
DD ;;Multiplier
Z ;;Z value
A360 ;;360 degrees in radians
AI ;;Angle increment
ZI ;;Z increment
RDI ;;Radius increment
RI ;;Revolution increment
R ;;Revolution counter
P1X ;;Point 1 X
P1Y ;;Point 1 Y
P2X ;;Point 2 X
P2Y ;;Point 2 Y
RD ;;Radius work value
)
;;
;; determine scale factor to use for world
;; units to image tile coordinates.
;;
(setq DX (dimX_tile "SEE"

DX2 (fix (/ DX 2.0)) ;;middle of X
DY (dimY_tile "SEE"

DY2 (fix (/ DY 2.0)) ;;middle of Y
DYS (- DY 10) ;;saved Y size
SN (sin (/ PI 6.0)) ;;30 degree tilt
CS (cos (/ PI 6.0)) ;;30 degree tilt
DX (/ DX ;;ratio of tile to world in X
(+ 1
(* 2.0 (max RAD R2D))) )
DY (/ DY ;;ratio of tile to world in Y
(+ 1
(* CS HGT REV)
(* SN (max RAD R2D))))
DD (min DX DY) ;;use min value
RES 10 ;;tile resolution fixed at 10
Z 0.0 ;;Z offset start at zero
A360 (* 2.0 PI) ;;full circle
AI (/ A360 RES) ;;increments of angle
ZI (/ HGT RES) ;;increments of Z
RDI (/ RID RES) ;;increments of radius
RI (/ 1.0 RES) ;;increments of circle
R 0.0 ;;start of circle
P1X (+ DX2 ;;starting X
(fix (* RAD (cos ANG) DD)))
P1Y (- DYS ;;starting Y
(+ (fix (* SN RAD (sin ANG) DD))
(fix (* CS Z DD))) )
ANGL (+ ANG AI) ;;starting angle
Z (+ Z ZI) ;;starting Z
RD RAD ;;starting radius
)
;;
;; Open image tile and clear it.
;;
(start_image "SEE"

(fill_image
0 0
(dimX_Tile "SEE"

(dimY_Tile "SEE"

0)
;;
;; Output the image tile vectors in loop
;;
(while (< R REV)
(setq P2X (+ DX2 ;;next point X
(fix (* RD (cos ANGL) DD)))
P2Y (- DYS ;;next point Y
(+ (fix (* SN RD (sin ANGL) DD))
(fix (* CS Z DD))))
)
;; shift? then output
(if (or (/= P1X P2X) (/= P1Y P2Y)) (progn
(vector_image P1X P1Y P2X P2Y 2)
(setq P1X P2X
P1Y P2Y)
))
;; next position
(setq ANGL (rem (+ ANGL AI) A360)
Z (+ Z ZI)
R (+ R RI)
RD (+ RD RDI)
)
)
;;
;; do last segment
;;
(if (> R REV) (progn
(setq PP (/ (- R REV) RI)
ANGL (- ANGL (* PP AI))
RD R2D
Z (- Z (* PP ZI))
P2X (+ DX2 (fix (* DD RD (cos ANGL))))
P2Y (- DYS
(+ (fix (* SN DD RD (sin ANGL)))
(fix (* CS Z DD))))
)
(if (or (/= P1X P2X) (/= P1Y P2Y))
(vector_image P1X P1Y P2X P2Y 2)
)
))
;;
;; close image tile and exit function
;;
(end_image)
)
;;-----------------------------------------------
(princ)