乐筑天下

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

[编程交流] 重定向Lisp例程

[复制链接]

4

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 16:29:05 | 显示全部楼层 |阅读模式
我正在尝试编写一个lisp,它可以在保存时将图形中的所有外部参照设置为相对。我创建了一个save reactor,但无法使lisp例程工作。
 
 
保存反应堆:
  1. (defun AtSaveCommand (calling-reactor b)
  2. (if
  3. (or
  4. (= (car b) "QSAVE")
  5. (= (car b) "SAVEAS")
  6. (= (car b) "SAVE")
  7. )
  8. (xrefpath)
  9. )
  10. )
  11. (defun loadTheSaveReactor ()
  12. (vl-load-com)
  13. (if *FileOnSave* (vlr-remove *FileOnSave*))
  14. (setq *FileOnSave*
  15. (vlr-command-reactor nil '((:vlr-commandwillStart . AtSaveCommand)))
  16. )
  17. )
  18. (loadTheSaveReactor)

Lisp例程
 
  1. (defun xrefpath ()
  2. (COMMAND "redir" "*" "")
  3. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:36:45 | 显示全部楼层
你不能在反应堆中使用“命令”功能。。。
回复

使用道具 举报

4

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 16:51:18 | 显示全部楼层
GRRRRRR!!!
 
这不是我想要的答案,但这是休息!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:55:29 | 显示全部楼层
我知道你的意思。。。很烦人。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:05:36 | 显示全部楼层
引自AfraLISP:
 
回复

使用道具 举报

56

主题

256

帖子

230

银币

后起之秀

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

铜币
253
发表于 2022-7-5 17:07:35 | 显示全部楼层
试试这个:
 
 
此处的参考点:https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-ActiveX/files/GUID-E13A580D-04CA-46C1-B807-95BB461A0A57-htm.html
 
  1. ;; AtSaveCommand
  2. ;; loadTheSaveReactor
  3. ;; Found here: http://forums.augi.com/showthread.php?93534-Run-lisp-when-closing-drawing&p=926895&viewfull=1#post926895
  4. (defun AtSaveCommand (calling-reactor b)
  5. (if
  6.         (or
  7.                 (= (car b) "QSAVE")
  8.                 (= (car b) "SAVEAS")
  9.                 (= (car b) "SAVE")
  10.                 )
  11.         (progn
  12.                 (setq acadObj (vlax-get-acad-object))
  13.                 (setq activeDoc (vla-get-ActiveDocument acadObj))
  14.                 ;; Get activeDoc Help: https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-ActiveX/files/GUID-161FD7E5-B739-4E09-8430-BA04A6298703-htm.html
  15.                 (if        (= (vla-get-ActiveSpace activeDoc) 1)
  16.                         (progn
  17.                                 (vla-SendCommand activeDoc (strcat "._TEXTTOFRONT A "))
  18.                                 ; (vla-Regen activeDoc acAllViewports)
  19.                                 ; (vla-SendCommand activeDoc (strcat "_REGEN "))
  20.                                 )
  21.                         (progn
  22.                                 ; (princ "\nSwitching to ModelSpace & Back, 1 sec...")(princ)
  23.                                 ;; (run your command here)
  24.                                 ;; Code changed from here
  25.                                 ;; YOu can run a command like so: See help here:
  26.                                 ;; https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-ActiveX/files/GUID-E13A580D-04CA-46C1-B807-95BB461A0A57-htm.html
  27.                                 (vla-SendCommand activeDoc (strcat "._TILEMODE 1 "))
  28.                                 (vla-SendCommand activeDoc (strcat "._TEXTTOFRONT A "))
  29.                                 (vla-SendCommand activeDoc (strcat "._TILEMODE 0 "))
  30.                                 ; (vla-SendCommand activeDoc (strcat "_REGEN "))
  31.                                 ; (vla-Regen activeDoc acAllViewports)
  32.                                 )
  33.                         )
  34.                 )
  35.         )
  36. )
  37. (defun loadTheSaveReactor ()
  38. (if *FileOnSave* (vlr-remove *FileOnSave*))
  39. (setq *FileOnSave*
  40.         (vlr-command-reactor nil '((:vlr-commandwillStart . AtSaveCommand)))
  41.         )
  42. )
  43. (vl-load-com)
  44. (loadTheSaveReactor)
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:16:53 | 显示全部楼层
3dwannab,
将:VLR DWG Reactor与:VLR beginSave事件一起使用,也可以在回调函数外部全球化acDoc变量,或者在回调函数内部将其本地化。
还有那条帖子是2009年的,你为什么回复?
回复

使用道具 举报

56

主题

256

帖子

230

银币

后起之秀

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

铜币
253
发表于 2022-7-5 17:26:51 | 显示全部楼层
 
我只是想帮助其他人,因为线程是关于通过反应堆运行命令的。
 
谢谢你的指点。它正在正常工作。有时,旧代码只运行一次。(可能是因为我没有定位VAR。
 
  1. (defun BeginSave (objReactor lstDataBaseAndName / acadObj activeDoc cmd)
  2. (setq cmd (getvar "cmdecho"))
  3. (setvar 'cmdecho 0)
  4. (setq acadObj (vlax-get-acad-object))
  5. (setq activeDoc (vla-get-ActiveDocument acadObj))
  6. (if        (= (vla-get-ActiveSpace activeDoc) 1)
  7.         (progn
  8.                 (vla-SendCommand activeDoc (strcat "._TEXTTOFRONT A "))
  9.                 (vla-Regen activeDoc acAllViewports)
  10.                 )
  11.         (progn
  12.                 (princ "\nSwitching to ModelSpace & Back, 1 sec...\n")(princ)
  13.                 (vla-SendCommand activeDoc (strcat "._TILEMODE 1 "))
  14.                 (vla-SendCommand activeDoc (strcat "._TEXTTOFRONT A "))
  15.                 (vla-SendCommand activeDoc (strcat "._TILEMODE 0 "))
  16.                 (vla-Regen activeDoc acAllViewports)
  17.                 )
  18.         )
  19. (setvar 'cmdecho cmd)
  20. )
  21. (if (not rxnBeginSave)
  22. (setq rxnBeginSave (VLR-DWG-Reactor nil '((:VLR-beginSave . BeginSave ))))
  23. )
  24. (princ "\nDrawOrder_Reactor.lsp Loaded..")(princ)
回复

使用道具 举报

56

主题

256

帖子

230

银币

后起之秀

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

铜币
253
发表于 2022-7-5 17:35:28 | 显示全部楼层
放弃最后一个代码:
 
当您复制对象时,它的行为很糟糕,就像ACAD触发保存一样。因此,VLR DWG反应堆和:VLR beginSave将不起作用。
 
相反,最好使用vlr命令reactor,并且:vlr命令将开始监视命令行,以获取要触发事件的命令,例如:
  1.         (if (wcmatch (strcase (car arg)) "SAVE,QSAVE,SAVEAS,PLOT")
  2.         (setdraworder)
  3.         )

 
这里有两种不同的工作解决方案,第一种是命令行TEXTTOFRONT。注意:最好在整个程序中使用vla SendCommand,否则ACAD似乎会陷入一个糟糕的循环。
 
第二个是LeeMacs reactor的修改版本,用于处理此处的文本和模糊对象。我用它运行,因为它不需要额外的保存来保持Draworder。(我认为(vla SendCommand)的另一个缺点)。
 
我的命令使用TEXTTOFRONT调用DrawOrder Reactor
  1. ;; setdraworder
  2. ;; loadTheSaveReactor
  3. ;; Found here: http://forums.augi.com/showthread.php?93534-Run-lisp-when-closing-drawing&p=926895&viewfull=1#post926895
  4. ;;
  5. ;; You can run a command like so: See help here:
  6. ;; https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-ActiveX/files/GUID-E13A580D-04CA-46C1-B807-95BB461A0A57-htm.html
  7. ;;
  8. ;; by 3dwannab to work with all HATCH, TEXT, LEADER and DIM objects
  9. ;;
  10. ;; Known Bugs: Needs additional Save to Save DRAWORDER of Objects
  11. (defun setdraworder ( /
  12. acadObj
  13. doc
  14. activeSpe
  15. )
  16. (setq acadObj (vlax-get-acad-object))
  17. (setq doc (vla-get-ActiveDocument acadObj))
  18. (setq activeSpe (vla-get-ActiveSpace doc))
  19. (if        (= 1 activeSpe)
  20. (progn
  21.         (vla-SendCommand doc (strcat "._TEXTTOFRONT A "))
  22.         (vla-SendCommand doc (strcat "._HATCHTOBACK "))
  23.         )
  24. (progn
  25.         (princ "\nSwitching to ModelSpace & Back, 1 sec...")(princ)
  26.         (vla-SendCommand doc (strcat "._TILEMODE 1 "))
  27.         (vla-SendCommand doc (strcat "._TEXTTOFRONT A "))
  28.         (vla-SendCommand doc (strcat "._HATCHTOBACK "))
  29.         (vla-SendCommand doc (strcat "._TILEMODE 0 "))
  30.         )
  31. )
  32. (vla-Regen doc acActiveViewport)
  33. (princ "\n >>> Draworder Reactor is Running ...\n")(princ)
  34. )
  35. (defun draworder:callback ( obj arg )
  36. (if (wcmatch (strcase (car arg)) "SAVE,QSAVE,SAVEAS,PLOT")
  37.         (setdraworder)
  38.         )
  39. (princ)
  40. )
  41. (defun loadTheSaveReactor ()
  42. (vl-load-com)
  43. (if (null draworder:reactor)
  44.         (setq draworder:reactor (vlr-command-reactor nil '((:vlr-commandwillstart . draworder:callback))))
  45.         )
  46. (princ)
  47. )
  48. (loadTheSaveReactor)

 
LeeMac模块:
编辑后,用户可以通过:setdraworder off&setdraworder on关闭和打开反应器
使用命令:SAVE、QSAVE、SAVEAS、PLOT、PUBLISH
  1. ;; Re: Send all hatch/images to background prior to printing & Saving
  2. ;; by LeeMac
  3. ;; https://www.theswamp.org/index.php?PHPSESSID=klskia7od2ku3u3kf9o6n4nl13&topic=43352.msg507568#msg507568
  4. ;;
  5. ;; Edited on 10.04.17 by 3dwannab to work with all TEXT, LEADER and DIM objects
  6. ;;
  7. (defun setdraworder ( /
  8. exd
  9. ls1
  10. ls2
  11. ls3
  12. obn
  13. sor
  14. spc
  15. )
  16. (if
  17. (setq
  18.         spc (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
  19.         exd (vla-getextensiondictionary spc)
  20.         sor (cond ((catchapply 'vla-getobject (list exd "acad_sortents")))
  21.                 ((catchapply 'vla-addobject (list exd "acad_sortents" "acdbsortentstable")))
  22.                 )
  23.         )
  24. (progn
  25.         (vlax-for obj spc
  26.                 (cond
  27.                         (   (= "AcDbHatch" (setq obn (vla-get-objectname obj)))
  28.                                 (setq ls1 (cons obj ls1))
  29.                                 )
  30.                         (   (= "AcDbRasterImage" obn)
  31.                                 (setq ls2 (cons obj ls2))
  32.                                 )
  33.                         (   (= (wcmatch (vla-get-objectname obj) "*Dim*,*Leader*,*Text*") (setq obn (wcmatch (vla-get-objectname obj) "*Dim*,*Leader*,*Text*")))
  34.                                 (if (wcmatch (vla-get-objectname obj) "*Dim*,*Leader*,*Text*")
  35.                                         (setq ls3 (cons obj ls3))
  36.                                         )
  37.                                 )
  38.                         )
  39.                 )
  40.         (if ls1 (vlax-invoke sor 'movetobottom ls1))
  41.         (if ls2 (vlax-invoke sor 'movetobottom ls2))
  42.         (if ls3 (vlax-invoke sor 'movetoTop ls3))
  43.         (princ "\n >>> Draworder Reactor was successful ...\n")(princ)
  44.         )
  45. (princ "\nUnable to retrieve Sortents Table.")
  46. )
  47. (princ)
  48. )
  49. (defun catchapply ( fun arg / rtn )
  50. (if (not (vl-catch-all-error-p (setq rtn (vl-catch-all-apply fun arg)))) rtn)
  51. )
  52. (defun c:setdraworder-on ( )
  53. (if (= 'vlr-command-reactor (type draworder:reactor))
  54.         (if (vlr-added-p draworder:reactor)
  55.                 (princ "\nSet Draworder reactor already running.")
  56.                 (progn
  57.                         (vlr-add draworder:reactor)
  58.                         (princ "\nSet Draworder reactor enabled.")
  59.                         )
  60.                 )
  61.         (progn
  62.                 (setq draworder:reactor
  63.                         (vlr-command-reactor "setdraworder-reactor"
  64.                                 '(
  65.                                         (:vlr-commandwillstart . draworder:callback)
  66.                                         )
  67.                                 )
  68.                         )
  69.                 (princ "\nSet Draworder reactor enabled.")
  70.                 )
  71.         )
  72. (princ)
  73. )
  74. (defun c:setdraworder-off ( )
  75. (if (= 'vlr-command-reactor (type draworder:reactor))
  76.         (progn
  77.                 (vlr-remove draworder:reactor)
  78.                 (setq draworder:reactor nil)
  79.                 (princ "\nSet Draworder reactor disabled.")
  80.                 )
  81.         (princ "\nSet Draworder reactor not running.")
  82.         )
  83. (princ)
  84. )
  85. (defun draworder:callback ( obj arg )
  86. (if (wcmatch (strcase (car arg)) "SAVE,QSAVE,SAVEAS,PLOT,PUBLISH")
  87.         (setdraworder)
  88.         )
  89. (princ)
  90. )
  91. (vl-load-com)
  92. (if (null draworder:reactor)
  93. (setq draworder:reactor (vlr-command-reactor nil '((:vlr-commandwillstart . draworder:callback))))
  94. )
  95. (princ "\n :: Draworder Reactor was loaded ::\n")(princ)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:09 , Processed in 0.394337 second(s), 70 queries .

© 2020-2025 乐筑天下

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