明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1644|回复: 2

土方计算的程序有问题

[复制链接]
发表于 2007-3-31 19:04 | 显示全部楼层 |阅读模式
各位兄弟,你们好!
       帮我看看这个土方计算程序为什么不能用啊,我加载这个程序后,选择闭合线及高程时,
      出现什么除数为0,不能生成网格线。望各位测绘兄弟帮我看看,兄弟感谢了
(defun c:tf (/ a nb np hr n i ai b la h hi s p p1)
(princ "选择高程及面积:")
(setq a (ssget '((0 . "text"))))
(setq na 0)
(setq nb 0)
(setq hp 0)
(setq hr 0)
(setq n (sslength a))
(setq i 0)
(repeat n
(setq ai (ssname a i))
(setq i (+ i 1))
(setq b (entget ai))
(setq la (cdr (assoc 8 b)))
(setq h (cdr (assoc 1 b)))
(setq hi (atof h))
(if (or
  (= la "YGC")
  (= la "ygc")
 )
(progn
 (setq na (+ na 1))
 (setq hp (+ hp hi))
)
)
(if (or
  (= la "XGC")
  (= la "xgc")
 )
(progn
 (setq nb (+ nb 1))
 (setq hr (+ hr hi))
)
)
(if (or
  (= la "MJ")
  (= la "mj")
 )
(progn
 (setq s (substr h 3))
 (setq s (atof s))
 (setq p (cdr (assoc 10 b)))
 (setq p1 (polar p 2 2))
)
)
)
(setq hp (/ hp na))
;(setq hp 11)
(setq hr (/ hr nb))
(setq v 0)
(setq v (* s (- hr hp)))
(setq v (rtos v 2 2))
(setq s (strcat "V=" v))
(setq pt1 (mapcar
  '+
  pt1
  '(0.8 0 0)
  )
)
(setq e (list (cons 0 "text") (cons 1 s) (cons 10 p1) (cons 40 0.8)))
(entmake e)
)
(defun c:v ()
(setq a (ssget '((0 . "TEXT"))))
(setq n (sslength a))
(setq i 0)
(setq s 0)
(repeat n
(setq ai (ssname a i))
(setq i (+ i 1))
(setq b (entget ai))
(setq attr (cdr (assoc 0 b)))
(if (= attr "TEXT")
(progn
 (setq t (cdr (assoc 1 b)))
 (if (< (atof t) 0.000001)
  (progn
  (setq si (atof (substr t 3)))
  (setq s (+ s si))
  )
 )
)
)
)
(setq p (getpoint "s_location:"))
(setq s (strcat "V=" (rtos s 2 2)))
(command "text" p 1 "" s)
)

(defun c:s ()
(setq a (ssget '((0 . "TEXT"))))
(setq n (sslength a))
(setq i 0)
(setq s 0)
(repeat n
(setq ai (ssname a i))
(setq i (+ i 1))
(setq b (entget ai))
(setq attr (cdr (assoc 0 b)))
(if (= attr "TEXT")
(progn
 (setq t (cdr (assoc 1 b)))
 (if (< (atof t) 0.000001)
  (progn
  (setq si (atof (substr t 3)))
  (setq s (+ s si))
  )
 )
)
)
)
(setq p (getpoint "s_location:"))
(setq s (strcat "S=" (rtos s 2 2)))
(command "text" p 1 "" s)
)
(defun c:aa (/ p a s)
(setq e (entlast))
(setq p (getpoint "input text point:"))
(command "BOUNDARY" p "")
(if (equal e (entlast))
(alert "BOUNDARY ERROR !")
(progn
(command "AREA" "O" "LAST")
(entdel (entlast))
(setq a (getvar "AREA"))
;(setq zzza(/ a 666.66667))
;(setq zzza(rtos zzza 2 2))
;(setq zzza(strcat "(合" zzza "亩)"))
(setq s (rtos a 2 2))
(setq s (strcat "S=" S))
;(setq s (strcat s "平方米" zzza))
(command "text" p "0.8" "" s)
)
)
)
(defun c:ygc ()
(setq pt1 (getpoint "输入设计高点位?"))
(setq pt1 (mapcar
  '+
  pt1
  '(0.6 -1.5 0)
  )
)
(setq str "7.10")
(setq e (list (cons 0 "text")
  (cons 1 str)
  (cons 8 "YGC")
  (cons 10 pt1)
  (cons 40 1)
  )
)
(entmake e)
)
(defun c:xgc ()
(setq pt1 (getpoint "点位?"))
(setq pt1 (mapcar
  '+
  pt1
  '(0.6 1.5 0)
  )
)
(setq str (getstring "Enter text:"))
(setq e (list (cons 0 "text")
  (cons 1 str)
  (cons 8 "XGC")
  (cons 10 pt1)
  (cons 40 1)
  )
)
(entmake e)
)
(defun tfxyz (ssent / len k ai g xyz x y z dxfvl vl)
(setq vl '())
(if ssent
(progn
(setq len (sslength ssent)
  k 0
)
(repeat len
 (setq ai (ssname ssent k)
  k  (1+ k)
 )
 (setq g (entget ai))
 (setq xyz (cdr (assoc 10 g))
  x  (car xyz)
  y  (cadr xyz)
 )
 (if (equal (strcase typ) "TEXT")
  (setq z (atof (cdr (assoc 1 g))))
  (setq z (caddr xyz))
 )
 (setq dxfvl (list x y z))
 (setq vl (append
   vl
   (list dxfvl)
   )
 )
)
)
(setq vl nil)
)
(setq vl vl)
)
(defun tfapf (fna str)
(setq fn (open fna "a"))
(princ str fn)
(close fn)
)
(defun c:zz (/ pa pb a b pc ab ac c)
(setq pa (getpoint "Specify first point:")
 pb (getpoint "Specify second point:")
 a (getreal "Specify first High:")
 b (getreal "Specify second High:")
)
(while (setq pc (getpoint "Specify start point:")
  ab (distance (list (car pa) (cadr pa))
    (list (car pb)
     (cadr pb)
    )
   )
  ac (distance (list (car pa) (cadr pa))
    (list (car pc)
     (cadr pc)
    )
   )
  c (+ a (* ac (/ (- b a) ab)))
  )
(setq e (list (cons 0 "TEXT")
   (cons 1 (rtos c 2 2))
   (cons 8 "YGC")
   (cons 10 pc)
   (cons 40 1.0)
   (cons 62 1)
  )
)
(entmake e)
)
)
(defun tftext (tf_la hh cc / pc c e)
(setq pc (getpoint)
 c (getreal)
)
(setq e (list (cons 0 "TEXT")
  (cons 1 (rtos c 2 2))
  (cons 8 tf_la)
  (cons 10 pc)
  (cons 40 hh)
  (cons 62 cc)
  )
)
(entmake e)
)
(defun c:xx () (tftext "sdg" 1.0 1))
(defun c:ss () (tftext "sjg" 1.5 6))
(defun c:bb (/ a b pa pb ab c e)
(setq a (getreal "高程:")
 b (getreal "请输入比例系数:")
 pa (getpoint "起点:")
)
(while (setq pb (getpoint "到下一个点文本位置:")
  ab (distance (list (car pa) (cadr pa))
    (list (car pb)
     (cadr pb)
    )
   )
  c (+ a (* ab b))
  )
(setq e (list (cons 0 "TEXT")
   (cons 1 (rtos c 2 2))
   (cons 8 "YGC")
   (cons 10 pb)
   (cons 40 8.0)
   (cons 62 1)
  )
)
(entmake e)
)
)
(defun c:sdg (/ i lts typ i p0 d str sd sj e px py pe z lts)
(setvar "dimzin" 3)
(SETQ TYP "TEXT")
(prompt "起点距离")
(setq i (getdist))
(prompt "剖面线起点:")
(while (setq p0 (getpoint))
(setq d (strcat "0+" (rtos i 2 2) "\n"))
(tfapf "d:/sdg.txt" d)
(tfapf "d:/sjg.txt" d)
(setq str (ssget '((0 . "TEXT"))))
(setq sd (ssget "p" '((8 . "sdg"))))
(command "select" str "")
(setq sj (ssget "p" '((8 . "sjg"))))
(command "chprop" str "" "c" 2 "")
(foreach e (tfxyz sd)
(setq px (car p0)
  py (cadr p0)
  p0 (list px py)
)
(setq pe (list (car e) (cadr e)))
(setq d (distance p0 pe))
(setq d (rtos d 2 2))
(setq z (rtos (caddr e) 2 2))
(tfapf "d:/sdg.txt" d)
(tfapf "d:/sdg.txt" " ")
(tfapf "d:/sdg.txt" z)
(tfapf "d:/sdg.txt" "\n")
)
(foreach e (tfxyz sj)
(setq px (car p0)
  py (cadr p0)
  p0 (list px py)
)
(setq pe (list (car e) (cadr e)))
(setq d (distance p0 pe))
(setq d (rtos d 2 2))
(setq z (rtos (caddr e) 2 2))
(tfapf "d:/sjg.txt" d)
(tfapf "d:/sjg.txt" " ")
(tfapf "d:/sjg.txt" z)
(tfapf "d:/sjg.txt" "\n")
)
(prompt "请量取到下一根剖面线的距离")
(setq lts (getdist))
(setq i (+ lts i))
(prompt "剖面线起点:")
)
)

发表于 2007-4-2 16:24 | 显示全部楼层

本人刚接触Lisp,看懂都是问题,

不过,捧个人场吧!

发表于 2007-5-17 10:06 | 显示全部楼层
本帖最后由 作者 于 2007-5-17 10:46:21 编辑

拿第一个函数说事:



(defun  C:TF  (/  A  NB  NP  HR  N  I AI  B  LA  H  HI
  S  P  P1)

  (princ   "\n选择包含\"高程及面积\"的文字对象:")

   ;;修改点1:加入if判断,使在没有选取到对象时,能够安全退出

   (if   (setq   A   (ssget   '((0 09900">0 .  "text"))))


   (progn
   (setq   NA   0)


   (setq   NB   0)


   (setq   HP   0)


   (setq   HR   0)


   (setq   N   (sslength   A))


   (setq   I   0)


   (repeat   N


   (setq   AI   (ssname   A   I))


   
(setq   I   (+  I   1))


   
(setq   B   (entget  AI))


   
(setq   LA   (cdr   (assoc   8   B)))


   
(setq   H   (cdr   (assoc   1   B)))


   
(setq   HI   (atof   H))




   
;;修改点2:使用cond比if效率更高、代码更简


   
(setq   LA   (strcase   LA))


   
(cond


   
;;Y高程 图层


   ((=   LA   "YGC")


   
(setq   NA   (+   NA   1))


   
(setq   HP   (+   HP   HI))


   
)


   
;;X高程 图层


   
((=   LA   "XGC")


   
(setq   NB   (+   NB   1))


   
(setq   HR   (+   HR   HI))


   
)


   
;;面积 图层


   
((=   LA   "MJ")


   
(setq   S   (substr   H   3))


   
(setq   S   (atof   S))


   
(setq   P   (cdr   (assoc   10  B)))


   
(setq   P1   (polar   P   2   2))


   
)


   
;;截断处理


   
(t


   
(princ   (strcat   "\n第 "   (itoa  I)   " 个对象被排除"))


   
)


   
)


   
)
   ;_结束 repeat




     
;;修改点3:对NA NB等于0的情况进行判别处理


     
(if   (or   (=   NA   0)


     
(=   NB   0)


     
(=   S   0)


     
)


     
()


     
(progn


     
(setq   HP   (/   HP   NA))


     
(setq   HR   (/   HR   NB))


     
(setq   V   (*   S   (-   HR   HP)))


     
(setq   V   (rtos   V   2   2))


     
(setq   S   (strcat   "V="   V))


     
(setq   PT1   (mapcar      '+       PT1  '(0.8   0   0)     )     )


         
(setq  E   (list   (cons   0   "text")


         
(cons   1   S)


         
(cons   10   P1)


         
(cons   40   0.8)


         
)


                 
)


                 
(entmake   E)


                 
)

)

)

)

(princ)
)
这个论坛对htm格式的帖子不能很好显示,完美显示参见:http://zml84.blog.sohu.com/46385038.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-19 06:56 , Processed in 0.200799 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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