乐筑天下

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

[编程交流] 启动时Lisp错误

[复制链接]

21

主题

52

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 15:51:59 | 显示全部楼层 |阅读模式
自从我们升级到2018年以来,我们在进入AutoCAD时遇到了错误(我认为)。
我想我已经把范围缩小到了一个叫做XBTF的加载例程。我们Acad中的lsp。lsp
 
此例程的目标是在打开图形时:
解锁层E-ANNO-REFR
向后移动所有外部参照
将所有文本移到前面
重新锁定层E-ANNO-REFR
 
因此,当我打开一个包含此层的图形时,我们会收到以下消息:
 
 
当我打开一个没有图层的图形时,我们得到了这个:
 
 
这是XBTF。lsp
  1. ;;;Xref to back, text to front;;;
  2. (setvar "cmdecho" 1)
  3. (COMMAND "-LAYER" "unlock" "e-anno-refr" "")
  4.              (vl-load-com)
  5.              (setq selset (ssget "x" '((0 . "INSERT"))) SelToSend selset)
  6.                      (repeat (setq i (sslength selset))
  7.                              (if (equal (vla-get-IsXRef
  8.                        (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))     
  9.                        (vla-get-effectivename
  10.                              (vlax-ename->vla-object (setq ent (ssname selset (setq i (1- i))))))
  11.                              )
  12.                                           ) :vlax-false )
  13.                            (setq SelToSend (ssdel ent SelToSend))
  14.                            )
  15.                      )
  16.      (sssetfirst nil SelToSend)
  17.      (command "_draworder" "_Back")
  18. (COMMAND "-LAYER" "lock" "e-anno-refr" "")
  19. (command "texttofront" "all")
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 16:07:17 | 显示全部楼层
你好
 
试试这个未经测试的代码,让我知道。
  1. (defun xref2back  (/ str blk sel fnd )
  2. ;; Tharwat - Date: 01.Nov.2017        ;;
  3. (or (= (getvar 'CMDECHO) 1) (setvar 'CMDECHO 1))
  4. (and (setq fnd (tblsearch "LAYER" "e-anno-refr")) (command "-LAYER" "unlock" "e-anno-refr" ""))
  5. (setq str "")
  6. (while (setq blk (tblnext "BLOCK" (not blk)))
  7.    (if (cdr (assoc 1 blk))
  8.      (setq str (strcat str (cdr (assoc 2 blk)) ","))
  9.      )
  10.    )
  11. (and (setq sel (ssget "_X" (list '(0 . "INSERT") (cons 2 str))))
  12.       (sssetfirst nil sel) (command "_draworder" "_Back"))
  13. (and fnd (command "-LAYER" "lock" "e-anno-refr" ""))
  14. (command "texttofront" "all")
  15. (princ)
  16. )
  17. ;; The following is to invoke the function without user's intervention.
  18. (xref2back)
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:27:59 | 显示全部楼层
我使用了一个名为“XRB”(从外部参照到背面)的选项。。快速修改以将文本发送到前端。调用draworder时,也不需要解锁层。
  1. (defun c:xrb (/ b n sp tx)
  2. (setvar 'cmdecho 0)
  3. (setq        sp (vlax-get (vla-get-activedocument (vlax-get-acad-object))
  4.              (if (= (getvar 'cvport) 1)
  5.                'paperspace
  6.                'modelspace
  7.              )
  8.    )
  9. )
  10. (setq b (ssadd))
  11. (setq tx (ssadd))
  12. (vlax-for o sp
  13.    (setq n (vla-get-objectname o))
  14.    (cond ((and (= "AcDbBlockReference" n) (vlax-property-available-p o 'path))
  15.    (setq b (ssadd (vlax-vla-object->ename o) b))
  16.   )
  17.   ((wcmatch n "AcDb*Text,*Dimension*,*Leader*")
  18.    (setq tx (ssadd (vlax-vla-object->ename o) tx))
  19.   )
  20.    )
  21. )
  22. (and (> (sslength b) 0) (command "_.draworder" b "" "Back"))
  23. (and (> (sslength tx) 0) (command "_.draworder" tx "" "Front"))
  24. (setvar 'cmdecho 1)
  25. (princ)
  26. )
  27. (vl-load-com)

 
@塔瓦特
此行将始终返回T
  1. (and (sssetfirst nil (ssget "_X" (list '(0 . "INSERT") (cons 2 str)))))
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 16:36:42 | 显示全部楼层
你说得对,罗恩琼普,谢谢你。
代码已修改。
回复

使用道具 举报

21

主题

52

帖子

31

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 16:49:01 | 显示全部楼层
好的,谢谢。
阐明全局。我们最初的例行程序是匆忙拼凑起来的,以解决我们在绘制特定项目时遇到的问题。该项目的标题栏由建筑师提供,他们在标题栏中的页码后面使用了实心图案填充。因此,当我们在标题栏中引用时,以及在autocad和draworder中使用外部参照时发生的任何事情。。。标题栏图案填充将删除页码。
所以,在检查你的两个和运行一个20张的批处理图之间。。。
Tharwat,看起来你给的代码替换处理了错误,仍然可以打印。
RonJonP,函数的这一部分肯定缺少一些东西,因为对于你的函数,批处理图以图案填充为主。
 
所以,我将坚持使用Tharwat的。但我想知道,在这个宏伟的计划中,我是否应该在这个过程中在tilemode 1中启动例程,然后切换到tilemode 0并重复。只是为了确保在绘制布局之前发生。
你们怎么看?
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 17:03:28 | 显示全部楼层
 
试试看。。应该完成你想要的。
  1. (defun c:xrb (/ bl ed n tbl tx)
  2. (vlax-for a (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
  3.    (if        (and (= -1 (vlax-get a 'islayout))
  4.      (setq ed (vla-getextensiondictionary a))
  5.      (setq tbl (vla-addobject ed "Acad_Sortents" "AcDbSortentsTable"))
  6. )
  7.      (progn (vlax-for b a
  8.        (setq n (vla-get-objectname b))
  9.        (cond ((and (= "AcDbBlockReference" n) (vlax-property-available-p b 'path))
  10.               (setq bl (cons b bl))
  11.              )
  12.              ((wcmatch n "AcDb*Text,*Dimension*,*Leader*") (setq tx (cons b tx)))
  13.        )
  14.      )
  15.      (and bl (vl-catch-all-apply 'vlax-invoke (list tbl 'movetobottom bl)))
  16.      (and tx (vl-catch-all-apply 'vlax-invoke (list tbl 'movetotop tx)))
  17.      (mapcar 'set '(bl tx) '(nil nil))
  18.      )
  19.    )
  20. )
  21. (vla-update (vlax-get-acad-object))
  22. (princ)
  23. )
  24. (vl-load-com)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:08 , Processed in 1.023866 second(s), 65 queries .

© 2020-2025 乐筑天下

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