找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1178|回复: 5

[转贴]:用lisp写的计算线长的程式

[复制链接]
发表于 2003-4-12 11:04:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
这是网友写的,能对圆、线段的长度求和。
  1. ;;计算线长的程序
  2. (defun c:abk ()
  3. (setvar "cmdecho" 0)
  4. (command "layer" "S" "0" "")
  5. (setq p  (/ pi 2.0)
  6.       g (+ pi p))
  7.    (setq aa (ssget))
  8.   (setq i 0)
  9.    (setq ab (ssadd))
  10.    (repeat (sslength aa)
  11.     (setq aab (ssname aa i))
  12.      (setq bb (cdr (assoc 0 (entget aab))))
  13.      (cond ((= bb "LINE")
  14.            (setq pd (list aab (cdr (assoc 10 (entget aab)))))
  15.      ))
  16.      (cond ((= bb "CIRCLE")
  17.            (setq pd (list aab (cdr (assoc 10 (entget aab)))))
  18.      ))
  19.      (cond ((= bb "ARC")
  20.            (setq pd (list aab (cdr (assoc 10 (entget aab)))))
  21.      ))   
  22. (cond ((= i 0)
  23. (setq j 0)
  24. (cond ((= j 0)
  25. (cond ((/= bb "LINE")
  26. (setq aad 0)))
  27. (cond ((/= bb "CIRCLE")
  28. (setq bad 0)))
  29. (cond ((/= bb "ARC")
  30. (setq cad 0)))))))
  31. (setq j (+ j 1))
  32. (cond ((= bb "LINE")
  33. (setq st (cdr (assoc 11 (entget aab))))
  34. (setq qed (cdr (assoc 10 (entget aab))))
  35. (setq ad (distance st qed))
  36. (cond ((= i 0)
  37. (setq aad ad)))
  38. (cond ((>= i 1)
  39. (setq aad (+ ad aad))))
  40. ))            
  41. (cond ((= bb "CIRCLE")
  42.   (setq aeed (cdr (assoc 40 (entget aab))))
  43.   (setq ad (* aeed pi 2.0))
  44. (cond ((= i 0)
  45. (setq bad ad)))
  46. (cond ((>= i 1)
  47. (setq bad (+ ad bad))))
  48. ))
  49. (cond ((= bb "ARC")
  50.   (setq ast (cdr (assoc 50 (entget aab))))
  51.   (setq sst (cdr (assoc 51 (entget aab))))
  52.   (setq beed (cdr (assoc 40 (entget aab))))
  53. (cond ((>= ast 0)
  54. (cond ((< ast p)
  55. (cond ((> ast sst)
  56. (cond ((>= (* pi 2.0))
  57. (setq xb (- ast sst))))
  58. (cond ((> sst 0)
  59. (setq xb1 (- p ast))
  60. (setq xb (+ g xb1 sst))))))
  61. (cond ((< ast sst)
  62. (cond ((>= sst 0)
  63. (setq xb1 (- p ast))
  64. (setq xb (+ pi xb1 sst))))
  65. (cond ((< sst (* pi 2.0))
  66. (cond ((< sst p)
  67. (setq xb (- sst ast))))
  68. (cond ((< sst pi)
  69. (setq xb1 (- p ast))
  70. (setq xb2 (- sst p))
  71. (setq xb (+ xb1 xb2))))
  72. (cond ((< sst g)
  73. (setq xb1 (- p ast))
  74. (setq xb2 (- sst pi))
  75. (setq xb (+ xb1 xb2 p))))
  76. (cond ((< sst (* pi 2.0))
  77. (setq xb1 (- p ast))
  78. (setq xb2 (- sst g))
  79. (setq xb (+ xb1 xb2 pi))))
  80. ))
  81. ))
  82. ))))
  83. (cond ((>= ast p)
  84. (cond ((< ast pi)
  85. (cond ((> ast sst)
  86. (cond ((<= sst p)
  87. (setq xb1 (- ast p))
  88. (setq xb2 (- p sst))
  89. (setq xb (- (* pi 2.0)xb1 xb2))))
  90. (cond ((> sst p)
  91. (setq xb (- (* pi 2.0)(- ast sst)))))))
  92. (cond ((< ast sst)
  93. (setq xb (- sst ast))))
  94. ))))


  95. (cond ((>= ast pi)
  96. (cond ((< ast g)
  97. (cond ((> ast sst)
  98. (cond ((> sst 0)
  99. (setq xb2 sst)
  100. (setq xb1 (- g ast))
  101. (setq xb (+ xb1 xb2 p))))
  102. (cond ((>= sst p)
  103. (setq xb1 (- ast pi))
  104. (setq xb2 (- pi sst))
  105. (setq xb (- (* pi 2.0) xb1 xb2))))
  106. (cond ((>= sst pi)
  107. (setq xb1 (- g ast))
  108. (setq xb2 (- sst pi))
  109. (setq xb (+ g xb1 xb2))))
  110. (cond ((> sst g)
  111. (setq xb1 (- sst pi))
  112. (setq xb2 (- g ast))
  113. (setq xb (+ xb1 xb2 g))))
  114. ))
  115. (cond ((< ast sst)
  116. (setq xb (- sst ast))))
  117. ))))
  118. (cond ((>= ast g)
  119. (cond ((< ast (* pi 2.0))
  120. (cond ((> ast sst)
  121. (cond ((>= sst g)
  122. (setq xb1 sst)
  123. (setq xb2 (- (* pi 2.0)ast))
  124. (setq xb (+ xb1 xb2))))
  125. (cond ((< sst g)
  126. (setq xb1 (- sst g))
  127. (setq xb2 (- (* pi 2.0)ast))
  128. (setq xb (+ g xb1 xb2))))
  129. ))
  130. (cond ((< ast sst)
  131. (setq xb (- sst ast))))
  132. ))))
  133. (setq ad (* beed xb))
  134. (cond ((= i 0)
  135. (setq cad ad)))
  136. (cond ((>= i 1)
  137. (setq cad (+ ad cad))))
  138. ))
  139.   (setq i (+ 1 i)))
  140. (setq aaad (+ aad bad cad))
  141. (setq ai aaad)
  142. (setq aai (rtos ai 2 4))
  143. (setq abi "<")
  144. (setq aci ">")
  145. (setq adi "线段总长为:")
  146. (princ (strcat adi abi aai aci))
  147. (command "pickbox" 3)
  148. (princ)
  149. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-4-26 18:03:08 | 显示全部楼层
还可再精炼一点,哪个改写出来,有加分
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-4-28 08:19:59 | 显示全部楼层

  1. vlisp是非常簡短,要純lisp那要想想??
  2. 原来只计算LINE,CIRCLE,ARC的总长,重写比较快(纯LISP)
  3. (defun C:ABK (/ SS N SUMLEN ENT BB EPT SPT LEN RAD ANG)
  4.   (setq SS (ssget '((0 . "line,circle,arc"))))
  5.   (setq        N 0
  6.         SUMLEN 0
  7.   )
  8.   (if (/= NIL SS)
  9.     (repeat (sslength SS)
  10.       (setq ENT (entget (ssname SS N)))
  11.       (setq BB (cdr (assoc 0 ENT)))
  12.       (cond
  13.         ((= BB "LINE")
  14.          (setq EPT (cdr (assoc 11 ENT)))
  15.          (setq SPT (cdr (assoc 10 ENT)))
  16.          (setq LEN (distance SPT EPT))
  17.         )
  18.         ((= BB "CIRCLE")
  19.          (setq LEN (* pi 2 (cdr (assoc 40 ENT))))
  20.         )
  21.         ((= BB "ARC")
  22.          (setq SPT (cdr (assoc 50 ENT))
  23.                EPT (cdr (assoc 51 ENT))
  24.                RAD (cdr (assoc 40 ENT))
  25.          )
  26.          (if (> EPT SPT)
  27.            (setq ANG (- EPT SPT))
  28.            (setq ANG (+ EPT (- (* 2 pi) SPT)))
  29.          )
  30.          (setq LEN (* RAD ANG))
  31.         )
  32.       )
  33.       (setq SUMLEN (+ SUMLEN LEN))
  34.       (setq N (1+ N))
  35.     )
  36.   )
  37.   (prompt (strcat "线段总长为:<" (rtos SUMLEN) ">"))
  38.   (princ)
  39. )

  40. 计算CIRCLE,ELLIPSE,LINE,*POLYLINE,SPLINE,ARC的总长
  41. (defun C:LENOF (/ CURVE TLEN SS N SUMLEN)
  42.   (vl-load-com)
  43.   (setq SUMLEN 0)
  44.   (setq SS (ssget '((0 . "CIRCLE,ELLIPSE,LINE,*POLYLINE,SPLINE,ARC"))))
  45.   (setq N 0)
  46.   (repeat (sslength SS)
  47.     (setq CURVE (vlax-ename->vla-object (ssname SS N)))
  48.     (setq TLEN (vlax-curve-getdistatparam
  49.                  CURVE
  50.                  (vlax-curve-getendparam CURVE)
  51.                )
  52.     )
  53.     (setq SUMLEN (+ SUMLEN TLEN))
  54.     (setq N (1+ N))
  55.   )
  56.   (print (strcat "总长度: " (rtos SUMLEN 2 5)))
  57.   (princ)
  58. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-20 18:42:32 | 显示全部楼层
楼主最后加上(alert (strcat "总长度: " (rtos SUMLEN 2 5)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2007-1-25 20:56:06 | 显示全部楼层
增加一个吧!用来求MLine的长度和。

  1. (defun ml-length (ename / j d ptlist)
  2.   (foreach n (entget ename)
  3.     (if (= (car n) 11)
  4.       (setq ptlist (cons (cdr n) ptlist))
  5.     )
  6.   )
  7.   (reverse ptlist)
  8.   (setq j 0 d 0)
  9.   (repeat (1- (length ptlist))
  10.     (setq d (+ d (distance (nth j ptlist) (nth (1+ j) ptlist))))
  11.     (setq j (1+ j))
  12.   )
  13.   d
  14. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-3-13 12:54:02 | 显示全部楼层
LUCAS  
你太强了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 23:31 , Processed in 0.188426 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表