乐筑天下

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

将单元值发送到AutoCAD

[复制链接]

238

主题

769

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1721
发表于 2021-5-21 09:21:13 | 显示全部楼层 |阅读模式
我试图找到一种方法,在命令行中向激活的命令发送单元格值。
基本上,我有一个excel文件,在A1列中有结构名称- A20。我想选择A2的单元格,并将该单元格的值发送给一个lisp例程,该例程准备在命令行中使用A2的值。
我花了很长时间试图将所有这些拼凑在一起。所以我的Excel宏代码如下:
Excel文件保存为xlsm。使用References-VBA project as(AutoCAD 2019类型库)
  1. Sub Zoom2Structure()
  2. On Error Resume Next
  3. Set AcadApp = GetObject(, "AutoCAD.Application")
  4. If Err Then
  5. Err.Clear
  6. Set AcadApp = CreateObject("AutoCAD.Application")
  7. End If
  8. AppActivate AcadApp.Caption
  9. AcadApp.Visible = True
  10. AcadApp.Application.WindowState = acNorm
  11. AcadApp.ActiveSpace = acModelSpace
  12. If AcadApp.Documents.Count = 0 Then
  13. AcadApp.Documents.Add
  14. End If
  15. AcadApp.ActiveDocument.SendCommand "zm2st" & vbCr
  16. End Sub

