从外部文件读取
嘿伙计们,Fuccaro在前一篇文章中很好心地帮了我,并为我写了一个小脚本,它基本上是在图形中搜索具有两个特定属性的块。
看起来是这样的:
(defun c:FindTwo()
;| Searches for blocks having two specific attributes
Fuccaro Miklos
2010.12 |;
(setq ss (ssget "X" (list '(0 . "INSERT") '(66 . 1))))
(setq a1 (getstring "\n1st attribute to search for ")
a2 (getstring "\n2nd attribute to search for ")
found 0
)
(repeat (setq i (sslength ss))
(if (check (ssname ss (setq i (1- i))) a1 a2) (setq found (1+ found)))
)
(strcat " ---> " (itoa found) " block(s) found")
)
(defun check (en a1 a2)
(setq hit 0 a0 (cdr (assoc 0 (setq el (entget en)))))
(while (/= a0 "SEQEND")
(if (= a0 "ATTRIB") (if (member (cdr (assoc 1 el)) (list a1 a2)) (setq hit (1+ hit))))
(setq a0 (cdr (assoc 0 (setq el (entget (setq en (entnext en)))))))
)
(= hit 2)
)
这正是我想做的。它是完美的。然而,我的意图是,一旦我找到了一种找到我想要的块的方法,我将制作一个LISP,它将从存储在Excell文件或文本文件中的数据列表中找到块,甚至更好地访问数据库文件。(什么文件类型对我来说无关紧要,因为我可以将数据从数据库复制并粘贴到新文档中)
唯一的问题是,将Fuccaros脚本更改为从外部文件读取值比我想象的要困难。
任何帮助都将不胜感激。
(我决定发布一个新帖子,因为我的问题与Fuccaro帮助我的帖子不太相关,而且我对一直缠着Fuccaro来帮助我感到很难过。)
谢谢大家!
-克雷格 也许Jeffery P.Sanders的名为XL的lisp程序可能对您有所帮助。有关更多信息,请单击此链接。
http://www.jefferypsanders.com/autolisp_XL.html 注意:我一直在努力阅读关于如何做到这一点的所有内容,例如:http://www.pixelgraphicsinc.com/AutoLisp_File_Handling.html
这确实对我有帮助,尽管我找不到任何足够具体到我要做什么的教程/指南。
我希望我已经充分解释了我想要做的事情。基本上,Fuccaro编写的代码部分:
(setq a1(getstring“\n要搜索的第一个属性”),:*在Excel电子表格中搜索,Collom 1*:,。
a2(getstring“\n要搜索的第二个属性”),:*在Excel电子表格中搜索,Collom 2*:,。
希望这有意义。 谢谢你的回复。
这个程序看起来真的很好,但我想做的无疑要简单得多。
我的最后一个帖子应该解释得更清楚。
谢谢
-克雷格 我一整天都在做这件事,我觉得我的头脑有点清醒了。
我现在真正需要知道的是如何读取CSV文件,并将数据存储为变量。
我可以做到这一点,只是我想将','(逗号)之前的第一位数据存储为变量,然后将','(逗号)之后的第二位数据保存为变量,依此类推,直到它到达文件末尾。
我认为我已经完成了所有其余的代码(我的意思是,我知道一旦得到变量,该如何处理它们)。
到目前为止,我有:
(setq k 1)
(setq a "")
(setq lst nil)
(repeat (strlen st)
(if (= (substr st k 1) ",")
(progn
(setq lst (append lst (list (atof a))))
(setq a "")
)
(setq a (strcat a (substr st k 1)))
)
(setq k (+ k 1))
)
(setq lst (append lst (list (atof a))))
)
(defun c:rects ()
(setq f (open "C:/Documents and Settings/Marek_AU_Automation/Desktop/test.csv" "r")) ;-Opens the
file to read
(setq dataline (read-line f)) ;-Reads the header
(setq dataline (read-line f)) ;-Reads the 1st data line
(while (/= dataline "THEEND") ;-Loop until the end of the file
(setq dataline (parse_nums dataline)) ;-Parse the data line variable value
(princ dataline)
; ---ALL THE CODE TO SEARCH ETC SHOULD GO HERE---
(setq dataline (read-line f)) ;-Read the next data line
)
(close f) ;-Close the file
)
但我觉得我走错了方向,(解析数据等)
谢谢大家。
-克雷格 李写了一个很好的CSV读取程序需要在这里搜索
有许多变量需要一直读取单个字符直到行尾,一旦找到第一个,保存为var1,然后从linevariable中删除重新搜索查找,保存var2从linevariable中删除保持重复或查找的位置,然后使用substr
(while(setq new_line(read line fopen))
(setq东距(substr new_1号线)
(setq北距(substr new_line 10 9))
(setq高度(substr new_line 20 5)) 如果您想直接与Access MDB文件交互,可以使用ADOLisp。有一个PDF手册和一个链接到MDB文件的示例。 谢谢你的帮助。
我会看看你刚才提到的节目。
我理解你的意思(存储var1,清除数据线,存储var2…)
但我只是觉得一定有一种更简单的方法可以从CSV文件中读取一些数据。我可以逐个字符检查,但CSV文件中每个字符串的长度可能不同,因此我无法将变量硬编码到脚本中(例如将字符1存储在“var1”中,将字符2存储在“var2”中…)
我的意思是我可以在定义每个变量之前放一个if语句,比如“if character/=”,“然后存储下一个变量”
但我只是觉得这会很混乱,我会有很多不需要的代码行。一个字符串只能由2个字符组成,另一个由10个字符组成。
我希望我说得有道理。
不过我会去找你建议的剧本。
非常感谢你的帮助!
-克雷格 谢谢你,伙计!
我现在就去找那个剧本。
我只需要从脚本中复制代码,并将其放入搜索属性脚本中。因此,可以通过Access数据库中的内容来定义搜索条件。
谢谢
-克雷格 我下载了该程序以连接到Access数据库。
使用它可能会以某种方式实现我想要的,尽管这将非常困难,而且我确信它一定比我正在做的要容易。
这应该解释:
这就是我刚才运行的程序,它会提示输入两个值,我自己查找一个CSV文件,然后复制这些值。
这就是CSV文件,其中包含我要搜索的数据。
这是我在CAD中搜索程序的代码。
我想做的是,而不是我查找CSV文件并在命令行中键入Collum A中的值,然后对Collum B也是如此,数千次地,向脚本添加一些代码,该脚本自动从CSV文件中查找值。
然而,事实证明,这比我最初想象的要复杂得多。
希望我现在解释得足够清楚。
非常感谢你们的帮助!
-克雷格
页:
[1]
2