乐筑天下

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

[编程交流] 需要帮助解决这个问题。ls

[复制链接]

9

主题

43

帖子

35

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 14:49:09 | 显示全部楼层 |阅读模式
大家好,
 
我最近发现了阿卡多克的快乐。lsp,但我想用它比我现在做的更聪明一点。
我制作了一个例程,可以协调多个层,还可以删除不再可用的外部参照图像。
问题是,如果这些未协调的图层和外部参照不存在,它将在命令提示下告诉您,尽管将cmdecho设置为0。
虽然这实际上不会影响任何事情,但它看起来不太整洁(尤其是最后一个,当公司徽标不存在时,它会返回此信息):
 
未选择未协调的图层。
 
未选择未协调的图层。
 
未选择未协调的图层。
 
未选择未协调的图层。
 
未知命令“公司徽标”。按F1键获取帮助。
; 错误:输入上有额外的右括号
 
这是来自阿卡多克的代码。lsp:
 
  1. (setvar "cmdecho" 0)
  2. (command "layer" "reconcile" "A4SHEET*" "")
  3. (command "layer" "reconcile" "A3SHEET*" "")
  4. (command "layer" "reconcile" "A2SHEET*" "")
  5. (command "layer" "reconcile" "A1SHEET*" "")
  6. (command "layer" "reconcile" "A0SHEET*" "")
  7. (command "layer" "reconcile" "B1SHEET*" "")
  8. (command "image" "detach" "Company Logo")
  9. (setvar "cmdecho" 1)

 
我想做的是,使例程更智能一些,这样它只在实际需要协调时协调一层,并在图像存在时分离公司徽标图像。
 
我尝试过这样的事情,但运气不好:
  1. (progn (if tblsearch "layer" "A4SHEET|70")
  2.           (command "layer" "reconcile" "A4SHEET*" ""))

 
有人知道如何让这个“如果”程序正常工作吗?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:56:32 | 显示全部楼层
这将对图层问题进行排序:
 
  1. (defun laychk (lay)
  2. (if (tblsearch "LAYER" lay)
  3.    (command "layer" "_reconcile" lay "")))
  4. (mapcar 'laychk '("A4SHEET" "A3SHEET" "A2SHEET" "A1SHEET"
  5.                  "A0SHEET" "B1SHEET"))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:01:43 | 显示全部楼层
这就是我所能想到的图像分离-
 
假设文件扩展名为4个chr长。即。jpg或。bmp等
 
  1. (defun c:test  (/ ss iNme)
  2. (if (setq ss (ssget "X" '((0 . "IMAGE"))))
  3.    (progn
  4.      (foreach img  (mapcar
  5.              (function
  6.            (lambda (x) (cdr (assoc 1 x))))
  7.              (mapcar
  8.            (function
  9.              (lambda (x) (entget (cdr (assoc 340 (entget x))))))
  10.            (mapcar 'cadr (ssnamex ss))))
  11.    (if (eq    "COMPANY LOGO"
  12.        (strcase
  13.          (setq iNme (substr img (- (strlen img) 15) 12))))
  14.      (command "_-image" "_D" iNme)))))
  15. (princ)
  16. )
回复

使用道具 举报

9

主题

43

帖子

35

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 15:05:50 | 显示全部楼层
谢谢李,
 
我修改了你的图层例程来为我工作。
在我最初的例程中,我有一个通配符,因为它总是一组需要协调的层。图层始终属于外部参照到图形中的图形边框,因此未协调图层的列表有时会显示如下: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函数才能工作?
我试过了,但恐怕这一切都有点不合我的口味
 
另一方面:如果图像引用不包含任何空格,而是包含下划线,那么这个例程会容易得多吗?
 
不管你能否再帮我一点忙,我都很感激你给我的帮助。这真的只是我试图克服的一个小毛病,但在这个过程中学习一些新东西总是很好的。
回复

使用道具 举报

0

主题

269

帖子

279

银币

限制会员

铜币
-4
发表于 2022-7-6 15:08:35 | 显示全部楼层
即使名称中有更多空格,您对李代码的修改也应该有效。由于使用了“strcase”函数,因此需要将图像名称全部大写才能工作。
回复

使用道具 举报

9

主题

43

帖子

35

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 15:16:17 | 显示全部楼层
我试过了,但什么也没有。但我看不出哪里出了错,因为它也不会返回错误。不管有没有大写字母,它什么都不做。
 
我测试了一个公司标志。我插入了bmp,然后删除了文件,当我运行例程时效果很好。
我看到的唯一区别是状态:对于我实际尝试分离的文件,未找到与未引用。
154912eq5hd5vy6zxdyxwv.png
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:20:28 | 显示全部楼层
 
我将尝试为您合并一个通配符方法
 
 
正如Carl所说,只需调整字符数并使(eq“XXX-YYY”)所有大写字母都能工作-这与原来的例程没有什么不同。
 
我包括了“strcase”,因为我不知道它是“公司标志”,还是“公司标志”等等。。。但这将贯穿始终。
 
mapcar的原始数组只检索图像的整个文件名,然后substr只从整个文件名中去掉名称。
 
将Substr格式化如下:
 
其中,“公司标志”是要找到的图像的确切名称,全部大写(空格和all)。
 
15是图像名称的字符串长度+3
 
12是字符串长度(也计算空格)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:22:15 | 显示全部楼层
不确定这是否适用于与通配符的协调。-未经测试
 
  1. (defun c:laychk     (/ wcrds layers reclay)
  2. (vl-load-com)
  3. (setq wcrds '("A4SHEET*" "A3SHEET*" "A2SHEET*" "A1SHEET*" "A0SHEET*" "B1SHEET*"))
  4. (vlax-for lay     (vla-get-layers
  5.           (vla-get-ActiveDocument
  6.             (vlax-get-acad-object)))
  7.    (setq layers (cons (vla-get-name lay) layers)))
  8. (foreach wc  wcrds
  9.    (setq reclay (vl-remove-if-not
  10.           (function
  11.             (lambda (x) (wcmatch x wc))) layers))
  12.    (mapcar
  13.      (function
  14.    (lambda (x) (command "layer" "_reconcile" x ""))) reclay))
  15. (princ))
回复

使用道具 举报

9

主题

43

帖子

35

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 15:28:54 | 显示全部楼层
与通配符和解效果很好!
 
虽然我仍然无法使图像分离例程正常工作,但我知道问题出在哪里。
如果我通过命令行手动分离,则无论状态是否未找到或未引用,分离都可以正常工作。然而,对于lisp例程,它不适用于未引用的图像。
我用几种方法对它进行了测试,当我有一个未找到的引用时,例程会很好地将其分离出来,正如你所说的,不管它叫什么名字,有多少个单词。
但是,如果我创建一个未引用的图像,它将不起作用。
 
现在的问题是,lisp例程是什么使最终结果不同于我可以从命令行手动执行的操作?我的意思是,实际上所有的例行程序都是在使用image detach命令将其发送到命令行之前检查是否存在确切的图像名称。
 
我附上了一个没有找到参考公司标志的样本文件。bmp
这个程序在这方面效果很好。现在删除可以在模型空间中看到的引用,它将变为未引用,并且例程不再工作。
公司测试。图纸
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:32:33 | 显示全部楼层
非常感谢DVDM-我将调查。。。
 
编辑:我知道为什么它与图形中的图像一起工作,而不是在其被删除时工作-代码的工作方式是创建图形中所有图像的选择集-因此,如果图像不存在,它将找不到它-但图像定义仍然存在。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 22:29 , Processed in 0.398851 second(s), 74 queries .

© 2020-2025 乐筑天下

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