Autocad命令从数据文件或Excel读取坐标

 

本文实现使cad命令自动读取一些已知点的坐标。以画点(point)、画线(line)命令为例。

一、line命令

由于这个命令本身要求连续输入多个点,所以可以在命令提示下将包括多行坐标的数据复制粘贴过来就可以了。数据格式是每行一个点的坐标:
x,y,z
x,y,z
...

测试用的数据如下:

421.5966,-58.3922,0
286.3538,-58.3922,219.1385
421.5966,135.1312,219.1385
286.3538,135.1312,0
421.5966,-58.3922,0

以上数据可以在记事本里输入,选中所有行复制(ctrl+c),在line命令提示输入第一点时,粘贴即可(ctrl+v)。但从Excel里复制更有意义,因为实践中坐标值常常是经过计算处理得到的。在Excel中坐标数据可以类似这样组织(假设从左上角开始放数据,当然也可以选择任意位置):

            A                   B            C                              D
1    421.5966    -58.3922    0                     =A1 & "," & B1 & "," & C1
2    286.3538    -58.3922    219.1385      =A2 & "," & B2 & "," & C2
3    421.5966   135.1312    219.1385      =A3 & "," & B3 & "," & C3
4    286.3538   135.1312    0                     =A4 & "," & B4 & "," & C4
5    421.5966    -58.3922    0                     =A5 & "," & B5 & "," & C5

其中1-5是行号,A、B、C列分别存放x,y,z坐标,D列的公式是将对应的x,y,z组合成一个点的坐标格式,即将单独的x,y,z坐标用逗号连接起来,实际上在excel单元格中默认是显示公式运算结果的。不用每行都输入一遍公式,只在第一行的D1输入公式,然后将D1复制到下面几个单元格就可以了(向下拖动D1右下角的十字也可复制)。数据准备好后,选中D1至D5单元格,ctrl+c复制,在line命令提示输入第一点时ctrl+v粘贴即可。

二、point命令

由于这个命令本身只要求输入一个点的坐标,如果要根据数据文件自动画出多点,就不能通过复制一批坐标数据来达到目的。解决方法是编写一段autolisp程序。

假设数据文件是 E:\study\autocad\test.txt,内容如下:
421.5966     -58.3922      0
286.3538     -58.3922     219.1385
421.5966     135.1312     219.1385
286.3538     135.1312     0

其中每一行代表一个点的坐标,注意x,y,z坐标中间是用空格分开,而不是用逗号

编写函数如下:
(defun c:test()
  (setq fp (open "E:/study/autocad/test.txt" "r"))  ;以只读方式打开数据文件,注意路径根据自已实际情况修改
  (while (setq pt (read-line fp))    ;读取一行数据(代表坐标的字符串),如"421.5966 -58.3922 0"
    (setq pt (strcat "(" pt ")"))  ;在字符串前后加括号,如"(421.5966 -58.3922 0)"
    (setq pt (read pt))  ;将字符串转换成list列表,如(421.5966 -58.3922 0),下面对read函数做进一步说明
    (command "point" pt)  ;调用autocad的point命令画点
  )
  (close fp)
)

将上面的函数保存为test.lsp文件,在autocad中执行:
(load "E:/study/autocad/test.lsp")  (空格或回车)
test  (空格或回车)
执行完毕后最好用ddptype命令设置一下点的样式,才能清楚地看到程序画出的点。

三、read函数的进一步说明

上面程序中的read函数功能是获取字符串中第一个元素,这个元素也可以是一个list,例如:
(read "a b c") 返回a
(read "(a) b c") 返回(a)

因为从文件中读出的坐标实际上是字符串,不能用于point命令,所以使用read函数转换为list。

需要注意的是read函数的显示精度问题,比如上面测试数据中的421.5966这个数,执行
(setq tt 421.5966),结果显示:
421.597
经试验这个结果只是显示结果,内部其实还是421.5966,所以不用担心read函数的精度。
我们可以做下试验:
试验1:执行
(setq tt 421.5966)
(> tt 421.5966666666)
结果返回nil,而不是T,按照显示的421.597那么tt应该是大于421.5966666666的,实际上却是nil,因为tt内部其实还是421.5966,当然比421.5966666666小了!!
试验2:执行
(setq tt 421.5966)
(setq fp (open "E:/study/autocad/test2.txt" "w"))
(write-line (rtos tt) fp)
(close fp)
即将tt保存到文件test2.txt,然后打开test.txt看里面的数到底是多少,结果发现test.txt中保存的数是421.5966,而不是显示的421.597。

 

 

你可能感兴趣的:(c,list,Excel,command,测试,FP)