home *** CD-ROM | disk | FTP | other *** search
- ;
- ; ka.lsp - kenetic animation program for BIG D
- ;
- ; globals pathlist - the list of animation paths
- ; startframe - the starting frame number
- ; endframe - the ending frame number
- ; fps - the number of frames per second
- ;
-
- ;
- ; setpath - define an animation path for a block
- ;
-
- (princ "\nsetpath")
- (defun c:setpath ( / oldpdmode oldcmdecho oldaunits blk vl pl poly oldpath)
-
- ; save current settings
- (setq oldpdmode (getvar "PDMODE"))
- (setq oldcmdecho (getvar "CMDECHO"))
- (setq oldaunits (getvar "AUNITS"))
-
- ; set settings
- (setvar "PDMODE" 3)
- (setvar "CMDECHO" 0)
- (setvar "AUNITS" 0)
-
- ; initialize path list
- (command "HANDLES" "ON")
- (readbda)
-
- ; get polyline path
- (setq poly (getpoly "\nChoose polyline path: "))
- (prompt (strcat "\nPolyline name: " poly "\n"))
-
- ; see if path already exists
- (setq oldpath (findpath poly))
-
- ; get block to animate
- (setq blk (getblk oldpath))
-
- ; get vertex list info
- (if (null oldpath)
- (setq vl (getvert poly nil))
- (setq vl (getvert poly (cdr (assoc 'vertlist oldpath)))))
-
- ; build path info list
- (setq path (list (cons 'polyhand poly) (cons 'blkname blk)
- (cons 'layer (cdr (assoc 8 (entget (handent poly)))))
- (cons 'vertlist vl)))
-
- ; add path to path list
- (if (null oldpath)
- (setq pathlist (append pathlist (list path)))
- (setq pathlist (subst path oldpath pathlist)))
-
- ; ask to save new path list
- (initget 0 "Y N")
- (setq s (getkword "Save the current animation? <Y> "))
- (if (or (= s "Y") (null s))
- (progn
- (writebda)
- (writebat)
- )
- )
-
- ; restore settings
- (setvar "PDMODE" oldpdmode)
- (setvar "CMDECHO" oldcmdecho)
- (setvar "AUNITS" oldaunits)
-
- (princ)
- )
-
- ;
- ; delpath - delete an animation path from the path list
- ;
-
- (princ "\ndelpath")
- (defun c:delpath ( / oldpdmode poly path oldpathlist s)
-
- ; save current settings
- (setq oldpdmode (getvar "PDMODE"))
- (setq oldcmdecho (getvar "CMDECHO"))
-
- ; set settings
- (setvar "PDMODE" 3)
- (setvar "CMDECHO" 0)
-
- ; initialize path list
- (readbda)
-
- ; get polyline path
- (setq poly (getpoly "\nChoose polyline path to delete: "))
- (prompt (strcat "\nPolyline name: " poly "\n"))
-
- ; see if path already exists
- (setq oldpath (findpath poly))
-
- ; rebuild path list
- (setq oldpathlist pathlist
- pathlist nil)
- (foreach path oldpathlist
- (if (/= poly (cdr (assoc 'polyhand path)))
- (setq pathlist (append pathlist (list path)))
- )
- )
-
- ; ask to save new path list
- (initget 0 "Y N")
- (setq s (getkword "Save the current animation? <Y> "))
- (if (or (= s "Y") (null s))
- (progn
- (writebda)
- (writebat)
- )
- )
-
- ; restore settings
- (setvar "PDMODE" oldpdmode)
- (setvar "CMDECHO" oldcmdecho)
-
- (princ)
- )
-
- ;
- ; findpath - search for a polyline path in the path list
- ;
-
- (princ "\nfindpath")
- (defun findpath (poly / oldpath path)
- (setq oldpath nil)
- (foreach path pathlist
- (if (= poly (cdr (assoc 'polyhand path)))
- (setq oldpath path))
- )
- oldpath
- )
-
- ;
- ; getvert - get vertex info from user
- ;
-
- (princ "\ngetvert")
- (defun getvert (poly oldvl / ename vert vl time loc bulge elev rot value)
- (setq ename (handent poly) vl nil n 0)
- (while (and (setq ename (entnext ename))
- (= (cdr (assoc 0 (entget ename))) "VERTEX"))
-
- ; initialize vertex data
- (setq loc (cdr (assoc 10 (entget ename)))
- bulge (cdr (assoc 42 (entget ename))))
- (if (null oldvl)
- (setq time 0.0
- elev 0.0
- rot (list 0.0 0.0 0.0))
- (setq vert (nth n oldvl)
- time (/ (float (cdr (assoc 'frame vert))) 30.0)
- elev (caddr (cdr (assoc 'location vert)))
- rot (cdr (assoc 'rotation vert))
- n (1+ n))
- )
-
- (command "POINT" loc)
-
- ; get time
- (setq value (getreal (strcat "Time <" (rtos time) ">: ")))
- (if (not (null value))
- (setq time value))
-
- ; get elevation
- (setq value (getreal (strcat "Elevation <" (rtos elev) ">: ")))
- (if (not (null value))
- (setq elev value))
-
- ; get z rotation angle
- (setq value (getreal (strcat "Rotation <" (rtos (caddr rot)) ">: ")))
- (if (not (null value))
- (setq rot (list (car rot) (cadr rot) value)))
-
- ; get y rotation angle (pitch)
- (setq value (getreal (strcat "Pitch <" (rtos (cadr rot)) ">: ")))
- (if (not (null value))
- (setq rot (list (car rot) value (caddr rot))))
-
- ; get x rotation angle (roll)
- (setq value (getreal (strcat "Roll <" (rtos (car rot)) ">: ")))
- (if (not (null value))
- (setq rot (list value (cadr rot) (caddr rot))))
-
- (command "ERASE" "L" "")
- (setq vert (list (cons 'frame (* (fix time) 30))
- (cons 'location (list (car loc) (cadr loc) elev))
- (cons 'rotation rot) (cons 'bulge bulge)))
- (setq vl (append vl (list vert)))
- )
- vl
- )
-
- ;
- ; getblk - get a block name from the user
- ;
-
- (princ "\ngetblk")
- (defun getblk (oldpath / blk oldblk)
- (setq blk "")
- (if (null oldpath)
- (setq oldblk "")
- (setq oldblk (cdr (assoc 'blkname oldpath))))
- (while (= blk "")
- (setq blk (getstring (strcat "Block name <" oldblk ">: ")))
- (if (or (null blk) (= blk ""))
- (setq blk oldblk)
- (if (null (tblsearch "block" blk))
- (setq blk ""))
- )
- )
- (strcase blk)
- )
-
- ;
- ; settime - set global time parameters
- ;
-
- (princ "\nsettime")
- (defun c:settime ( / newfps newval s t)
- (if (or (null fps) (null startframe) (null endframe))
- (readbda))
-
- ; get start frame
- (setq t (/ (float startframe) 30.0))
- (setq t (getreal (strcat "\nStart time <" (rtos t 2 2) ">: ")))
- (if (boundp 't)
- (setq startframe (* (fix t) 30)))
-
- ; get end frame
- (setq t (/ (float endframe) 30.0))
- (setq t (getreal (strcat "\nEnd time <" (rtos t 2 2) ">: ")))
- (if (boundp 't)
- (setq endframe (* (fix t) 30)))
-
- ; get frames per second
- (setq newfps (getint (strcat "\nFrames per second <" (itoa fps)
- ">: ")))
- (if (boundp 'newfps)
- (setq fps newfps))
-
- ; ask to save new path list
- (initget 0 "Y N")
- (setq s (getkword "Save the current animation? <Y> "))
- (if (or (= s "Y") (null s))
- (progn
- (writebda)
- (writebat)
- )
- )
- (princ)
- )
-
- ;
- ; getpoly - get a polyline from the user
- ;
- ; returns - entity handle of selected polyline
- ;
-
- (princ "\ngetpoly")
- (defun getpoly (prompt / flag e)
- (setq flag t)
- (while flag
- (setq e (entsel prompt))
- (if (and e (= (cdr (assoc 0 (entget (car e)))) "POLYLINE"))
- (setq flag nil)
- (princ "\nMust be a polyline!\n")
- )
- )
- (cdr (assoc 5 (entget (car e))))
- )
-
- ;
- ; pv - preview the animation
- ;
-
- (princ "\npv")
- (defun c:pv ( / oldaunits oldpdmode oldcmdecho frame path f sldname)
-
- ; save initial state
- (setq oldpdmode (getvar "PDMODE"))
- (setq oldcmdecho (getvar "CMDECHO"))
- (setq oldaunits (getvar "AUNITS"))
-
- ; set states
- (setvar "PDMODE" 3)
- (setvar "CMDECHO" 0)
- (setvar "AUNITS" 0)
-
- ; initialize path list
- (readbda)
-
- ; initialize
- (setq frame startframe
- nframes (1+ (- endframe startframe)))
-
- ; open script file
- (setq f (open (strcat (getvar "DWGNAME") ".SCR") "w"))
-
- ; for each frame
- (while (<= frame endframe)
- ; locate each block
- (foreach path pathlist
- (setq ins (findins path frame)) ; get insertion info
- (command "UCS" "O" (car ins))
- (command "UCS" "Z" (rtos (caddr (cadr ins))))
- (command "UCS" "Y" (rtos (cadr (cadr ins))))
- (command "UCS" "X" (rtos (car (cadr ins))))
- (command "INSERT" (cdr (assoc 'blkname path)) "0,0" "" "" "")
- (command "UCS" "W")
- )
-
- ; write frame to slide file
- (setq sldname (strcat (substr (getvar "DWGNAME") 1 4)
- (int2str frame)))
- (command "MSLIDE" sldname)
-
- ; write command to script file
- (write-line (strcat "VSLIDE " sldname) f)
-
- ; delete inserted blocks
- (foreach path pathlist
- (command "ERASE" "L" "")
- )
-
- ; update time and frame counter
- (setq frame (+ frame (/ 30 fps)))
- )
-
- ; close script file
- (close f)
-
- ; restore previous state
- (setvar "AUNITS" oldaunits)
- (setvar "PDMODE" oldpdmode)
- (setvar "CMDECHO" oldcmdecho)
-
- ; run the animation
- (command "SCRIPT")
-
- (princ)
- )
-
- ;
- ; findcen - find arc center of a bulge
- ;
-
- (princ "\nfindcen")
- (defun findcen (pt0 pt1 bulge / alpha l r d m n h k)
- (setq alpha (* 4.0 (atan (abs bulge)))
- l (distance pt0 pt1)
- r (/ l (* 2.0 (sin (/ alpha 2.0))))
- d (sqrt (- (* r r) (* (/ l 2.0) (/ l 2.0))))
- m (* 0.5 (+ (car pt0) (car pt1)))
- n (* 0.5 (+ (cadr pt0) (cadr pt1))))
-
- (cond
- ((>= bulge 1.0)
- (setq h (+ m (/ (* (- (cadr pt1) (cadr pt0)) d) l))
- k (- n (/ (* (- (car pt1) (car pt0)) d) l))))
- ((>= bulge 0.0)
- (setq h (- m (/ (* (- (cadr pt1) (cadr pt0)) d) l))
- k (+ n (/ (* (- (car pt1) (car pt0)) d) l))))
- ((>= bulge -1.0)
- (setq h (+ m (/ (* (- (cadr pt1) (cadr pt0)) d) l))
- k (- n (/ (* (- (car pt1) (car pt0)) d) l))))
- (t
- (setq h (- m (/ (* (- (cadr pt1) (cadr pt0)) d) l))
- k (+ n (/ (* (- (car pt1) (car pt0)) d) l))))
- )
- (list h k (caddr pt0))
- )
-
- ;
- ; findins - find insertion information for a path at a time
- ;
-
- (princ "\nfindins")
- (defun findins (path frame / vl n vert ins f0 loc0 rot0 v0 bulge0
- f1 loc1 rot1 v1 bulge1 a x y z rx ry rz d ang0 ang1 dang)
-
- ; set up first vertex info
- (setq vl (cdr (assoc 'vertlist path))
- vert (nth 0 vl)
- f1 (cdr (assoc 'frame vert))
- loc1 (cdr (assoc 'location vert))
- rot1 (cdr (assoc 'rotation vert))
- bulge1 (cdr (assoc 'bulge vert))
- v1 0.0
- n 1
- ins nil
- a 0.0)
-
- ; check to see if time is before path starts
- (if (<= frame f1)
- (setq ins (list loc1 rot1))
- ; else
- (progn
- ; step through each vertex
- (while (setq vert (nth n vl))
- (setq f0 f1
- loc0 loc1
- rot0 rot1
- v0 v1
- bulge0 bulge1
- f1 (cdr (assoc 'frame vert))
- loc1 (cdr (assoc 'location vert))
- rot1 (cdr (assoc 'rotation vert))
- bulge1 (cdr (assoc 'bulge vert)))
-
- ; find length of segment
- (if (< (abs bulge0) 0.0001)
- (setq l (distance loc0 loc1)) ; is a line
- ;else
- (setq l (arclen loc0 loc1 bulge0))) ; is an arc
-
- ; find acceleration and ending velocity
- ; (setq a (* 2.0 (/ (- l (* v0 t1)) (* t1 t1)))
- ; v1 (+ (* 2.0 a l) v0))
- (setq a 0.0
- v1 (/ l (- f1 f0))
- v0 v1)
-
- ; see if frame is within the current segment
- (if (<= frame f1)
- (progn
- (setq d (/ (+ (* v0 (float (- frame f0)))
- (* 0.5 a (float (- frame f0))
- (float (- frame f0)))) l)
- z (+ (caddr loc0) (* d (- (caddr loc1)
- (caddr loc0)))))
- ;(textscr)
- ;(prin "findins: d = " d)
-
- (if (< (abs bulge0) 0.0001) ; if line
- (setq x (+ (car loc0) (* d (- (car loc1)
- (car loc0))))
- y (+ (cadr loc0) (* d (- (cadr loc1)
- (cadr loc0)))))
- ;else is an arc
- (progn
- (setq center (findcen loc0 loc1 bulge0)
- radius (distance loc0 center)
- ang0 (angle center loc0)
- ang1 (angle center loc1))
- ;(prin " ang0 = " ang0)
- ;(prin " ang1 = " ang1)
- ;(prin " bulge0 = " bulge0)
- (if (< bulge0 0.0) ; if clockwise arc
- (progn
- (setq dang (- ang0 ang1))
- (if (< dang 0.0)
- (setq dang (+ dang (* 2.0 pi))))
- (setq ang (- ang0 (* d dang)))
- )
- ;else this is a counterclockwise arc
- (progn
- (setq dang (- ang1 ang0))
- (if (< dang 0.0)
- (setq dang (+ dang (* 2.0 pi))))
- (setq ang (+ ang0 (* d dang)))
- )
- )
- (setq x (+ (car center) (* radius (cos ang)))
- y (+ (cadr center) (* radius (sin ang))))
- ;(prin " dang = " dang)
- ;(prin " ang = " ang)
- ;(prin " x = " x)
- ;(prin " y = " y)
- ;(getstring "Press Enter to continue...")
- )
- )
-
- (setq rx (+ (car rot0) (* d (- (car rot1) (car rot0))))
- ry (+ (cadr rot0) (* d (- (cadr rot1) (cadr rot0))))
- rz (+ (caddr rot0) (* d (- (caddr rot1) (caddr rot0))))
- ins (list (list x y z) (list rx ry rz))
- n 5000)
- )
- ; else
- (setq n (1+ n))
- )
- )
- )
- )
-
- ; see if ins has been found yet
- (if (null ins)
- (setq ins (list loc1 rot1)))
- ins
- )
-
- ;
- ; arclen - find length of an arc segment
- ;
-
- (princ "\narclen")
- (defun arclen (end0 end1 bulge / center radius ang0 ang1 l)
- (setq center (findcen end0 end1 bulge)
- radius (distance end0 center)
- ang0 (angle center end0)
- ang1 (angle center end1))
- (if (<= bulge 0.0) ; if clockwise
- (if (>= ang0 ang1)
- (setq l (* radius (- ang0 ang1)))
- ;else
- (setq l (* radius (+ ang0 (- (* 2.0 pi) ang1))))
- )
- ;else if counterclockwise
- (if (>= ang0 ang1)
- (setq l (* radius (+ ang1 (- (* 2.0 pi) ang0))))
- ;else
- (setq l (* radius (- ang1 ang0)))
- )
- )
- l
- )
-
- ;
- ; int2str - convert integer number into four digit string
- ;
-
- (princ "\nint2str")
- (defun int2str(i / s)
- (cond
- ((< i 10)
- (setq s (strcat "000" (itoa i))))
- ((< i 100)
- (setq s (strcat "00" (itoa i))))
- ((< i 1000)
- (setq s (strcat "0" (itoa i))))
- (t
- (setq s (itoa i)))
- )
- s
- )
-
- ;
- ; readbda - read bda file if it exists and initialize path list
- ;
-
- (princ "\nreadbda")
- (defun readbda ( / f s blk poly layr vl path vert frame loc rot bulge)
- (if (null fps)
- (setq fps 10))
- (if (null startframe)
- (setq startframe 0))
- (if (null endframe)
- (setq endframe 0))
- (if (and (null pathlist)
- (setq f (open (strcat (getvar "DWGNAME") ".BDA") "r")))
- (progn
- (setq fps 10)
- (while (setq s (read-line f))
- (cond
- ((= s "FPS")
- (setq fps (atoi (read-line f))))
- ((= s "STARTFRAME")
- (setq startframe (atoi (read-line f))))
- ((= s "ENDFRAME")
- (setq endframe (atoi (read-line f))))
- ((= s "PATH")
- (setq blk "" poly "" vl nil))
- ((= s "ENDPATH")
- (if (handent poly)
- (progn
- (setq path (list (cons 'polyhand poly)
- (cons 'blkname blk) (cons 'layer layr)
- (cons 'vertlist vl)))
- (setq pathlist (append pathlist (list path)))
- )
- ))
- ((= s "VERTEX")
- (setq vert nil
- frame 0
- loc (list 0.0 0.0 0.0)
- rot (list 0.0 0.0 0.0)
- bulge 0.0))
- ((= s "ENDVERT")
- (setq vert (list (cons 'frame frame)
- (cons 'location loc)
- (cons 'rotation rot)
- (cons 'bulge bulge)))
- (setq vl (append vl (list vert))))
- ((= s "BLKNAME")
- (setq blk (read-line f)))
- ((= s "POLYHAND")
- (setq poly (read-line f)))
- ((= s "LAYER")
- (setq layr (read-line f)))
- ((= s "FRAME")
- (setq frame (atoi (read-line f))))
- ((= s "LOCATION")
- (setq loc (list
- (atof (read-line f))
- (atof (read-line f))
- (atof (read-line f)))))
- ((= s "ROTATION")
- (setq rot (list
- (atof (read-line f))
- (atof (read-line f))
- (atof (read-line f)))))
- ((= s "BULGE")
- (setq bulge (atof (read-line f))))
- )
- )
- (close f)
- )
- )
- )
-
- ;
- ; writebda - write animation info to bda file
- ;
-
- (princ "\nwritebda")
- (defun writebda ( / f path vert pt)
- (if (setq f (open (strcat (getvar "DWGNAME") ".BDA") "w"))
- (progn
- ; write start frame
- (if (null startframe)
- (setq startframe 0))
- (write-line (strcat "STARTFRAME\n" (itoa startframe)) f)
-
- ; write end frame
- (if (null endframe)
- (setq endframe startframe))
- (write-line (strcat "ENDFRAME\n" (itoa endframe)) f)
-
- ; write frames per second
- (if (null fps)
- (setq fps 10))
- (write-line (strcat "FPS\n" (itoa fps)) f)
-
- ; write paths
- (foreach path pathlist
- (write-line "PATH" f)
- (write-line (strcat "BLKNAME\n" (cdr (assoc 'blkname path))) f)
- (write-line (strcat "POLYHAND\n" (cdr (assoc 'polyhand path)))
- f)
- (write-line (strcat "LAYER\n" (cdr (assoc 'layer path))) f)
-
- (foreach vert (cdr (assoc 'vertlist path))
- (write-line "VERTEX" f)
-
- ; write vertex frame
- (write-line (strcat "FRAME\n"
- (itoa (cdr (assoc 'frame vert)))) f)
-
- ; write vertex location
- (setq pt (cdr (assoc 'location vert)))
- (write-line (strcat "LOCATION\n"
- (rtos (car pt) 2 6) "\n"
- (rtos (cadr pt) 2 6) "\n"
- (rtos (caddr pt) 2 6)) f)
-
- ; write rotation angles
- (setq pt (cdr (assoc 'rotation vert)))
- (write-line (strcat "ROTATION\n"
- (rtos (car pt)) "\n"
- (rtos (cadr pt)) "\n"
- (rtos (caddr pt))) f)
-
- ; write bulge
- (write-line (strcat "BULGE\n"
- (rtos (cdr (assoc 'bulge vert)))) f)
-
- (write-line "ENDVERT" f)
- )
- (write-line "ENDPATH" f)
- )
- (write-line "EOF" f)
- (close f)
- )
- )
- (princ)
- )
-
- ;
- ; prin - print a variable
- ;
-
- (princ "\nprin")
- (defun prin (s v / )
- (textscr)
- (princ "\n")
- (princ s)
- (princ v)
- (princ)
- )
-
- ;
- ; pause - wait for user to press enter
- ;
-
- (princ "\npause")
- (defun pause ( / )
- (getstring "\nPress Enter to continue...")
- )
-
- ;
- ; writebat - write animation batch file
- ;
-
- (princ "\nwritebat")
- (defun writebat ( / f basename)
- (if (setq f (open (strcat (getvar "DWGNAME") ".BAT") "w"))
- (progn
- ; write batch initialization commands
- (write-line "ECHO OFF\nCLS" f)
-
- ; make sure bdx and bdv file exist
- (write-line (strcat "IF NOT EXIST " (getvar "DWGNAME")
- ".BDX GOTO NOBDX") f)
- (write-line (strcat "IF NOT EXIST " (getvar "DWGNAME")
- ".BDV GOTO NOBDV") f)
-
- ; make temporary copies of the bdx and bdv files
- (write-line (strcat "COPY " (getvar "DWGNAME") ".BDX TEMP.BDX") f)
- (write-line (strcat "COPY " (getvar "DWGNAME") ".BDV TEMP.BDV") f)
-
- ; determine base output file name
- (setq basename (substr (getvar "DWGNAME") 1 4))
-
- ; for each frame
- (setq frame startframe)
- (while (<= frame endframe)
- (write-line (strcat "BD3 " basename " "
- (itoa frame)) f)
- (write-line "IF ERRORLEVEL 1 GOTO ABORT" f)
- (write-line (strcat "BD4 TEMP " basename " 01") f)
- (write-line "IF ERRORLEVEL 1 GOTO ABORT" f)
- (write-line (strcat "BD5 TEMP " basename " 01") f)
- (write-line "IF ERRORLEVEL 1 GOTO ABORT" f)
- (write-line (strcat "IF EXIST " basename (int2str frame)
- ".TGA DEL " basename (int2str frame) ".TGA") f)
- (write-line (strcat "REN " basename "01.TGA " basename
- (int2str frame) ".TGA") f)
- (setq frame (+ frame (/ 30 fps)))
- )
-
- ; error handling
- (write-line "GOTO FINISHED" f)
- (write-line ":NOBDX" f)
- (write-line (strcat "ECHO File " (getvar "DWGNAME")
- ".BDX not found.") f)
- (write-line "GOTO ABORT" f)
- (write-line ":NOBDV" f)
- (write-line (strcat "ECHO File " (getvar "DWGNAME")
- ".BDV not found.") f)
- (write-line "GOTO ABORT" f)
- (write-line ":ABORT" f)
- (write-line "ECHO Animation generation failed." f)
- (write-line "GOTO END" f)
- (write-line ":FINISHED" f)
- (write-line "ECHO Animation generation completed." f)
- (write-line "GOTO END" f)
- (write-line ":END" f)
-
- (close f)
- )
- )
- )
-
- (princ)
-