放弃最后一个代码:
当您复制对象时,它的行为很糟糕,就像ACAD触发保存一样。因此,VLR DWG反应堆和:VLR beginSave将不起作用。
相反,最好使用vlr命令reactor,并且:vlr命令将开始监视命令行,以获取要触发事件的命令,例如:
- (if (wcmatch (strcase (car arg)) "SAVE,QSAVE,SAVEAS,PLOT")
- (setdraworder)
- )
这里有两种不同的工作解决方案,第一种是命令行TEXTTOFRONT。注意:最好在整个程序中使用vla SendCommand,否则ACAD似乎会陷入一个糟糕的循环。
第二个是LeeMacs reactor的修改版本,用于处理此处的文本和模糊对象。我用它运行,因为它不需要额外的保存来保持Draworder。(我认为(vla SendCommand)的另一个缺点)。
我的命令使用TEXTTOFRONT调用DrawOrder Reactor
- ;; setdraworder
- ;; loadTheSaveReactor
- ;; Found here: http://forums.augi.com/showthread.php?93534-Run-lisp-when-closing-drawing&p=926895&viewfull=1#post926895
- ;;
- ;; You can run a command like so: See help here:
- ;; https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-ActiveX/files/GUID-E13A580D-04CA-46C1-B807-95BB461A0A57-htm.html
- ;;
- ;; by 3dwannab to work with all HATCH, TEXT, LEADER and DIM objects
- ;;
- ;; Known Bugs: Needs additional Save to Save DRAWORDER of Objects
- (defun setdraworder ( /
- acadObj
- doc
- activeSpe
- )
- (setq acadObj (vlax-get-acad-object))
- (setq doc (vla-get-ActiveDocument acadObj))
- (setq activeSpe (vla-get-ActiveSpace doc))
- (if (= 1 activeSpe)
- (progn
- (vla-SendCommand doc (strcat "._TEXTTOFRONT A "))
- (vla-SendCommand doc (strcat "._HATCHTOBACK "))
- )
- (progn
- (princ "\nSwitching to ModelSpace & Back, 1 sec...")(princ)
- (vla-SendCommand doc (strcat "._TILEMODE 1 "))
- (vla-SendCommand doc (strcat "._TEXTTOFRONT A "))
- (vla-SendCommand doc (strcat "._HATCHTOBACK "))
- (vla-SendCommand doc (strcat "._TILEMODE 0 "))
- )
- )
- (vla-Regen doc acActiveViewport)
- (princ "\n >>> Draworder Reactor is Running ...\n")(princ)
- )
- (defun draworder:callback ( obj arg )
- (if (wcmatch (strcase (car arg)) "SAVE,QSAVE,SAVEAS,PLOT")
- (setdraworder)
- )
- (princ)
- )
- (defun loadTheSaveReactor ()
- (vl-load-com)
- (if (null draworder:reactor)
- (setq draworder:reactor (vlr-command-reactor nil '((:vlr-commandwillstart . draworder:callback))))
- )
- (princ)
- )
- (loadTheSaveReactor)
LeeMac模块:
编辑后,用户可以通过:setdraworder off&setdraworder on关闭和打开反应器
使用命令:SAVE、QSAVE、SAVEAS、PLOT、PUBLISH
- ;; Re: Send all hatch/images to background prior to printing & Saving
- ;; by LeeMac
- ;; https://www.theswamp.org/index.php?PHPSESSID=klskia7od2ku3u3kf9o6n4nl13&topic=43352.msg507568#msg507568
- ;;
- ;; Edited on 10.04.17 by 3dwannab to work with all TEXT, LEADER and DIM objects
- ;;
- (defun setdraworder ( /
- exd
- ls1
- ls2
- ls3
- obn
- sor
- spc
- )
- (if
- (setq
- spc (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
- exd (vla-getextensiondictionary spc)
- sor (cond ((catchapply 'vla-getobject (list exd "acad_sortents")))
- ((catchapply 'vla-addobject (list exd "acad_sortents" "acdbsortentstable")))
- )
- )
- (progn
- (vlax-for obj spc
- (cond
- ( (= "AcDbHatch" (setq obn (vla-get-objectname obj)))
- (setq ls1 (cons obj ls1))
- )
- ( (= "AcDbRasterImage" obn)
- (setq ls2 (cons obj ls2))
- )
- ( (= (wcmatch (vla-get-objectname obj) "*Dim*,*Leader*,*Text*") (setq obn (wcmatch (vla-get-objectname obj) "*Dim*,*Leader*,*Text*")))
- (if (wcmatch (vla-get-objectname obj) "*Dim*,*Leader*,*Text*")
- (setq ls3 (cons obj ls3))
- )
- )
- )
- )
- (if ls1 (vlax-invoke sor 'movetobottom ls1))
- (if ls2 (vlax-invoke sor 'movetobottom ls2))
- (if ls3 (vlax-invoke sor 'movetoTop ls3))
- (princ "\n >>> Draworder Reactor was successful ...\n")(princ)
- )
- (princ "\nUnable to retrieve Sortents Table.")
- )
- (princ)
- )
- (defun catchapply ( fun arg / rtn )
- (if (not (vl-catch-all-error-p (setq rtn (vl-catch-all-apply fun arg)))) rtn)
- )
- (defun c:setdraworder-on ( )
- (if (= 'vlr-command-reactor (type draworder:reactor))
- (if (vlr-added-p draworder:reactor)
- (princ "\nSet Draworder reactor already running.")
- (progn
- (vlr-add draworder:reactor)
- (princ "\nSet Draworder reactor enabled.")
- )
- )
- (progn
- (setq draworder:reactor
- (vlr-command-reactor "setdraworder-reactor"
- '(
- (:vlr-commandwillstart . draworder:callback)
- )
- )
- )
- (princ "\nSet Draworder reactor enabled.")
- )
- )
- (princ)
- )
- (defun c:setdraworder-off ( )
- (if (= 'vlr-command-reactor (type draworder:reactor))
- (progn
- (vlr-remove draworder:reactor)
- (setq draworder:reactor nil)
- (princ "\nSet Draworder reactor disabled.")
- )
- (princ "\nSet Draworder reactor not running.")
- )
- (princ)
- )
- (defun draworder:callback ( obj arg )
- (if (wcmatch (strcase (car arg)) "SAVE,QSAVE,SAVEAS,PLOT,PUBLISH")
- (setdraworder)
- )
- (princ)
- )
- (vl-load-com)
- (if (null draworder:reactor)
- (setq draworder:reactor (vlr-command-reactor nil '((:vlr-commandwillstart . draworder:callback))))
- )
- (princ "\n :: Draworder Reactor was loaded ::\n")(princ)
|