乐筑天下

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

[编程交流] 使用VLA恢复以前的UCS

[复制链接]

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 16:57:52 | 显示全部楼层
你好
虽然这次我在AutoCAD 2017和之前的AutoCAD 2015上尝试了上面发布的两个代码,但这里没有任何错误。
 
我为你录制了一段视频,但我无法在这里上传,因为它超过了1.0 MB,所以你不能直接从我的谷歌硬盘从下面的链接下载。
 
https://drive.google.com/drive/my-drive
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:01:12 | 显示全部楼层
也许下面的(更干净的)代码工作得更好?所有还原操作都是通过“sendcommand”完成的。请注意,在BricsCAD中,恢复以前的UCS不起作用。似乎使用vla put activeucs打破了UCS的“序列”。
作为替代方案,您可以考虑使用重新定义的命令,而不是反应器。
  1. (vl-load-com)
  2. ;;; Command Reactor for Xref/Attachment layer and UCS.
  3. (if (not *MyXr-react*)
  4. (setq *MyXr-react*
  5.    (vlr-command-reactor
  6.      nil
  7.      '(
  8.        (:vlr-commandwillstart . MyXr-CB-Start) ; CB=callback.
  9.        (:vlr-commandended . MyXr-CB-End)
  10.        (:vlr-commandcancelled . MyXr-CB-End)
  11.      )
  12.    )
  13. )
  14. )
  15. (defun MyXr-CB-Start (rea lst / doc layNme ucsNme)
  16. (if
  17.    (vl-position
  18.      (car lst)
  19.      '(
  20.        "ATTACH"
  21.        "XATTACH"
  22.        "DWFATTACH"
  23.        "IMAGEATTACH"
  24.        "PDFATTACH"
  25.        "POINTCLOUDATTACH"
  26.        "COORDINATIONMODELATTACH"
  27.      )
  28.    )
  29.    (progn
  30.      (setq doc (vlr-document rea))
  31.      (setq layNme (MyXr-ChangeLayer doc (car lst)))
  32.      (setq ucsNme (MyXr-ChangeUcs doc))
  33.      (vlr-data-set rea (list layNme ucsNme))
  34.    )
  35.    (vlr-data-set rea nil)
  36. )
  37. )
  38. (defun MyXr-CB-End (rea lst)
  39. (if (print (vlr-data rea))
  40.    (progn
  41.      (vla-sendcommand
  42.        (vlr-document rea)
  43.        (strcat
  44.          "(MyXr-Restore "
  45.          (vl-prin1-to-string (car (vlr-data rea)))  ; Layer name.
  46.          " "
  47.          (vl-prin1-to-string (cadr (vlr-data rea))) ; UCS name.
  48.          ") "
  49.        )
  50.      )
  51.      (vlr-data-set rea nil)
  52.    )
  53. )
  54. )
  55. ; Returns old layer name.
  56. (defun MyXr-ChangeLayer (doc cmd / layNew layOld)
  57. (setq layNew
  58.    (cond
  59.      ((= cmd "ATTACH")                           "XREF")
  60.      ((vl-position cmd '("XATTACH" "DWFATTACH")) "XREF-DWG")
  61.      ((= cmd "IMAGEATTACH")                      "XREF-IMAGE")
  62.      ((= cmd "PDFATTACH")                        "XREF-PDF")
  63.      ((= cmd "POINTCLOUDATTACH")                 "XREF-POINTCLOUD")
  64.      ((= cmd "COORDINATIONMODELATTACH")          "XREF-COORDINATIONMODEL")
  65.    )
  66. )
  67. (vla-put-lock (vla-add (vla-get-layers doc) layNew) :vlax-true)
  68. (setq layOld (getvar 'clayer))
  69. (setvar 'clayer layNew)
  70. layOld
  71. )
  72. ; Returns "WCS" (UCS has been changed to 'World') or "".
  73. (defun MyXr-ChangeUcs (doc / reply)
  74. (cond
  75.    ((= 1 (getvar 'worlducs))
  76.      ""
  77.    )
  78.    (
  79.      (/=
  80.        6
  81.        (setq reply
  82.          (acet-ui-message
  83.            "Het huidige UCS is niet 'World'\nUCS aanpassen naar 'World'?"
  84.            "UCS SYSTEM"
  85.            (+ acet:yesno acet:iconquestion)
  86.          )
  87.        )
  88.      )
  89.      ""
  90.    )
  91.    (T
  92.      (vla-put-activeucs
  93.        doc
  94.        (vla-add
  95.          (vla-get-usercoordinatesystems doc)
  96.          (vlax-3d-point '(0.0 0.0 0.0))
  97.          (vlax-3d-point '(1.0 0.0 0.0))
  98.          (vlax-3d-point '(0.0 1.0 0.0))
  99.          "WCS"
  100.        )
  101.      )
  102.      "WCS"
  103.    )
  104. )
  105. )
  106. (defun MyXr-Restore (layNme ucsNme / enm)
  107. (setvar 'clayer layNme)
  108. (if (/= "" ucsNme)
  109.    (progn
  110.      (setvar 'cmdecho 0)
  111.      (command "_.ucs" "_previous")
  112.      (setvar 'cmdecho 1)
  113.      (if (setq enm (tblobjname "UCS" ucsNme))
  114.        (entdel enm)
  115.      )
  116.    )
  117. )
  118. (princ)
  119. )
  120. (princ)
回复

使用道具 举报

76

主题

312

帖子

254

银币

后起之秀

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

铜币
390
发表于 2022-7-5 17:06:09 | 显示全部楼层
嘿,罗伊,
我试着重新定义命令,但这很不稳定。由于某些原因,CAD无法“取消定义”一行中的几个命令。然后向我抛出一个错误。很奇怪。
 
但你的代码似乎工作得几乎完美
需要制作一个小mod。
 
已替换:
  1.      (if (setq enm (tblobjname "UCS" ucsNme))
  2.        (entdel enm)
  3.      )

适用于:
  1.      (command "_.ucs" "_delete" "WCS")

 
最后一个问题:
我的命令栏现在显示:
  1. Command: (MyXr-Restore "XREF" "WCS")

可以静音吗?
 
我试图将“MyXr Restore”的所有代码粘贴到“MyXr CB End”函数中,但Ucs命令再次被拒绝。。。。
 
谢谢你的帮助!:-)
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:10:07 | 显示全部楼层
尝试:
  1. (vl-load-com)
  2. ;;; Command Reactor for Xref/Attachment layer and UCS.
  3. (if (not *MyXr-rea*)
  4. (setq *MyXr-rea*
  5.    (vlr-command-reactor
  6.      nil
  7.      '(
  8.        (:vlr-commandwillstart . MyXr-CB-Start) ; CB=callback.
  9.        (:vlr-commandended . MyXr-CB-End)
  10.        (:vlr-commandcancelled . MyXr-CB-End)
  11.      )
  12.    )
  13. )
  14. )
  15. (defun MyXr-CB-Start (rea lst / doc layNme ucsNme)
  16. (if
  17.    (vl-position
  18.      (car lst)
  19.      '(
  20.        "ATTACH"
  21.        "XATTACH"
  22.        "DWFATTACH"
  23.        "IMAGEATTACH"
  24.        "PDFATTACH"
  25.        "POINTCLOUDATTACH"
  26.        "COORDINATIONMODELATTACH"
  27.      )
  28.    )
  29.    (progn
  30.      (setq doc (vlr-document rea))
  31.      (setq layNme (MyXr-ChangeLayer doc (car lst)))
  32.      (setq ucsNme (MyXr-ChangeUcs doc))
  33.      (vlr-data-set rea (list layNme ucsNme))
  34.      (setvar 'cmdecho 0)
  35.    )
  36.    (vlr-data-set rea nil)
  37. )
  38. )
  39. (defun MyXr-CB-End (rea lst)
  40. (if (vlr-data rea)
  41.    (progn
  42.      (vla-sendcommand
  43.        (vlr-document rea)
  44.        (strcat
  45.          "(MyXr-Restore "
  46.          (vl-prin1-to-string (car (vlr-data rea)))  ; Layer name.
  47.          " "
  48.          (vl-prin1-to-string (cadr (vlr-data rea))) ; UCS name.
  49.          ") "
  50.        )
  51.      )
  52.      (vlr-data-set rea nil)
  53.    )
  54. )
  55. )
  56. ; Returns old layer name.
  57. (defun MyXr-ChangeLayer (doc cmd / layNew layOld)
  58. (setq layNew
  59.    (cond
  60.      ((= cmd "ATTACH")                           "XREF")
  61.      ((vl-position cmd '("XATTACH" "DWFATTACH")) "XREF-DWG")
  62.      ((= cmd "IMAGEATTACH")                      "XREF-IMAGE")
  63.      ((= cmd "PDFATTACH")                        "XREF-PDF")
  64.      ((= cmd "POINTCLOUDATTACH")                 "XREF-POINTCLOUD")
  65.      ((= cmd "COORDINATIONMODELATTACH")          "XREF-COORDINATIONMODEL")
  66.    )
  67. )
  68. (vla-put-lock (vla-add (vla-get-layers doc) layNew) :vlax-true)
  69. (setq layOld (getvar 'clayer))
  70. (setvar 'clayer layNew)
  71. layOld
  72. )
  73. ; Returns "WCS" (UCS has been changed to 'World') or "".
  74. (defun MyXr-ChangeUcs (doc / reply)
  75. (cond
  76.    ((= 1 (getvar 'worlducs))
  77.      ""
  78.    )
  79.    (
  80.      (/=
  81.        6
  82.        (setq reply
  83.          (acet-ui-message
  84.            "Het huidige UCS is niet 'World'\nUCS aanpassen naar 'World'?"
  85.            "UCS SYSTEM"
  86.            (+ acet:yesno acet:iconquestion)
  87.          )
  88.        )
  89.      )
  90.      ""
  91.    )
  92.    (T
  93.      (vla-put-activeucs
  94.        doc
  95.        (vla-add
  96.          (vla-get-usercoordinatesystems doc)
  97.          (vlax-3d-point '(0.0 0.0 0.0))
  98.          (vlax-3d-point '(1.0 0.0 0.0))
  99.          (vlax-3d-point '(0.0 1.0 0.0))
  100.          "WCS"
  101.        )
  102.      )
  103.      "WCS"
  104.    )
  105. )
  106. )
  107. (defun MyXr-Restore (layNme ucsNme)
  108. (setvar 'clayer layNme)
  109. (if (/= "" ucsNme)
  110.    (progn
  111.      (command "_.ucs" "_previous")
  112.      (if (tblobjname "UCS" ucsNme)
  113.        (command "_.ucs" "_delete" ucsNme)
  114.      )
  115.    )
  116. )
  117. (setvar 'cmdecho 1)
  118. (princ)
  119. )
  120. (princ)
回复

使用道具 举报

76

主题

312

帖子

254

银币

后起之秀

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

铜币
390
发表于 2022-7-5 17:12:49 | 显示全部楼层
嘿,罗伊,
 
我尝试了完全相同的方法,但它没有使命令栏中的行静音:
  1. Command: (MyXr-Restore "XREF" "WCS")

 
看起来VLA命令不能静音,我想??
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:15:51 | 显示全部楼层
AutoCAD中很可能就是这种情况。在BricsCAD中,vla sendcommand字符串从不回显到命令栏(但在滚动之前的命令时可见)。
回复

使用道具 举报

76

主题

312

帖子

254

银币

后起之秀

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

铜币
390
发表于 2022-7-5 17:16:53 | 显示全部楼层
啊哈,我明白了,那我就不得不接受了
 
谢谢你的帮助!
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:21:22 | 显示全部楼层
你可以试着让回声看起来“更好”:
  1. (vl-load-com)
  2. ;;; Command Reactor for Xref/Attachment layer and UCS.
  3. (if (not *MyXr-rea*)
  4. (setq *MyXr-rea*
  5.    (vlr-command-reactor
  6.      nil
  7.      '(
  8.        (:vlr-commandwillstart . MyXr-CB-Start) ; CB=callback.
  9.        (:vlr-commandended . MyXr-CB-End)
  10.        (:vlr-commandcancelled . MyXr-CB-End)
  11.      )
  12.    )
  13. )
  14. (setq *MyXr-layNme* nil)
  15. (setq *MyXr-ucsNme* nil)
  16. )
  17. (defun MyXr-CB-Start (rea lst / doc)
  18. (if
  19.    (vl-position
  20.      (car lst)
  21.      '(
  22.        "ATTACH"
  23.        "XATTACH"
  24.        "DWFATTACH"
  25.        "IMAGEATTACH"
  26.        "PDFATTACH"
  27.        "POINTCLOUDATTACH"
  28.        "COORDINATIONMODELATTACH"
  29.      )
  30.    )
  31.    (progn
  32.      (setq doc (vlr-document rea))
  33.      (setq *MyXr-layNme* (MyXr-ChangeLayer doc (car lst)))
  34.      (setq *MyXr-ucsNme* (MyXr-ChangeUcs doc))
  35.    )
  36.    (progn
  37.      (setq *MyXr-layNme* nil)
  38.      (setq *MyXr-ucsNme* nil)
  39.    )
  40. )
  41. )
  42. (defun MyXr-CB-End (rea lst)
  43. (if (and *MyXr-layNme* *MyXr-ucsNme*)
  44.    (vla-sendcommand (vlr-document rea) "MyXr-Restore ")
  45. )
  46. )
  47. ; Returns old layer name.
  48. (defun MyXr-ChangeLayer (doc cmd / layNew layOld)
  49. (setq layNew
  50.    (cond
  51.      ((= cmd "ATTACH")                           "XREF")
  52.      ((vl-position cmd '("XATTACH" "DWFATTACH")) "XREF-DWG")
  53.      ((= cmd "IMAGEATTACH")                      "XREF-IMAGE")
  54.      ((= cmd "PDFATTACH")                        "XREF-PDF")
  55.      ((= cmd "POINTCLOUDATTACH")                 "XREF-POINTCLOUD")
  56.      ((= cmd "COORDINATIONMODELATTACH")          "XREF-COORDINATIONMODEL")
  57.    )
  58. )
  59. (vla-put-lock (vla-add (vla-get-layers doc) layNew) :vlax-true)
  60. (setq layOld (getvar 'clayer))
  61. (setvar 'clayer layNew)
  62. layOld
  63. )
  64. ; Returns "WCS" (UCS has been changed to 'World') or "".
  65. (defun MyXr-ChangeUcs (doc / reply)
  66. (cond
  67.    ((= 1 (getvar 'worlducs))
  68.      ""
  69.    )
  70.    (
  71.      (/=
  72.        6
  73.        (setq reply
  74.          (acet-ui-message
  75.            "Het huidige UCS is niet 'World'\nUCS aanpassen naar 'World'?"
  76.            "UCS SYSTEM"
  77.            (+ acet:yesno acet:iconquestion)
  78.          )
  79.        )
  80.      )
  81.      ""
  82.    )
  83.    (T
  84.      (vla-put-activeucs
  85.        doc
  86.        (vla-add
  87.          (vla-get-usercoordinatesystems doc)
  88.          (vlax-3d-point '(0.0 0.0 0.0))
  89.          (vlax-3d-point '(1.0 0.0 0.0))
  90.          (vlax-3d-point '(0.0 1.0 0.0))
  91.          "WCS"
  92.        )
  93.      )
  94.      "WCS"
  95.    )
  96. )
  97. )
  98. (defun c:MyXr-Restore ()
  99. (if (and *MyXr-layNme* *MyXr-ucsNme*)
  100.    (progn
  101.      (setvar 'clayer *MyXr-layNme*)
  102.      (if (/= "" *MyXr-ucsNme*)
  103.        (progn
  104.          (setvar 'cmdecho 0)
  105.          (command "_.ucs" "_previous")
  106.          (if (tblobjname "UCS" *MyXr-ucsNme*)
  107.            (command "_.ucs" "_delete" *MyXr-ucsNme*)
  108.          )
  109.          (setvar 'cmdecho 1)
  110.        )
  111.      )
  112.      (setq *MyXr-layNme* nil)
  113.      (setq *MyXr-ucsNme* nil)
  114.    )
  115. )
  116. (princ)
  117. )
  118. (princ)
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:24:55 | 显示全部楼层
@罗伊,小建议缩短几行:
 
  1. (setq layNew
  2. (cond
  3.    ((= cmd "ATTACH")                           "XREF")
  4.    ((vl-position cmd '("XATTACH" "DWFATTACH")) "XREF-DWG")
  5.    ((= cmd "IMAGEATTACH")                      "XREF-IMAGE")
  6.    ((= cmd "PDFATTACH")                        "XREF-PDF")
  7.    ((= cmd "POINTCLOUDATTACH")                 "XREF-POINTCLOUD")
  8.    ((= cmd "COORDINATIONMODELATTACH")          "XREF-COORDINATIONMODEL")
  9. )
  10. )

 
  1. (setq layNew
  2. (cadr
  3.    (assoc cmd '( ("ATTACH" "XREF") ("XATTACH" "XREF-DWG") ("DWFATTACH" "XREF-DWG") ("IMAGEATTACH" "XREF-IMAGE")
  4.    ("PDFATTACH" "XREF-PDF") ("POINTCLOUDATTACH" "XREF-POINTCLOUD") ("COORDINATIONMODELATTACH" "XREF-COORDINATIONMODEL") ))
  5. )
  6. )
回复

使用道具 举报

27

主题

113

帖子

90

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
132
发表于 2022-7-5 17:28:25 | 显示全部楼层
我的2美分(我自己的“添加外部参照并恢复当前UCS”命令)。虽然没有那么详细,但它可能是有用的。
 
  1. (Defun c:xrl (/ huidigelaag xrefbestand)
  2. (setq huidigelaag (getvar "clayer"))
  3. (setq xrefbestand (getfiled "Kies het bestand dat je als Xref wilt gebruiken:" "L:/STARTMAP/_Projecten/" "dwg" 10))
  4. (command "UCS" "Named" "Save" "TEMP-UCS" "Y")
  5. (command "UCS" "world")
  6. (command "-layer" "make" "X-XX-AL-REFERENTIE-G" "")
  7. (command "_-xref" "overlay" xrefbestand '(0 0 0) "1" "1" "0")
  8. (Command "-Layer" "set" huidigelaag "")
  9. (command "UCS" "NAmed" "Restore" "TEMP-UCS")
  10. (princ "\nXref geplaatst.")
  11. )

 
由于您也是荷兰人,因此这也将外部参照放置在右侧的NLCS标准中。它只适用于DWG文件,但可能可以修改以加载其他文件。
它没有错误处理等等,但在我的情况下,它工作得很好。
 
需要根据自己的情况更改“startmap”位置,以加快浏览速度。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-20 21:56 , Processed in 2.629789 second(s), 70 queries .

© 2020-2025 乐筑天下

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