自己写了一个关于算曲面面积的lisp。但是执行时间很长。应该是调用command "explode"比较耗时。
请大神们看看怎么能让它执行得更快。
 - (defun 3pt_mj (pt1 pt2 pt3 / a b c p s);三点求面积
- (if (/= pt1 pt2 pt3)
- (progn
- (setq a (distance pt1 pt2))
- (setq b (distance pt1 pt3))
- (setq c (distance pt2 pt3))
- ;海伦公式求面积
- (setq p (/(+ a b c)2))
- (setq s (abs(sqrt(* p (- p a)(- p b)(- p c)))))
- )
- (alert "\n有重合的点。请核对。")
- )
- s
- )
- (defun C:tt (/ ent entity i mj mj1 ptlst ss tymj)
- (setvar "cmdecho" 0)
- (setq ss (ssget '((0 . "ACAD_PROXY_ENTITY"))))
- (setq i 0 MJ 0 tymj 0)
- (repeat (sslength ss)
- (command "UNDO" "be")
- (setq ent (cdr(assoc -1 (entget(ssname ss i)))))
- (setq Entity (entlast))
- (command "explode" ss)
- (setq ptlst nil)
- (while
- (setq Entity (entnext Entity))
- (setq ent (entget Entity))
- (setq ptlst (append ptlst (list(cdr(assoc 10 ent)))))
- )
- ;====算面积=======
- (setq mj1 (3pt_mj (car ptlst)(cadr ptlst)(caddr ptlst)))
- (setq MJ (+ MJ mj1))
- (setq i (1+ i))
- (command "undo" "e" "undo" "1")
- )
- (alert (strcat "\n所选取图像面积为:" (rtos (/ MJ 1000000)2 3)"平方米。" ))
- (setvar "cmdecho" 1)
- (princ)
- )
该贴已经同步到 取个长点勒名字的微博 |