yrnomad 发表于 2022-7-5 15:51:59

启动时Lisp错误

自从我们升级到2018年以来,我们在进入AutoCAD时遇到了错误(我认为)。
我想我已经把范围缩小到了一个叫做XBTF的加载例程。我们Acad中的lsp。lsp
 
此例程的目标是在打开图形时:
解锁层E-ANNO-REFR
向后移动所有外部参照
将所有文本移到前面
重新锁定层E-ANNO-REFR
 
因此,当我打开一个包含此层的图形时,我们会收到以下消息:
 
 
当我打开一个没有图层的图形时,我们得到了这个:
 
 
这是XBTF。lsp
;;;Xref to back, text to front;;;
(setvar "cmdecho" 1)
(COMMAND "-LAYER" "unlock" "e-anno-refr" "")
           (vl-load-com)
           (setq selset (ssget "x" '((0 . "INSERT"))) SelToSend selset)
                     (repeat (setq i (sslength selset))
                             (if (equal (vla-get-IsXRef
                     (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))   
                     (vla-get-effectivename
                             (vlax-ename->vla-object (setq ent (ssname selset (setq i (1- i))))))
                           )
                                          ) :vlax-false )
                           (setq SelToSend (ssdel ent SelToSend))
                           )
                     )
   (sssetfirst nil SelToSend)
   (command "_draworder" "_Back")
(COMMAND "-LAYER" "lock" "e-anno-refr" "")
(command "texttofront" "all")

Tharwat 发表于 2022-7-5 16:07:17

你好
 
试试这个未经测试的代码,让我知道。

(defun xref2back(/ str blk sel fnd )
;; Tharwat - Date: 01.Nov.2017        ;;
(or (= (getvar 'CMDECHO) 1) (setvar 'CMDECHO 1))
(and (setq fnd (tblsearch "LAYER" "e-anno-refr")) (command "-LAYER" "unlock" "e-anno-refr" ""))
(setq str "")
(while (setq blk (tblnext "BLOCK" (not blk)))
   (if (cdr (assoc 1 blk))
   (setq str (strcat str (cdr (assoc 2 blk)) ","))
   )
   )
(and (setq sel (ssget "_X" (list '(0 . "INSERT") (cons 2 str))))
      (sssetfirst nil sel) (command "_draworder" "_Back"))
(and fnd (command "-LAYER" "lock" "e-anno-refr" ""))
(command "texttofront" "all")
(princ)
)
;; The following is to invoke the function without user's intervention.
(xref2back)

ronjonp 发表于 2022-7-5 16:27:59

我使用了一个名为“XRB”(从外部参照到背面)的选项。。快速修改以将文本发送到前端。调用draworder时,也不需要解锁层。
(defun c:xrb (/ b n sp tx)
(setvar 'cmdecho 0)
(setq        sp (vlax-get (vla-get-activedocument (vlax-get-acad-object))
             (if (= (getvar 'cvport) 1)
             'paperspace
             'modelspace
             )
   )
)
(setq b (ssadd))
(setq tx (ssadd))
(vlax-for o sp
   (setq n (vla-get-objectname o))
   (cond ((and (= "AcDbBlockReference" n) (vlax-property-available-p o 'path))
   (setq b (ssadd (vlax-vla-object->ename o) b))
)
((wcmatch n "AcDb*Text,*Dimension*,*Leader*")
   (setq tx (ssadd (vlax-vla-object->ename o) tx))
)
   )
)
(and (> (sslength b) 0) (command "_.draworder" b "" "Back"))
(and (> (sslength tx) 0) (command "_.draworder" tx "" "Front"))
(setvar 'cmdecho 1)
(princ)
)
(vl-load-com)


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

Tharwat 发表于 2022-7-5 16:36:42

你说得对,罗恩琼普,谢谢你。
代码已修改。

yrnomad 发表于 2022-7-5 16:49:01

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

ronjonp 发表于 2022-7-5 17:03:28

 
试试看。。应该完成你想要的。
(defun c:xrb (/ bl ed n tbl tx)
(vlax-for a (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
   (if        (and (= -1 (vlax-get a 'islayout))
   (setq ed (vla-getextensiondictionary a))
   (setq tbl (vla-addobject ed "Acad_Sortents" "AcDbSortentsTable"))
)
   (progn (vlax-for b a
       (setq n (vla-get-objectname b))
       (cond ((and (= "AcDbBlockReference" n) (vlax-property-available-p b 'path))
              (setq bl (cons b bl))
             )
             ((wcmatch n "AcDb*Text,*Dimension*,*Leader*") (setq tx (cons b tx)))
       )
   )
   (and bl (vl-catch-all-apply 'vlax-invoke (list tbl 'movetobottom bl)))
   (and tx (vl-catch-all-apply 'vlax-invoke (list tbl 'movetotop tx)))
   (mapcar 'set '(bl tx) '(nil nil))
   )
   )
)
(vla-update (vlax-get-acad-object))
(princ)
)
(vl-load-com)
页: [1]
查看完整版本: 启动时Lisp错误