明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1016|回复: 5

[求助]请各位高手帮我改下这个程序,谢谢

[复制链接]
发表于 2008-5-2 17:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2008-5-2 17:08:24 编辑

(defun myerr (s) 
  (if (/= s "Function cancelled")
      (if (/= s "quit/exit abord")
          (princ (strcat "\nERROR:" s))
      )
  )
  (setq *error* olderr)
  (setvar "osmode" os) 
  (setq olderr nil PT nil qarea nil os nil allarea nil adda nil)
)

;; write area value to drawing 
(defun C:CA(/ os PT STA qarea txtfile fd end os allarea allareastr qa qar num numstr adda tmp lst stri tmp str i s)


  (setq olderr *error*)
  (setq *error* myerr)
  (setq os (getvar "OSMODE"))
  (setvar "CMDECHO" 0)
  (setvar "OSMODE" 0) 

  (setq filepath (getvar "DWGPREFIX")) 
  (setq txtfile (strcat filepath "面积计算成果.txt")) 
  (setq fd (open txtfile "r"))
  (setq num 1)
  (setq allarea 0.0)

   (if (/=fd nil)
     (progn
       (WHILE (SETQ s (read-line fd));读取最后一行
          (SETQ str s)
       )
     ;;初始化
  (setq lst '()
        tmp ""
        i   1
  )
  ;;判断分割符的位置并切割      这个将最后一行文件内容分割出来的程序老是不对  请大家指点一下!!!
  (while (/= (setq stri (substr str i 1)) "")
      (if (= stri ",")
        (progn
   (setq lst (cons tmp lst)
         tmp ""
   )
   (setq tmp (strcat tmp stri))
        )
      )
      (setq i (1+ i))
  )
   (setq lst (reverse (cons tmp lst)))
  (if (>= (length lst) 3)
      (setq num (atof (nth 0 lst)))
      (setq allarea (atof (nth 2 lst)))
  )                
     )  
  )


  (setq fd (open txtfile "a")) 
  
    
  (command"-layer""m""面积计算""c""1""""")

  (setq end "begin")
  (setq STA nil)
 
(while(/= end "Y")
  
  (setq os (getvar "osmode")) 
 
  (setq PT (getpoint "\nPick the point:"))
  (setq STA (BPOLY PT))


  (if (= STA nil) (exit)) 
  (COMMAND "AREA" "E" "L")
  (setq qarea (RTOS (getvar "AREA") 2 3)) 
  (setq allarea (+(atof qarea) allarea))
  (setq allareastr(rtos allarea 2 3))
  (setq qa (strcat "第" (itoa num) "块面积为:" qarea))
  (COMMAND "TEXT" PT "" "" qa) 
 
  (setq adda (strcat "共提取" (itoa num) "块总面积为:" allareastr))

  (prompt (strcat "\n" qa " " adda))

  (setq numstr(itoa num)) 


;;写入文件

 
  (write-line (strcat numstr","qarea","allareastr) fd) 
  (close fd)


  (setq num (1+ num))
  (setq end(getstring "\n结束面积提取(Y/N):"))
  (setq end(strcase end))
 
  (setvar "osmode" os)
 )
   

  (setvar "OSMODE" OS)
  (Setvar "CMDECHO" 1)
  (setq *error* olderr)
  (princ) 

)

附文本文件的内容格式为:

1,24.452,24.452

2,5.651,30.103

.......

....

15,45.365,5648.412

。。。

行数不定

发表于 2008-5-2 17:22 | 显示全部楼层

读取最后一行
15,45.365,5648.412


这个将最后一行文件内容分割出来的程序老是不对
您要得出的是什么?

 楼主| 发表于 2008-5-2 17:44 | 显示全部楼层

回楼上, 其实我的程序的目的是如果存在 面积计算成果.txt 这个文件,那么就把文件的最后一行读出,以进行继续累加。

例如最后一行是15,45.365,5648.412   (其中15是指原来已经提取到第15块的面积,45.365指第15块的面积,5648.412指提取的15块区域面积的累加值)

我希望能得到num=15(这样可以接着原先的序号),allarea=5648.412(接原来已提取的总面积继续累加 直到提取结束)

请大家帮忙看下   谢谢

发表于 2008-5-2 18:51 | 显示全部楼层
本帖最后由 作者 于 2008-5-5 20:08:05 编辑

注意:文件打开后要关闭。下面是改过的程序,试试看。再试试。
  1. (defun C:CA(/ os PT STA qarea txtfile fd end os allarea allareastr qa qar num numstr
  2. adda tmp lst stri tmp str i s)
  3. (setq olderr *error*)
  4. (setq *error* myerr)
  5. (setq os (getvar "OSMODE"))
  6. (setvar "CMDECHO" 0)
  7. (setvar "OSMODE" 0)
  8. (setq filepath (getvar "DWGPREFIX"))
  9. (setq txtfile (strcat filepath "面积计算成果.txt"))
  10. (if (findfile txtfile) (progn
  11.   (setq fd (open txtfile "r"))
  12.   (WHILE (SETQ s (read-line fd));读取最后一行
  13.    (SETQ str s)
  14.   )
  15.   (close fd)
  16.      ;;初始化
  17.   (setq lst '() tmp "" i 1)
  18.   ;;判断分割符的位置并切割      这个将最后一行文件内容分割出来的程序老是不对  请大家指点一下!!!
  19.   (repeat (strlen str)
  20.    (if (= (setq stri (substr str i 1)) ",")
  21.     (setq lst (cons tmp lst) tmp "")
  22.     (setq tmp (strcat tmp stri))
  23.    )
  24.    (setq i (1+ i))
  25.   )
  26.   (setq lst (reverse (cons tmp lst)))
  27.   (if (>= (length lst) 3)
  28.    (setq num (atoi (car lst)) allarea (atof (last lst)))
  29.   )
  30.   (setq fd (open txtfile "a"))
  31. )
  32.   (setq num 1 allarea 0.0 fd (open txtfile "w"))
  33. )
  34. (command "-layer" "m" "面积计算" "c" "1" "" "")
  35. (setq end "begin")
  36. (setq STA nil)
  37. (while (/= end "Y")
  38.   (setq os (getvar "osmode"))
  39.   (setq PT (getpoint "\nPick the point:"))
  40.   (setq STA (BPOLY PT))
  41.   (if (/= STA nil) (progn
  42.    (COMMAND "AREA" "E" "L")
  43.    (setq num (1+ num))
  44.    (setq qarea (RTOS (getvar "AREA") 2 3))
  45.    (setq allarea (+ (atof qarea) allarea))
  46.    (setq allareastr (rtos allarea 2 3))
  47.    (setq qa (strcat "第" (itoa num) "块面积为:" qarea))
  48.    (COMMAND "TEXT" PT "" "" qa)
  49.    (setq adda (strcat "共提取" (itoa num) "块总面积为:" allareastr))
  50.    (prompt (strcat "\n" qa " " adda))
  51.    (setq numstr(itoa num))
  52.    (write-line (strcat numstr "," qarea "," allareastr) fd)  ;;写入文件
  53.    (setq end (strcase (getstring "\n结束面积提取(Y/N):")))
  54.    (setvar "osmode" os)
  55.   ))
  56. )
  57. (close fd)
  58. (setvar "OSMODE" OS)
  59. (Setvar "CMDECHO" 1)
  60. (setq *error* olderr)
  61. (princ)
  62. )
 楼主| 发表于 2008-5-5 18:48 | 显示全部楼层

版主,我运行了你修改的程序,还是有问题 ,提示参数错误

主要还是中间的切割文件内容的程序有错误.

  麻烦版主以及各位高手再帮忙看看。。。

发表于 2008-5-5 20:17 | 显示全部楼层
四楼已改
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-9 21:43 , Processed in 0.141482 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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