乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 77|回复: 9

[编程交流] 写入和读取文本文件

[复制链接]

12

主题

44

帖子

32

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-5 15:28:13 | 显示全部楼层 |阅读模式
我想制作一个lisp,使cad能够与excell进行通信。我知道有一种写作和阅读的方式。csv文件,我稍后会研究它,但我真的很喜欢文本文件的多功能性。
所以我想知道它是如何工作的,我已经找到了这个线程,其中编写了一个示例代码(我将在这里发布,如下)。我真正希望你们能帮助我的是:
-在帮助文件中指出,我可以在哪里找到有关“open”命令的信息,因为我自己找不到它
找到了!!!有没有办法去掉这条线?如果找不到我的答案,我会转发,但现在看来我可以自己继续了。。。
-如果可能的话,教我如何允许用户选择保存文件的目录(希望它在帮助文件中)
这是代码(但请继续阅读,我也会要求更多的东西)
  1. ;ronjonp, sorry for kidnaping your code and thanks for writing it
  2. (defun c:pts2file (/ pts e file openf)
  3. (vl-load-com)
  4. (if (and (setq e (car (entsel)))
  5.       (= (cdr (assoc 0 (entget e))) "LWPOLYLINE")
  6.       (setq pts (mapcar 'cdr
  7.                 (vl-remove-if-not
  8.                   (function (lambda (pt) (= (car pt) 10)))
  9.                   (entget e)
  10.                 )
  11.             )
  12.       )
  13.       (setq file (strcat (getvar 'dwgprefix)
  14.                  (getvar 'dwgname)
  15.                  "__points.txt"
  16.              )
  17.       )
  18.       (setq openf (open file "w"))
  19.      )
  20.    (progn
  21.      (foreach pt pts
  22.    (write-line (vl-prin1-to-string pt) openf)
  23.      )
  24.      (close openf)
  25.    )
  26. )
  27. (princ file)
  28. (princ)
  29. )

 
好啊这应该会将项目信息发送到excell,用户将在其中更改部分信息并导出到另一个文本文件(实际上,用户将在该文件中放入一组完全不同的信息)。
然后,当然,我需要从另一个文本文件中获取信息并转换为绘图。我该怎么做?
我的意思是,我应该如何告诉AutoCad,这个信息是点的坐标,这个信息是我想要绘制线的图层,等等
 
在课程的最后阶段,我希望完全摆脱excell,但我需要采取一些小步骤来理解我在做什么。。。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 15:38:13 | 显示全部楼层
 
GetField公司
.....
回复

使用道具 举报

12

主题

44

帖子

32

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-5 15:46:56 | 显示全部楼层
我又回到这个问题上,似乎无法理解我遇到的错误。此时,我想要的是读取文本文件的第一行。
(稍后,我将阅读每一行,然后将一行中的值分开,根据这些值绘制一条多段线,最后根据excell计算的输出绘制一整张图。但那要晚得多)
 
我认为问题可能在于打开文件。当我试图写一个文件时,用这种方式处理文件是有效的。
但当我向AutoCad询问文件的值时,它给了我一个“nil”值。让我展示目前为止的代码:
 
  1. (defun c:fstattempt()
  2. (setq dflt (strcat (getvar 'dwgprefix) (substr (getvar 'dwgname) 1 (- (strlen (getvar 'dwgname)) 4)) )) ; give the file a default name
  3. (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
  4. (setq arq (open flname r)) ; open file for reading and stores it in a variable
  5. (read-line arq) ; read a line from the open file
  6. (close arq) ; close file
  7. )
  8. (defun c:scnattempt()
  9. (setq dflt (strcat (getvar 'dwgprefix) "valores vindos do excell.txt")) ; thats the file name, it does exist in the drawing folder
  10. (princ dflt) ; show onscreen the file name, for debugging
  11. (setq arq (open dflt r)) ; open file for reading and stores it in a variable
  12. (setq lineread (read-line arq)) ; read a line from the open file, store it in a variable
  13. (close arq) ; close file
  14. )

 
我试着把打开文件的单行放在提示符上(在运行了几次这些尝试之后,文件名就会出现在设计的变量上),我一直收到“错误的参数类型”错误,所以我认为这就是问题所在。
 
但我无法理解。应该是那样开的,对吗?
帮助
 
顺便说一句
“getfileid”函数返回的变量只是文件名,带有扩展名(在本例中为“valores vindos do excel.txt”,将转换为“values from excel.txt”)。它没有完整的路径名。难道它没有完整的路径名吗?如果没有完整路径,autocad还能打开这样的文件吗?如果路径与图形路径不同,如何让用户将其告知autocad?
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 15:49:31 | 显示全部楼层
也许可以尝试:
 
  1. (if    (setq flname (getfiled ... blablabla))     (setq arg (open flname "r"))   )  

 
注意“r”
 
也:
 
  1. (setq input (read-line arg))
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 15:57:41 | 显示全部楼层
第二rlx
 
打开文件以读取“R”
打开文件以写入“W”
 
请结合“读取文件”查看Lee mac的“读取csv文件”。
 
  1. ; example of reading multiple lines
  2. ; thanks to Lee-mac for this defun
  3. ; www.lee-mac.com
  4. (defun _csv->lst ( str / pos )
  5. (if (setq pos (vl-string-position 44 str))
  6.    (cons (substr str 1 pos) (_csv->lst (substr str (+ pos 2))))
  7.    (list str)
  8.    )
  9. )
  10. (setq fname (open "P:\\Autodesk\\lisp\\civilcad6layercodes.txt" "r"))
  11. (while (setq layercode (read-line fname)) ; it will stop after last line is read
  12. (setq lst (_csv->lst layercode)) ; list of all the csv values
  13. .......... your code
  14. )
回复

使用道具 举报

12

主题

44

帖子

32

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-5 16:02:33 | 显示全部楼层
令人惊叹的我确实在写信息的lisp上使用了引号,但时间太长了,我忘记了它——当阅读它作为编写“read”lisp的参考时,我没有注意到。使用它可以阅读这句话,非常感谢!
我仍然不知道如何去下一行,但我还没有找到它。当我再次被绊倒时,我会告诉你的(前面还有很长的路要走,毫无疑问,这是会发生的)。
 
我不知道有一个标准字符(逗号)来分隔列表值。我使用分号是因为在巴西,Excell(以及除autoCad之外的所有其他工具)使用逗号作为小数分隔符。当我试图将这些值从一个程序转移到另一个程序时,我没有意识到我肯定会遇到的问题。当然,我会花一点时间通过代码更改这些值,但也许你们可以向我展示一些标准的方法。
顺便问一句,在这样的文件上总是用逗号分隔,还是分号也可以用?
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 16:13:31 | 显示全部楼层
我们的文件控制系统也使用|作为分隔符。CSV代表逗号分隔的值,所以对于我们(欧洲人)来说使用。在我们的数字中比逗号句号更有意义!哈哈
 
 
gr.Rlx
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:17:21 | 显示全部楼层
看看这一点点代码
复制到命令行并输入,
 
你会看到44出现
重复并键入;和59出现
将Lees代码中的44改为59和;将起作用。
 
这是任何键的Ascii码。请参阅(chr x)也用于反向
回复

使用道具 举报

12

主题

44

帖子

32

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-5 16:26:23 | 显示全部楼层
谢谢,伙计们。
问题是,一半的相关程序(cad)使用“.”作为十进制分隔符,另一半(excell)使用“,”。
没有逃脱的办法,我必须处理好。这项研究是关于在VBA或LISP中何时处理它。
比格尔,那条信息让我有了选择。在此之前,我只需要使用VBA。现在,我可以找到更简单的方法(我认为它仍然是VBA,excell确实有一些有用的转换,我只需要寻找它们)。
我会处理好的(我希望如此),别担心。
 
Bigal,我还在嚼Lee mac的代码(递归代码对我来说很痛苦),但我就是找不到代码中说“转到下一行”的部分。当我到达终点时它会这样做吗?如果是这样,使用“read line”-n次将返回-n行?(我更喜欢循环,只是想理解)
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 16:34:52 | 显示全部楼层
在lisp中,您无法直接读取某个行号,因此您已经全部读取了这些行号,或者直到(通过测试)找到所需行号。例如,您可以找到某个字符串。否则你就一直读到最后。因此,您可以通过创建文件指针“setq fp open filename for reading”来打开文件,然后可以读取每一行,直到到达最后一行。每个“读取行”都会给你一个结果,一个字符串。但是如果你的应用程序已经读取了所有的行,那么read line返回nil,这样你就知道你已经到达了文件的末尾。
 
 
  1. 6
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 00:36 , Processed in 1.225277 second(s), 83 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表