写入和读取文本文件
我想制作一个lisp,使cad能够与excell进行通信。我知道有一种写作和阅读的方式。csv文件,我稍后会研究它,但我真的很喜欢文本文件的多功能性。所以我想知道它是如何工作的,我已经找到了这个线程,其中编写了一个示例代码(我将在这里发布,如下)。我真正希望你们能帮助我的是:
-在帮助文件中指出,我可以在哪里找到有关“open”命令的信息,因为我自己找不到它
找到了!!!有没有办法去掉这条线?如果找不到我的答案,我会转发,但现在看来我可以自己继续了。。。
-如果可能的话,教我如何允许用户选择保存文件的目录(希望它在帮助文件中)
这是代码(但请继续阅读,我也会要求更多的东西)
;ronjonp, sorry for kidnaping your code and thanks for writing it
(defun c:pts2file (/ pts e file openf)
(vl-load-com)
(if (and (setq e (car (entsel)))
(= (cdr (assoc 0 (entget e))) "LWPOLYLINE")
(setq pts (mapcar 'cdr
(vl-remove-if-not
(function (lambda (pt) (= (car pt) 10)))
(entget e)
)
)
)
(setq file (strcat (getvar 'dwgprefix)
(getvar 'dwgname)
"__points.txt"
)
)
(setq openf (open file "w"))
)
(progn
(foreach pt pts
(write-line (vl-prin1-to-string pt) openf)
)
(close openf)
)
)
(princ file)
(princ)
)
好啊这应该会将项目信息发送到excell,用户将在其中更改部分信息并导出到另一个文本文件(实际上,用户将在该文件中放入一组完全不同的信息)。
然后,当然,我需要从另一个文本文件中获取信息并转换为绘图。我该怎么做?
我的意思是,我应该如何告诉AutoCad,这个信息是点的坐标,这个信息是我想要绘制线的图层,等等
在课程的最后阶段,我希望完全摆脱excell,但我需要采取一些小步骤来理解我在做什么。。。
GetField公司
..... 我又回到这个问题上,似乎无法理解我遇到的错误。此时,我想要的是读取文本文件的第一行。
(稍后,我将阅读每一行,然后将一行中的值分开,根据这些值绘制一条多段线,最后根据excell计算的输出绘制一整张图。但那要晚得多)
我认为问题可能在于打开文件。当我试图写一个文件时,用这种方式处理文件是有效的。
但当我向AutoCad询问文件的值时,它给了我一个“nil”值。让我展示目前为止的代码:
(defun c:fstattempt()
(setq dflt (strcat (getvar 'dwgprefix) (substr (getvar 'dwgname) 1 (- (strlen (getvar 'dwgname)) 4)) )) ; give the file a default name
(setq flname (getfiled "esse é o título da cx de diálogo" dflt "txt" ) ; use function getfileid to allow user to search for the file
(setq arq (open flname r)) ; open file for reading and stores it in a variable
(read-line arq) ; read a line from the open file
(close arq) ; close file
)
(defun c:scnattempt()
(setq dflt (strcat (getvar 'dwgprefix) "valores vindos do excell.txt")) ; thats the file name, it does exist in the drawing folder
(princ dflt) ; show onscreen the file name, for debugging
(setq arq (open dflt r)) ; open file for reading and stores it in a variable
(setq lineread (read-line arq)) ; read a line from the open file, store it in a variable
(close arq) ; close file
)
我试着把打开文件的单行放在提示符上(在运行了几次这些尝试之后,文件名就会出现在设计的变量上),我一直收到“错误的参数类型”错误,所以我认为这就是问题所在。
但我无法理解。应该是那样开的,对吗?
帮助
顺便说一句
“getfileid”函数返回的变量只是文件名,带有扩展名(在本例中为“valores vindos do excel.txt”,将转换为“values from excel.txt”)。它没有完整的路径名。难道它没有完整的路径名吗?如果没有完整路径,autocad还能打开这样的文件吗?如果路径与图形路径不同,如何让用户将其告知autocad? 也许可以尝试:
(if (setq flname (getfiled ... blablabla)) (setq arg (open flname "r")) )
注意“r”
也:
(setq input (read-line arg)) 第二rlx
打开文件以读取“R”
打开文件以写入“W”
请结合“读取文件”查看Lee mac的“读取csv文件”。
; example of reading multiple lines
; thanks to Lee-mac for this defun
; www.lee-mac.com
(defun _csv->lst ( str / pos )
(if (setq pos (vl-string-position 44 str))
(cons (substr str 1 pos) (_csv->lst (substr str (+ pos 2))))
(list str)
)
)
(setq fname (open "P:\\Autodesk\\lisp\\civilcad6layercodes.txt" "r"))
(while (setq layercode (read-line fname)) ; it will stop after last line is read
(setq lst (_csv->lst layercode)) ; list of all the csv values
.......... your code
)
令人惊叹的我确实在写信息的lisp上使用了引号,但时间太长了,我忘记了它——当阅读它作为编写“read”lisp的参考时,我没有注意到。使用它可以阅读这句话,非常感谢!
我仍然不知道如何去下一行,但我还没有找到它。当我再次被绊倒时,我会告诉你的(前面还有很长的路要走,毫无疑问,这是会发生的)。
我不知道有一个标准字符(逗号)来分隔列表值。我使用分号是因为在巴西,Excell(以及除autoCad之外的所有其他工具)使用逗号作为小数分隔符。当我试图将这些值从一个程序转移到另一个程序时,我没有意识到我肯定会遇到的问题。当然,我会花一点时间通过代码更改这些值,但也许你们可以向我展示一些标准的方法。
顺便问一句,在这样的文件上总是用逗号分隔,还是分号也可以用? 我们的文件控制系统也使用|作为分隔符。CSV代表逗号分隔的值,所以对于我们(欧洲人)来说使用。在我们的数字中比逗号句号更有意义!哈哈
gr.Rlx 看看这一点点代码
复制到命令行并输入,
你会看到44出现
重复并键入;和59出现
将Lees代码中的44改为59和;将起作用。
这是任何键的Ascii码。请参阅(chr x)也用于反向 谢谢,伙计们。
问题是,一半的相关程序(cad)使用“.”作为十进制分隔符,另一半(excell)使用“,”。
没有逃脱的办法,我必须处理好。这项研究是关于在VBA或LISP中何时处理它。
比格尔,那条信息让我有了选择。在此之前,我只需要使用VBA。现在,我可以找到更简单的方法(我认为它仍然是VBA,excell确实有一些有用的转换,我只需要寻找它们)。
我会处理好的(我希望如此),别担心。
Bigal,我还在嚼Lee mac的代码(递归代码对我来说很痛苦),但我就是找不到代码中说“转到下一行”的部分。当我到达终点时它会这样做吗?如果是这样,使用“read line”-n次将返回-n行?(我更喜欢循环,只是想理解) 在lisp中,您无法直接读取某个行号,因此您已经全部读取了这些行号,或者直到(通过测试)找到所需行号。例如,您可以找到某个字符串。否则你就一直读到最后。因此,您可以通过创建文件指针“setq fp open filename for reading”来打开文件,然后可以读取每一行,直到到达最后一行。每个“读取行”都会给你一个结果,一个字符串。但是如果你的应用程序已经读取了所有的行,那么read line返回nil,这样你就知道你已经到达了文件的末尾。
6
页:
[1]