作者Egriawei (谁来档一下小七狮)
站内Cad_Cae
标题[心得] 计算2D元体长度by autolisp
时间Tue May 27 02:27:23 2008
主要是靠lengthen指令与perimeter系统变数来完成
如果有兴去挑战的版友可以自己试着写看看
本来我自己还有另外写一套计算各种2d图元的副程式
不过有现成的lengthen可以用就用之,省的跟spline奋斗
lisp使用方法可以参考我前一篇面域加总或其他有讨论lisp的文章
以下为len2d.lisp的程式码
使用len2d指令然後照提示操作即可
会要求输入两个整数参数(都按enter则使用预设)
再来请选取要加总长度的2d图元
视需要除了印出总长还可以有条列资料印出(不过大概不需要)
程式效率就先不要求了(因为lengthen一定会印出东西来,cmdecho设0也没用)
不会太慢不用担心
另外如果要求只计算某图层的图元
先以手动的方法切换到只显示该图层吧
虽然ssget "X" 过滤选集加个条件很快
不过我懒的写XD
(直接抓lisp档)
http://0rz.tw/094bD
;len2d.lisp
;;;=============Copyright=============
;;;此为简易2d线段长度计算及加总程式
;;;作者为台大BBS站PTT Egriawei
;;;欢迎使用及添改,惟请注明参考出处
;;;若有问题请来信讨论,请多指教
;;;===================================
(defun c:len2d (/ ssa mode isprint sum)
;===环境设定===
(graphscr) ;叫出图框
;;;物件锁点等设定请视个人情况调整添改
;===提示与参数输入===
(princ "********************************************************\n")
(princ "框选或连(单)选欲计算及加总长度的2d线段")
(princ "(需为line,pline,spline,arc,circle,ellipse)\n")
(princ "********************************************************\n")
(setq mode (getint "选取模式:[(1)自行选取(2)全选图面]<预设自行选取>:")
mode (if mode mode 1)
isprint (getint "输出模式:[(1)仅列总长(2)条列及总长]<预设仅列总长>:")
isprint (if (= isprint 2) "t" "f")
)
;===程式执行===
(setq ssa (ssadd)
ssa (get2dss mode)
sum (len2d ssa isprint)
)
;===程式结束===
(princ (strcat "\n所选取2d图元总长为" (rtos sum) "\n计算完毕!\n"))
(princ)
)
;===2d线段图元蒐集副程式===
(defun get2dss (mode / ss ssa en en_data entype i)
;(princ (strcat "mode is " (itoa mode) "\n"))
(setq ssa (ssadd) ;2d线段图元集合
i 0 ;起始值变数
)
(cond
((= mode 1)
(progn
(setq ss (ssget)) ;图元集合
(if (/= ss nil)
(repeat (sslength ss)
(setq en (ssname ss i) ;取集合第一个图元
en_data (entget en) ;图元资料
entype (cdr (assoc 0 en_data)) ;图元种类
i (1+ i) ;next
)
(if (or (= entype "LINE") (= entype "LWPOLYLINE")
(= entype "CIRCLE") (= entype "ARC")
(= entype "ELLIPSE") (= entype "SPLINE")
)
(setq ssa (ssadd en ssa)) ;若为2d线段图元则蒐集入ssa选择集
)
);end-repeat
);end-if
);end-mode1-progn
);end-mode1
((= mode 2)
(progn
(setq ssa (ssget "X" (list (cons -4 "<OR")
(cons 0 "LINE") (cons 0 "LWPOLYLINE")
(cons 0 "CIRCLE") (cons 0 "ARC")
(cons 0 "ELLIPSE") (cons 0 "SPLINE")
(cons -4 "OR>")
)
)
);以选集过滤器方式蒐集2d线段图元
);end-mode2-progn
);end-mode2
(t (princ (strcat "未定义的mode:" (itoa mode))));end-t
);end-cond
ssa
)
;===计算2d图元长度副程式===
(defun len2d (ssa isprint / en en_data entype ename lenlist
i len sum
)
(setq i 0 sum 0.0 lenlist nil)
(if (/= ssa nil)
(progn
(repeat (sslength ssa)
(setq en (ssname ssa i) ;取得集合第一个图元
len (get_perimeter en) ;计算图元长度
sum (+ sum len) ;加总
lenlist (if (= isprint "t") (cons len lenlist))
i (1+ i)
)
);end-repeat
);end-if-progn
);end-if
(if (= isprint "t")
(progn
(princ "\n")
(setq i 0
lenlist (reverse lenlist)
)
(repeat (sslength ssa)
(setq en (ssname ssa i) ;取集合第一个图元
en_data (entget en) ;图元资料
entype (cdr (assoc 0 en_data)) ;元体类型
ename (cdr (assoc -1 en_data)) ;元体名称
)
(princ ename)
(princ (strcat "类型:" entype ";线段长:" (rtos (nth i lenlist)) "\n"))
(setq i (1+ i))
);end-repeat
);end-if-progn
);end-if
sum;回传总长
)
;===计算有周长图元之长度副程式===
(defun get_perimeter (en / len)
(command "lengthen" en "")
(setq len (getvar "perimeter"));取得周长
)
;================================
(princ "2d线段长度计算及加总程式len2d.lsp\n")
(princ "<c:len2d>\n")
(princ)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.168.197.195
※ 编辑: Egriawei 来自: 118.168.197.195 (05/27 02:42)
1F:推 s9122405:Eg大大是高手! 推一个~ 05/27 22:44