msweeney 发表于 2022-7-6 11:45:50

LISP搜索例程

我有一个Acad r14的现有LISP例程,我正试图将其转换为Acad 2008,但我不知道我在做什么。它要求提供图纸编号,然后查看不同文件位置的文本数据库(path2.txt)。一旦它在其中一个位置找到文件,就会打开它。非常简单,但open命令的工作方式似乎与r14不同。该例程似乎工作正常,直到它实际到达open命令,然后停止。任何帮助都将不胜感激。谢谢,马克
 
(defun C:find1test()
(setq a“”)
(setq b“”)
(setq测试“”)
(setq dwg“”)
(setq f“”)
(setq dwg(getstring T“\n输入图纸名称:”);暂停用户响应
(命令“pan”“0,0”“0.001”)
(setq ext“.dwg”)
(setq c(strcat“l:/users/none/”dwg ext))
(setq f(打开“l:/apps/acad/path2.txt”“r”);打开要读取的文本文件。
(while(/=T检验);循环直到无响应。
(setq a(读取行f));读取打开的文本文件的第一行。
(setq b(strcat a dwg ext))
(setq测试(或(findfile b)))
(如果(=b c)
(程序
(setq tt1(strcat“DRAWING\”“dwg”\“NOT FOUND!!”)
(警报tt1)
(退出)
)
)
)
(关闭f);关闭打开的文本文件。
(setq y(getstring“\n您想保存更改吗?是或否”))
(如果
(或
(=y“y”)
(=y“y”)(命令“qsave”“open”b)(命令“open”“y”b))

Lee Mac 发表于 2022-7-6 11:54:35

也许是这样?
 

(defun C:find1test(/ GetPaths dwg file)
(vl-load-com)

(defun GetPaths (fname / file line lst)
   (cond ((not (and (setq fname (findfile fname))
                      (setq file(open fname "r")))))

         ((while (setq line (read-line file))
            (setq lst (cons line lst)))
            (close file)))
   
   (reverse lst))

(setq *doc (cond (*doc) ((vla-get-ActiveDocument (vlax-get-acad-object)))))

(if (not (zerop (strlen (setq dwg (getstring t "\nEnter Drawing Name: ")))))
   
   (if (setq file (vl-some
                  (function
                      (lambda (x) (findfile (strcat x dwg ".dwg"))))

                  (GetPaths "l:/apps/acad/path2.txt")))
   (progn
       (initget "Yes No")
       (if (/= "No" (getkword "\nSave Changes? <Yes> : "))
         (if (eq "" (vla-get-fullname *doc))
         (vla-saveas *doc (strcat (vla-get-Path *doc) (vla-get-Name *doc)))
         (vla-save *doc)))

       (vla-Activate
         (vla-open
         (if (zerop (getvar 'SDI))
             (vla-get-Documents (vlax-get-acad-object)) *doc) file :vlax-false)))

   (princ "\n** Drawing not Found **")))

(princ))

msweeney 发表于 2022-7-6 12:00:02

非常感谢你为我改写这篇文章。我用现有的例程替换了它,但我得到了相同的结果。它似乎从正确的目录中获取图形编号,但它将文件名和位置用作命令,而不是打开文件。下面是命令窗口中的序列:(我重命名了例程find-2008.lsp)
 
命令:find-2008
正在初始化。。。
输入图形名称:0809635
保存更改?:
_.打开
命令:L:\drawings\part-0809\0809635。dwg未知命令
“L:\DRAWINGS\PART-0809\0809635.DWG”。按F1键获取帮助。
命令:
 
关于如何纠正这个问题,有什么想法吗?

Lee Mac 发表于 2022-7-6 12:08:47

信不信由你,我从来没有以这种方式使用过Open,所以这对我来说是一个新的领域,但也就是说,我已经更新了上面的代码,你能试试吗。
 
如果不行,我还有一个主意

msweeney 发表于 2022-7-6 12:10:37

与第一个结果相同。非常奇怪。但我真的很感谢你的帮助。它只是不知道使用文件名作为打开的对象。尽管如此,它正在正确的目录中查找图形-因此很多工作正在进行。

Lee Mac 发表于 2022-7-6 12:21:33

很高兴知道找到文件没问题
 
代码再次更新-使用不同的打开方法。

msweeney 发表于 2022-7-6 12:26:20

嘿!它起作用了!非常感谢你。我想我们今天都学到了一些东西。嗯,你学到了一些东西。在我完全理解你的代码之前,我必须仔细研究你的代码。我对LISP很陌生,只有很少的VBA经验。
 
一定要把这个放在你的工具栏上。不用在网络上到处寻找图形是件好事——你永远不知道别人是否将图形保存在了错误的位置。
 
再次感谢,
做记号

msweeney 发表于 2022-7-6 12:31:12

好的,一个小故障。如果打开了多个图形,则不会使最新打开的图形成为当前图形。它打开文件,然后恢复到上一个图形。有没有办法打开它并使其成为活动文件?

Lee Mac 发表于 2022-7-6 12:33:59

代码再次更新-希望这会成为最新的
 
恐怕我只是一个程序员——我不需要我创建的任何代码我只是喜欢编码

msweeney 发表于 2022-7-6 12:44:11

就是这样。再次感谢。只要我需要帮助,我一定会回到这个网站。
页: [1] 2
查看完整版本: LISP搜索例程