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