Now, for the graphing functions:(vl-load-com)
;;; Draw a spline along the points defined by evaluating the formula,
;;; incrementing X by a factor from startpoint to endpoint.
;;; forumla = Prefix (lisp-like) list to be evaluated. Only allowed
;;; X as a variable
;;; start = Starting value for X
;;; stop = End value for X
;;; increment = A number to increment X by at each step
(defun GraphFX2D (formula start stop increment / x lst pt1 pt2 array spline t1 t2 n)
(setq x stop
pt2 (list x (eval formula) 0.)
x start
pt1 (list x (eval formula) 0.)
x (- start increment)
t1 (mapcar '- pt1 (list x (eval formula) 0.))
x (+ stop increment)
t2 (mapcar '- (list x (eval formula) 0.) pt2)
x start
n 0)
(while (< (setq x (+ x increment)) stop) (setq lst (append lst (list x (eval formula) 0.))))
(setq array (vlax-make-safearray vlax-vbdouble (cons 0 (+ 5 (length lst)))))
(vlax-safearray-fill array (append pt1 lst pt2))
(setq spline (vla-AddSpline (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-make-variant array) (vlax-3d-point t1) (vlax-3d-point t2)))
(vla-put-FitTolerance spline 0.)
(vla-put-Degree2 spline 3)
(vla-put-SplineFrame spline 1)
(vla-put-SplineMethod spline 0)
(while (< (setq x (+ x increment)) stop) (vla-SetFitpoint spline (setq n (1+ n)) (vlax-3d-point x (eval formula) 0.)))
spline)
;;; Draw a 3d Mesh along the points defined by evaluating the formula,
;;; incrementing X & Y by a factor from startpoint to endpoint.
;;; forumla = Prefix (lisp-like) list to be evaluated. Only allowed
;;; X and Y as variables
;;; Xstart = Starting value for X
;;; Xstop = End value for X
;;; Xincr = A number to increment X by at each step
;;; Ystart = Starting value for Y
;;; Ystop = End value for Y
;;; Yincr = A number to increment Y by at each step
(defun GraphFX3D (formula Xstart Xstop Xincr Ystart Ystop Yincr / x y m n lst array)
(setq m 0 y (- Ystart Yincr) Xstop (+ Xstop Xincr) Ystop (+ Ystop Yincr))
(while (< (setq y (+ y Yincr)) Ystop)
(setq m (1+ m) x (- Xstart Xincr))
(while (< (setq x (+ x Xincr)) Xstop)
(setq lst (cons (eval formula) (cons y (cons x lst)))))
(if (not n) (setq n (length lst))))
(setq array (vlax-make-safearray vlax-vbdouble (cons 0 (1- (length lst)))))
(vlax-safearray-fill array (reverse lst))
(vla-Add3dMesh (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) m n (vlax-make-variant array)))
Some samples:
(GraphFX2D (infix->prefix "0.2*x^2-5") -10.0 10.0 0.5)
(graphFX3D (infix->prefix "(y^2-x^2)/10.") -10. 10. 0.5 -10. 10. 0.5)