下面的lisp例程有效。
  1. (defun c:zm2st (/         C3D       C3DDOC    LOCATION  NTWRK
  2.                 NTWRKS    PROD      PRODSTR   PT        STRC
  3.                 STRCNAME  STRUCTURES
  4.                )
  5.   (vl-load-com)
  6.   (if (setq C3D    (strcat "HKEY_LOCAL_MACHINE\"
  7.                            (if vlax-user-product-key
  8.                              (vlax-user-product-key)
  9.                              (vlax-product-key)
  10.                            )
  11.                    )
  12.             C3D    (vl-registry-read C3D "Release")
  13.             C3D    (substr
  14.                      C3D
  15.                      1
  16.                      (vl-string-search "." C3D (+ (vl-string-search "." C3D) 1))
  17.                    )
  18.             C3D    (vla-getinterfaceobject
  19.                      (vlax-get-acad-object)
  20.                      (strcat "AeccXUiPipe.AeccPipeApplication." C3D)
  21.                    )
  22.             C3Ddoc (vla-get-activedocument C3D)
  23.       )
  24.     (progn
  25.       (setq ntwrks (vlax-get c3ddoc 'pipenetworks))
  26.       (setq strcname (getstring "\nStructure name to zoom to: " t))
  27.       (vlax-for ntwrk ntwrks
  28.         (if (not strc)
  29.           (progn
  30.             (vl-catch-all-apply
  31.               '(lambda ()
  32.                  (setq structures (vlax-get ntwrk 'structures))
  33.                  (setq strc (vlax-invoke structures 'item strcname))
  34.                )
  35.               '()
  36.             )
  37.           )
  38.         )
  39.       )
  40.       (if strc
  41.         (progn
  42.           (setq location (vlax-get strc 'position))
  43.           (setq pt (list (vlax-get location 'x) (vlax-get location 'y)))
  44.           (command "zoom" "c" pt "40")
  45.         )
  46.         (progn
  47.           (princ (strcat "\nStructure "" strcname "" not found."))
  48.         )
  49.       )
  50.     )
  51.   )
  52.   (princ)
  53. )

当你可以参考旧帖子时,这很棒。这是这两个例子的出处。感谢您的任何指导!同样,我不知道如何让这些功能一起工作。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

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

铜币
238
发表于 2021-5-22 09:23:16 | 显示全部楼层
由于您的问题是关于将值从Excel VBA“发送”到正在运行的AutoCAD的执行列表(由Acad VBA的“SendCommand”语句启动),因此我假设您已经知道如何在Excel工作表中获取单元格值
最简单的方法是使用VBA代码将值保存在AutoCAD的一个用户系统变量(USERI1-5、USERR1-5或USERS1-5)中,然后检索LISP代码中的值(该代码取代了要求用户输入“结构名称”的LISP代码)。在代码中,由于单元格值是文本值(结构名称),您将使用USERS1或USERS2…5。
VBA代码更改如下:
子Zoom2结构(strucName作为字符串)
出现错误时,继续下一步
设置AcadApp=GetObject(,即“AutoCAD.Application”)
如果出错,则
错误清除
设置AcadApp=CreateObject(“AutoCAD.Application”)
如果
激活AcadApp.Caption
AcadApp。可见=真
AcadApp.Application。WindowState=acNorm
AcadApp。ActiveSpace=acModelSpace
如果是AcadApp.Documents。计数=0,然后
AcadApp.Documents.Add
如果
添加此行
这张图。SetVariable“USERS1”,strucName
AcadApp.ActiveDocument。SendCommand“zm2st”和vbCr
结束Sub
  1. (defun c:zm2st (/         C3D       C3DDOC    LOCATION  NTWRK
  2.                 NTWRKS    PROD      PRODSTR   PT        STRC
  3.                 STRCNAME  STRUCTURES
  4.                )
  5.   (vl-load-com)
  6.   (if (setq C3D    (strcat "HKEY_LOCAL_MACHINE\"
  7.                            (if vlax-user-product-key
  8.                              (vlax-user-product-key)
  9.                              (vlax-product-key)
  10.                            )
  11.                    )
  12.             C3D    (vl-registry-read C3D "Release")
  13.             C3D    (substr
  14.                      C3D
  15.                      1
  16.                      (vl-string-search "." C3D (+ (vl-string-search "." C3D) 1))
  17.                    )
  18.             C3D    (vla-getinterfaceobject
  19.                      (vlax-get-acad-object)
  20.                      (strcat "AeccXUiPipe.AeccPipeApplication." C3D)
  21.                    )
  22.             C3Ddoc (vla-get-activedocument C3D)
  23.       )
  24.     (progn
  25.       (setq ntwrks (vlax-get c3ddoc 'pipenetworks))
  26.       ;; Comment this line out
  27.       ;;(setq strcname (getstring "\nStructure name to zoom to: " t))
  28.       ;; add this line
  29.       (setq strucname (getvar "USER1"))
  30.       ... ...
  31.       ... ...  
  32. )

编辑(John):添加代码标记。
回复

使用道具 举报

238

主题

769

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1721
发表于 2021-5-24 13:33:37 | 显示全部楼层
谢谢你在这方面的帮助!如果你不介意的话,我只有几个问题。在Excel VBA侧中。除非删除
,否则无法运行Zoom2Structure宏
  1. Sub Zoom2Structure(strucName As String)

成为
  1. Sub Zoom2Structure()

。然后,我可以从菜单中选择宏。它确实激活了lisp CAD,但不会将选定的单元格值推送通过
在Lisp中,
是否
  1.   '' Add this line
  2. ThisDrawing.SetVariable "USERS1", strucName
  3. AcadApp.ActiveDocument.SendCommand "zm2st" & vbCr

用户1代码,
需要与
匹配
  1. (setq strucname (getvar "USER1"))

“USERS1”
以下是我目前的设置
VBA
  1. Sub Zoom2Structure(structName As String)
  2. On Error Resume Next
  3. Set AcadApp = GetObject(, "AutoCAD.Application")
  4. If Err Then
  5. Err.Clear
  6. Set AcadApp = CreateObject("AutoCAD.Application")
  7. End If
  8. AppActivate AcadApp.Caption
  9. AcadApp.Visible = True
  10. AcadApp.Application.WindowState = acNorm
  11. AcadApp.ActiveSpace = acModelSpace
  12. If AcadApp.Documents.Count = 0 Then
  13. AcadApp.Documents.Add
  14. End If
  15.   '' Add this line
  16. ThisDrawing.SetVariable "USERS1", strucName
  17. AcadApp.ActiveDocument.SendCommand "zm2st" & vbCr
  18. End Sub

LISP
  1. (defun c:zm2st (/         C3D       C3DDOC    LOCATION  NTWRK
  2.                 NTWRKS    PROD      PRODSTR   PT        STRC
  3.                 STRCNAME  STRUCTURES USERS1
  4.                )
  5.   (vl-load-com)
  6.   (if (setq C3D    (strcat "HKEY_LOCAL_MACHINE\"
  7.                            (if vlax-user-product-key
  8.                              (vlax-user-product-key)
  9.                              (vlax-product-key)
  10.                            )
  11.                    )
  12.             C3D    (vl-registry-read C3D "Release")
  13.             C3D    (substr
  14.                      C3D
  15.                      1
  16.                      (vl-string-search "." C3D (+ (vl-string-search "." C3D) 1))
  17.                    )
  18.             C3D    (vla-getinterfaceobject
  19.                      (vlax-get-acad-object)
  20.                      (strcat "AeccXUiPipe.AeccPipeApplication." C3D)
  21.                    )
  22.             C3Ddoc (vla-get-activedocument C3D)
  23.       )
  24.     (progn
  25.       (setq ntwrks (vlax-get c3ddoc 'pipenetworks))
  26.       ;;(setq strcname (getstring "\nStructure name to zoom to: " t))
  27.       (setq strucname (getvar "USERS1"))      
  28.       (vlax-for ntwrk ntwrks
  29.         (if (not strc)
  30.           (progn
  31.             (vl-catch-all-apply
  32.               '(lambda ()
  33.                  (setq structures (vlax-get ntwrk 'structures))
  34.                  (setq strc (vlax-invoke structures 'item strcname))
  35.                )
  36.               '()
  37.             )
  38.           )
  39.         )
  40.       )
  41.       (if strc
  42.         (progn
  43.           (setq location (vlax-get strc 'position))
  44.           (setq pt (list (vlax-get location 'x) (vlax-get location 'y)))
  45.           (command "zoom" "c" pt "40")
  46.         )
  47.         (progn
  48.           (princ (strcat "\nStructure "" strcname "" not found."))
  49.         )
  50.       )
  51.     )
  52.   )
  53.   (princ)
  54. )
  55. (C:ZM2ST)

再次感谢您的帮助!这绝对是很酷的东西当它工作!
回复

使用道具 举报

7

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2021-5-24 15:27:48 | 显示全部楼层
正如你发现的,潜艇不能接受论点。将sub更改为函数。是的,两段代码都需要引用同一个变量“USERS1”。
回复

使用道具 举报

238

主题

769

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1721
发表于 2021-5-24 16:21:29 | 显示全部楼层
能详细说明一下吗?这不仅仅是改变接头的功能那么简单。lol我试过了。它将如何被激活运行?
回复

使用道具 举报

7

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2021-5-24 17:03:22 | 显示全部楼层
是的,只需将关键字Sub改为Function。别忘了结束语。函数不能作为命令直接调用。它必须从公共Sub调用。目的是让Sub中有逻辑来确定函数参数的内容。该结构可以是一个简单的函数:
公共子测试()
调用MyFunction(“测试字符串”)
末端接头
公共函数MyFunction(str作为字符串)
调试。打印str
结束函数
回复

使用道具 举报

238

主题

769

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1721
发表于 2021-5-25 07:45:00 | 显示全部楼层
太棒了。从我所看到的来看,我想我已经有了那部分代码。
这是VBA,我选择A20的单元格值“10”,然后选择功能区中的按钮。它现在激活CAD。
  1. Public Sub Test()
  2.    Call MyFunction("test string")
  3. End Sub
  4. Public Function MyFunction(str As String)
  5.     Debug.Print str
  6. End Function
  7. Public Sub Z2S(call as iRibbon)
  8.     Call Z2STR("structName String")
  9. End Sub
  10. Public Function Z2STR(structName As String)
  11. On Error Resume Next
  12. Set AcadApp = GetObject(, "AutoCAD.Application")
  13. If Err Then
  14. Err.Clear
  15. Set AcadApp = CreateObject("AutoCAD.Application")
  16. End If
  17. AppActivate AcadApp.Caption
  18. AcadApp.Visible = True
  19. AcadApp.Application.WindowState = acNorm
  20. AcadApp.ActiveSpace = acModelSpace
  21. If AcadApp.Documents.Count = 0 Then
  22. AcadApp.Documents.Add
  23. End If
  24.   '' Add this line
  25. ThisDrawing.SetVariable "USERS1", strucName
  26. AcadApp.ActiveDocument.SendCommand "zm2st" & vbCr
  27. End Function

但是,修改后的代码添加了“USERS1”变量,似乎会在lisp端出错。
  1. (defun c:zm2st (/         C3D       C3DDOC    LOCATION  NTWRK
  2.                 NTWRKS    PROD      PRODSTR   PT        STRC
  3.                 STRCNAME  STRUCTURES USERS1
  4.                )
  5. ....
  6.       (setq ntwrks (vlax-get c3ddoc 'pipenetworks))
  7.       ;;(setq strcname (getstring "\nStructure name to zoom to: " t))
  8.       (setq strucname (getvar "USERS1"))      
  9.       (vlax-for ntwrk ntwrks
  10. ....
  1. command:.... ; error: bad argument type: stringp nil

越来越近lol。
回复

使用道具 举报

7

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2021-5-25 10:30:15 | 显示全部楼层
哈哈。很棒的收获。我更改了“strcname”,因此它们在lsp和vba中都是相同的。
我能够执行命令,现在我得到以下内容:
  1. Structure "" not found.
  2. from this area lsp
  3. ....
  4. (princ (strcat "\nStructure "" strcname "" not found.")

在VBA中,哪段代码要求将选择复制到内存中的单元格?
这可能是我错过的最后一步吗?
  1. ....
  2. ThisDrawing.SetVariable "USERS1", strcname
  3. ....

回复

使用道具 举报

238

主题

769

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1721
发表于 2021-5-25 12:02:08 | 显示全部楼层
我不知道您在Excel方面做了什么。您必须确保传递的是有效字符串。您的Z2S sub无效。sub不能有参数,而且您也不能在sub中使用参数。
回复

使用道具 举报

7

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
135
发表于 2021-5-25 16:26:44 | 显示全部楼层
老实说,如果A1中的文本值为10,我想将该单元格值传递给例程。我假设,如果A1中有一个公式,它会取这个值并通过它。我希望我的回答是正确的。英雄联盟
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 22:31 , Processed in 0.793203 second(s), 72 queries .

© 2020-2025 乐筑天下

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