;;; --------------------------------------------------------------------------;
;;; SPIRAL_F.LSP
;;;
;;; (Urprung SPIRAL.LSP)
;;; Copyright (C) 1990 by Autodesk, Inc.
;;;
;;; Permission to use, copy, modify, and distribute this software and its
;;; documentation for any purpose and without fee is hereby granted.
;;;
;;; THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
;;; ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
;;; MERCHANTABILITY ARE HEREBY DISCLAIMED.
;;;
;;; --------------------------------------------------------------------------;
;;; DESCRIPTION
;;;
;;; This is a programming example.
;;;
;;; Designed and implemented by Kelvin R. Throop in January 1985
;;;
;;; This program constructs a spiral. It can be loaded and called
;;; by typing either "spiral", "3dspiral" or the following:
;;; (cspiral <# rotations>
;;;
;;; ).
;;;
;;; --------------------------------------------------------------------------;
;;;
;;; mit Änderungen/Ergänzungen von flaschenpost (cad.de),13.03.2005
;;;
;;; --------------------------------------------------------------------------;
(defun myerror (s) ; If an error (such as CTRL-C) occurs
; while this command is active...
(if (/= s "Function cancelled")
(princ (strcat "\nError: " s))
)
(setvar "cmdecho" ocmd) ; Restore saved modes
(setvar "blipmode" oblp)
(setq *error* olderr) ; Restore old *error* handler
(princ)
)
(defun cspiral (ntimes bpoint hfac lppass strad vfac
/ ang dist tp ainc dhinc dvinc circle dv n)
(setvar "blipmode" 0) ; turn blipmode off
(setvar "cmdecho" 0) ; turn cmdecho off
(setq circle (* 3.141596235 2))
(setq ainc (/ circle lppass))
(setq dhinc (/ hfac lppass))
(if vfac (setq dvinc (/ vfac lppass)))
(setq ang (- 0.0 ainc))
(if vfac
(setq dist strad dv 0.0)
(setq dist 0.0)
)
(setq n 0)
(if (/= vfac 0)
(progn (if (minusp hfac)(command "_.3dpoly")(command "_.3dpoly" bpoint))) (progn (if (minusp hfac)(command "_pline")(command "_pline" bpoint)))
)
(repeat ntimes
(setq n (1+ n))
(repeat (if (= n ntimes)(1+ lppass) lppass)
(setq tp (polar bpoint (setq ang (+ ang ainc)) dist))
(setq dist (+ dist dhinc))
(setq tp (list (car tp) (cadr tp) (+ dv (caddr tp))))
(setq dv (+ dv dvinc))
(command tp) ; continue to the next point...
)
)
(if (minusp hfac)
(progn
(command (list(car bpoint)(cadr bpoint)(+ dv (caddr bpoint))) )
(command "")
)
(command "")
); until done
(princ)
)
;;;
;;; Interactive spiral generation
;;;
(defun C:SPIRAL (/ oldmode olderr ocmd oblp nt bp cf lp)
;;;;(setq olderr *error*
;;;; *error* myerror)
(setq ocmd (getvar "cmdecho"))
(setq oblp (getvar "blipmode"))
(setvar "cmdecho" 0)
(initget 1) ; bp must not be null
(setq bp (getpoint "\nMittelpunkt: "))
(initget 5) ; sr must not be zero, neg, or null
(setq sr (getdist bp "\nAnfangsradius eingeben oder zeigen: "))
(initget 5) ; cf must not be zero, or null
(while (= (setq cf (getdist bp "\nEndradius eingeben oder zeigen: ")) sr)
(prompt "\nAnfangs- und Endradius dürfen nicht gleich sein !")
)
(initget 7) ; nt must not be zero, neg, or null
(setq nt (getint "\nAnzahl Windungen: "))
(setq cf (/ (- cf sr) nt))
(initget 6) ; lp must not be zero or neg
(setq lp (getint "\nPunkte pro Windung <30>: "))
(cond ((null lp) (setq lp 30)))
(setq oldmode (getvar "osmode"))
(setvar "osmode" 0)
(cspiral nt bp cf lp sr 0)
(setvar "osmode" oldmode)
(setvar "cmdecho" ocmd)
(setvar "blipmode" oblp)
(setq *error* olderr) ; Restore old *error* handler
(princ)
)
;;;
;;; Interactive spiral generation
;;;
(defun C:3DSPIRAL (/ oldmode olderr ocmd oblp nt bp hg vg sr lp)
;;;;(setq olderr *error*
;;;; *error* myerror)
(setq ocmd (getvar "cmdecho"))
(setq oblp (getvar "blipmode"))
(setvar "cmdecho" 0)
(initget 1) ; bp must not be null
(setq bp (getpoint "\nMittelpunkt: "))
(initget 5) ; sr must not be zero, neg, or null
(setq sr (getdist bp "\nAnfangsradius eingeben oder zeigen: "))
(initget 5) ; cf must not be zero, or null
(while (and
(= (setq hg (getdist bp "\nEndradius eingeben oder zeigen: ")) sr)
(= sr 0)
);and
(prompt "\nEndradius darf nicht 0 sein, wenn Anfangsradius 0 ist !")
)
(initget 3) ; cf must not be zero, or null
(setq vg (getdist "\nHöhe der Spirale (positiv, negativ, ungleich 0): "))
(initget 7) ; nt must not be zero, neg, or null
(setq nt (getint "\nAnzahl Windungen: "))
(setq hg (/ (- hg sr) nt))
(setq vg (/ vg nt))
(initget 6) ; lp must not be zero or neg
(setq lp (getint "\nPunkte pro Windung <30>: "))
(cond ((null lp) (setq lp 30)))
(setq oldmode (getvar "osmode"))
(setvar "osmode" 0)
(cspiral nt bp hg lp sr vg)
(setvar "osmode" oldmode)
(setvar "cmdecho" ocmd)
(setvar "blipmode" oblp)
(setq *error* olderr) ; Restore old *error* handler
(princ)
)
;;; --------------------------------------------------------------------------;
(prompt "\nSPIRAL.LSP erfolgreich geladen ! ")
(prompt "\nAufruf mit SPIRAL (Polylinie) oder 3DSPIRAL (3D-Polylinie)")
(princ)