如图所示,autolisp读取.txt文件中的数据

我将如图数据存放在E盘中,用下面的程序来读取,想实
现的功能是,读取其中的数据,并将对应行的值赋值到第一行的字母,
然后画一个三角形。比如我想以L3来判定哪一行,例如输入200时,
取得第四行(100 16 200 200 200),
中间程序应该怎么写
(setq TXT (open (findfile "E:/sj.TXT") "r"))
(setq B (getreal ""))(if (= L3 B)
……
……
(setq p1 (getpoint"")
(setq p2(polar p1 0 L1)
(seq p3(polar p2 (/ pi 2) L2)
(command "line" p1 p2 p3 "")

AutoCAD读取是以每一行来读取的,你这样配置的话,在读取过程当中还要对文字分析来确认读取从第几个到第几个的数值。

我一般的情况下,直接读取第几行就可以。

你这个要写一个子程序来分析字串符。我读取与写入都用子程序来完成。

    如果你输入200,那么就读取第4行

    第4行字串符分析以空为界分别得到L1 L2 L3,组成表(list L1 L2 L3)返回

    然后提取表里面内容绘制三角形

    由于整个过程都是重复的,所以编写子程序,接收数值,返回长度组合的表。

    子程序也可以把数据写入文本。

    只要测试成功了子程序,其它的就不用重复编写了。

(defun MJHF1 ( / data data_list ff)
 (setvar "cmdecho" 0)
 (setvar "blipmode" 0)
 (setq ff (open "d://autolisp//autolisp//新文件//MJL3.txt" "r")) ;;打开并读取文件
 (setq data (read-line ff))                             ;;读取第一个内容
 (setq data_list '())                                   ;;声明一个空列表
 (while data                                            ;;如果内容不为空循环写入列表
  (setq data_list (cons data data_list))                ;;第一个内容写入列表
  (setq data (read-line ff))                            ;;读取下一个
 )
 (setq data_list (reverse data_list))                   ;;颠倒列表顺序
 (close ff)                                             ;;关闭文件
 data_list                                              ;;列表
)
;;;;;;;;;;;;;;;;;;;;;;;;;;数据%k写入文本中第n位置;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun MJHF2 (%k n / data_list ff %k n);;子程序输入内容及位置
 (setq data_list (MJHF1));;取得文件列表
 (setq ff (open "d://autolisp//autolisp//新文件//MJL3.txt" "w"));;重新写入内容
 (if (/= n 1) (MJHF3 data_list ff n) );;如果不是第1个数据那么前(N-1)位写入文本
 (princ %k ff);;写入第n位数据
 (princ "\n" ff);;结束
 (MJHF4 data_list ff n);;写入第N位以后的数据
 (close ff);;关闭文本
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun MJHF3 (data_list ff n / i data_list ff n);;列表的前几位写入文本
 (setq i 0)                         ;;设置数值
 (repeat (- n 1)                    ;;决定循环次数
  (write-line (nth i data_list) ff) ;;写入文本
  (setq i (+ i 1))                  ;;继续写入
 )                                  ;;循环完成
)                                   ;;程序结束
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun MJHF4 (data_list ff n / data data_list ff n);;把第n项数据以后的写入文本ff
 (setq data nil)                    ;;重新设置值
 (setq data (nth n data_list))      ;;提取元素
 (if (/= data nil)                  ;;如果不为空
  (progn                            ;;那么
   (while data                      ;;开始循环
    (write-line data ff)            ;;写入文本
    (setq n (+ n 1))                ;;下一个
    (setq data (nth n data_list))   ;;元素提取
   )                                ;;循环结束
  )                                 ;;判断
 )                                  ;;结束
)                                   ;;程序结束
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun MJHF5 ( / h hh)
 (setq h (atof (MJHF7 2)))
 (setq hh (getdist (strcat "\n请输入文字高度毫米<" (rtos h 2 2) ">")))  ;;要求输入文字高度
 (if (= hh nil) (setq hh h) )                                   ;;如果没有输入保持默认
 (MJHF2 hh 2)                                                   ;;文字高度是第2个
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun MJHF6 ( / #os)
 (setq #os (getvar "osmode"))                                   ;;提取捕捉设置
 (MJHF2 #os 3)                                                  ;;捕捉元素是第三个
)
;;;;;;;;;;;;;;提取文本中第N位元素;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun MJHF7 (n / data_list #k n)                                 ;;提取第N位元素
 (setq n (- n 1))
 (setq data_list (MJHF1));;取得列表
 (setq #k (nth n data_list));;取得列表第N位数据
 #k
)

以上我是读取与写入子程序。如果要读取第一行数据(setq #k1 (MJHF7 1))就读取

如果要写入内容到第一行:(setq #k "E") (MJHF2 #k 1);就会写入第一行。

你参考一下

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答