需要帮助解决这个问题。ls
大家好,我最近发现了阿卡多克的快乐。lsp,但我想用它比我现在做的更聪明一点。
我制作了一个例程,可以协调多个层,还可以删除不再可用的外部参照图像。
问题是,如果这些未协调的图层和外部参照不存在,它将在命令提示下告诉您,尽管将cmdecho设置为0。
虽然这实际上不会影响任何事情,但它看起来不太整洁(尤其是最后一个,当公司徽标不存在时,它会返回此信息):
未选择未协调的图层。
未选择未协调的图层。
未选择未协调的图层。
未选择未协调的图层。
未知命令“公司徽标”。按F1键获取帮助。
; 错误:输入上有额外的右括号
这是来自阿卡多克的代码。lsp:
(setvar "cmdecho" 0)
(command "layer" "reconcile" "A4SHEET*" "")
(command "layer" "reconcile" "A3SHEET*" "")
(command "layer" "reconcile" "A2SHEET*" "")
(command "layer" "reconcile" "A1SHEET*" "")
(command "layer" "reconcile" "A0SHEET*" "")
(command "layer" "reconcile" "B1SHEET*" "")
(command "image" "detach" "Company Logo")
(setvar "cmdecho" 1)
我想做的是,使例程更智能一些,这样它只在实际需要协调时协调一层,并在图像存在时分离公司徽标图像。
我尝试过这样的事情,但运气不好:
(progn (if tblsearch "layer" "A4SHEET|70")
(command "layer" "reconcile" "A4SHEET*" ""))
有人知道如何让这个“如果”程序正常工作吗? 这将对图层问题进行排序:
(defun laychk (lay)
(if (tblsearch "LAYER" lay)
(command "layer" "_reconcile" lay "")))
(mapcar 'laychk '("A4SHEET" "A3SHEET" "A2SHEET" "A1SHEET"
"A0SHEET" "B1SHEET"))
这就是我所能想到的图像分离-
假设文件扩展名为4个chr长。即。jpg或。bmp等
(defun c:test(/ ss iNme)
(if (setq ss (ssget "X" '((0 . "IMAGE"))))
(progn
(foreach img(mapcar
(function
(lambda (x) (cdr (assoc 1 x))))
(mapcar
(function
(lambda (x) (entget (cdr (assoc 340 (entget x))))))
(mapcar 'cadr (ssnamex ss))))
(if (eq "COMPANY LOGO"
(strcase
(setq iNme (substr img (- (strlen img) 15) 12))))
(command "_-image" "_D" iNme)))))
(princ)
)
谢谢李,
我修改了你的图层例程来为我工作。
在我最初的例程中,我有一个通配符,因为它总是一组需要协调的层。图层始终属于外部参照到图形中的图形边框,因此未协调图层的列表有时会显示如下:A1SHEET | 25、A1SHEET | 50、A1SHEET | 70等,其中25、50、70是该外部参照图形中的图层。这就是为什么我最初用一张纸来调和这一整套。
我试着在你做的例程中使用通配符,但没有成功,所以我只是在列表中添加了所有变体,效果很好。
在这个lisp例程中可以使用通配符吗?
我原本希望丢失图像引用的解决方案与您为层所做的例程一样优雅,但我想这里的问题是不可能对图像引用进行tblsearch?
你的解决方案看起来很巧妙。我对它进行了测试,它非常适合缺少公司标志的图纸。bmp参考。然而,不幸的是,这不是缺少的引用的实际名称。
首先,我将“Company Logo”替换为“Xxxxxxx Yyyyyyy Logo”,并将以下字符串调整为图像名称中正确的字符数:(substr img(-strlen img)23)20),但没有成功。
然后,我意识到您可以使用mapcar、cdr和cadr函数来组合图像名称,以使用图像名称中的单个单词来构建一个列表?因为事实上,图像名称有3个单词而不是2个,所以我假设其中必须有第三个mapcar的caddr函数才能工作?
我试过了,但恐怕这一切都有点不合我的口味
另一方面:如果图像引用不包含任何空格,而是包含下划线,那么这个例程会容易得多吗?
不管你能否再帮我一点忙,我都很感激你给我的帮助。这真的只是我试图克服的一个小毛病,但在这个过程中学习一些新东西总是很好的。 即使名称中有更多空格,您对李代码的修改也应该有效。由于使用了“strcase”函数,因此需要将图像名称全部大写才能工作。 我试过了,但什么也没有。但我看不出哪里出了错,因为它也不会返回错误。不管有没有大写字母,它什么都不做。
我测试了一个公司标志。我插入了bmp,然后删除了文件,当我运行例程时效果很好。
我看到的唯一区别是状态:对于我实际尝试分离的文件,未找到与未引用。
我将尝试为您合并一个通配符方法
正如Carl所说,只需调整字符数并使(eq“XXX-YYY”)所有大写字母都能工作-这与原来的例程没有什么不同。
我包括了“strcase”,因为我不知道它是“公司标志”,还是“公司标志”等等。。。但这将贯穿始终。
mapcar的原始数组只检索图像的整个文件名,然后substr只从整个文件名中去掉名称。
将Substr格式化如下:
其中,“公司标志”是要找到的图像的确切名称,全部大写(空格和all)。
15是图像名称的字符串长度+3
12是字符串长度(也计算空格) 不确定这是否适用于与通配符的协调。-未经测试
(defun c:laychk (/ wcrds layers reclay)
(vl-load-com)
(setq wcrds '("A4SHEET*" "A3SHEET*" "A2SHEET*" "A1SHEET*" "A0SHEET*" "B1SHEET*"))
(vlax-for lay (vla-get-layers
(vla-get-ActiveDocument
(vlax-get-acad-object)))
(setq layers (cons (vla-get-name lay) layers)))
(foreach wcwcrds
(setq reclay (vl-remove-if-not
(function
(lambda (x) (wcmatch x wc))) layers))
(mapcar
(function
(lambda (x) (command "layer" "_reconcile" x ""))) reclay))
(princ))
与通配符和解效果很好!
虽然我仍然无法使图像分离例程正常工作,但我知道问题出在哪里。
如果我通过命令行手动分离,则无论状态是否未找到或未引用,分离都可以正常工作。然而,对于lisp例程,它不适用于未引用的图像。
我用几种方法对它进行了测试,当我有一个未找到的引用时,例程会很好地将其分离出来,正如你所说的,不管它叫什么名字,有多少个单词。
但是,如果我创建一个未引用的图像,它将不起作用。
现在的问题是,lisp例程是什么使最终结果不同于我可以从命令行手动执行的操作?我的意思是,实际上所有的例行程序都是在使用image detach命令将其发送到命令行之前检查是否存在确切的图像名称。
我附上了一个没有找到参考公司标志的样本文件。bmp
这个程序在这方面效果很好。现在删除可以在模型空间中看到的引用,它将变为未引用,并且例程不再工作。
公司测试。图纸 非常感谢DVDM-我将调查。。。
编辑:我知道为什么它与图形中的图像一起工作,而不是在其被删除时工作-代码的工作方式是创建图形中所有图像的选择集-因此,如果图像不存在,它将找不到它-但图像定义仍然存在。
页:
[1]
2