乐筑天下

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

[编程交流] 使用VBA插入块

[复制链接]

1

主题

6

帖子

8

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 17:24:27 | 显示全部楼层 |阅读模式
我试图通过vba将一个块从“主块”图形插入到另一个图形中。这张“主块”图几乎包含了我们所有的块。我可以将dwg文件作为块插入,没有任何问题。但我不确定从何处开始,将主块图形中的特定块插入到另一个图形中。
 
我是否使用insertblock方法?
 
提前谢谢。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 17:37:37 | 显示全部楼层
一般方法是打开块容器文件:
 
Dim objContainFile作为一个DDocument
设置objContainFile=ThisDrawing。应用文件。打开(文档路径)
(或者,如果您希望在后台打开文档,请使用AxDbDocument。使用VBA项目中包含的相应ObjectDBX引用打开)
 
现在打开容器文件:
 
objContainFile。CopyObjects(对象,当前图形)
 
其中,对象是所需的块,当前图形是复制的块新文档。
回复

使用道具 举报

1

主题

6

帖子

8

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 17:40:15 | 显示全部楼层
我很抱歉,但我觉得我有点迷路了。
以下是更多信息:
希望在图形中插入块(Drawing1.dwg)
我要插入的块在以下目录中名为Block\u drawing\u civil的图形中命名为C01:C:\hfl\u civil\u blocks
 
所以代码应该是
 
  1. Dim objContainFile as AcadDocument
  2. Set objContainFile = AxDbDocument.Open("C:\hfl_civil_blocks\block_drawing_civil.dwg")

 
我该怎么办。我仍然使用insertblock方法吗?如何将块从一个图形中转移到另一个图形中?
 
非常感谢你的帮助。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 17:47:29 | 显示全部楼层
 
 
事实上,我道歉。我在最初的帖子中略过了一两个关键步骤。下面的示例显示了如何处理列出的参数。
 
  1. Option Explicit
  2. Sub TestDwg2DwgBlkTrans() 'Change as required
  3. Dim strPath As String
  4. Dim strBlockName As String
  5. Dim objBlock As AcadBlock
  6. Dim entRef As AcadBlockReference
  7. Dim dblPkPt() As Double
  8.   strBlockName = "C01"
  9.   strPath = "C:\hfl_civil_blocks\block_drawing_civil.dwg"
  10.   On Error Resume Next
  11.   Set objBlock = ThisDrawing.Blocks.Item(strBlockName)
  12.   On Error GoTo 0
  13.   If Not objBlock Is Nothing Then objBlock.Delete 'To reinitialize Block from container file
  14.   DbxCopyBlock strBlockName, strPath 'Copy block into ThisDrawing
  15.   dblPkPt = ThisDrawing.Utility.GetPoint(, "Pick insertion Point: ") 'Get insertion point for test insert
  16.   Set entRef = ThisDrawing.ModelSpace.InsertBlock(dblPkPt, "C01", 1#, 1#, 1#, 0#) 'Test insert
  17. End Sub
  18. Sub DbxCopyBlock(strBlockName As String, strPath As String)
  19. Dim strFullDef As String
  20. Dim objBlock As AcadBlock
  21. Dim colBlocks As AcadBlocks
  22. Dim objArray(0) As Object
  23. Dim ACDbx As Object
  24.   Set ACDbx = GetAcDbxDoc()
  25.   ACDbx.Open strPath
  26.   Set colBlocks = ACDbx.Blocks
  27.   Set objBlock = colBlocks.Item(strBlockName) 'Find appropriate block in container file's Blocks Collection
  28.   Set objArray(0) = objBlock 'Create object array as required by the CopyObjects Method
  29.   ACDbx.CopyObjects objArray, ThisDrawing.Blocks 'Copy to current drawing's Blocks Collection
  30.   Set ACDbx = Nothing
  31. End Sub
  32. Function GetAcDbxDoc() As Object
  33. Dim strAcadVersion As String
  34. With ThisDrawing.Application
  35.   strAcadVersion = Mid(.Version, 1, 2)
  36.   If CInt(strAcadVersion) < 16 Then
  37.       Set GetAcDbxDoc = .GetInterfaceObject("ObjectDBX.AxDbDocument")
  38.   Else
  39.       Set GetAcDbxDoc = .GetInterfaceObject("ObjectDBX.AxDbDocument." & strAcadVersion)
  40.   End If
  41. End With
  42. End Function
回复

使用道具 举报

1

主题

6

帖子

8

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 17:57:49 | 显示全部楼层
非常感谢您的帮助。
我对联机代码有点问题
 
设置GetAcDbxDoc=。GetInterfaceObject(“ObjectDBX.AxDbDocument。”&斯特拉卡版本)
 
它告诉我“需要对象”,我认为这可能与我的引用有关,但我加载了AutoCAD/ObjectDBX common 16.0类型库。所以我不确定是否还有我需要的其他参考资料,或者这甚至不是问题所在。
 
再次感谢你的帮助。
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 18:06:54 | 显示全部楼层
有几件事:
 
我不使用Civil 3d,所以我没有任何直接的测试方法。
 
我以为2008年使用了ObjectDBX common 17.0,但我可能错了。双重检查是查询AutoCAD系统变量ACADVER。如果在命令行中键入,则整数部分将是strAcadVersion中在行中所需的数字:
 
  1. Set GetAcDbxDoc = .GetInterfaceObject("ObjectDBX.AxDbDocument." & strAcadVersion)

这可能是有道理的,只是硬编码。
 
 
另一件事与objectDBX问题无关——代码行:
 
  1. On Error Resume Next
  2. Set objBlock = ThisDrawing.Blocks.Item(strBlockName)
  3. On Error GoTo 0
  4. If Not objBlock Is Nothing Then objBlock.Delete 'To reinitialize Block from container file

 
我们进行了一些初步测试,将需要重新设计日常使用的例行程序。
回复

使用道具 举报

1

主题

6

帖子

8

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 18:12:44 | 显示全部楼层
我现在一切都很好。非常感谢您的帮助。非常感谢。
 
但我还有一个与此相关的问题。
 
有没有办法选择要将块插入的绘图任务。我可以把它插入上次访问的文件中吗?我从access数据库发送此信息,有时我们会打开两个或多个autocad会话。如果是这种情况,那么我希望能够选择会话并将块插入到我选择或激活的特定会话中。似乎当前程序将块插入到首先打开的会话中。
 
谢谢
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 18:17:05 | 显示全部楼层
 
您说您是“从access数据库发送”,所以我假设您在某个时候使用了GetObject()(这也解释了为什么第一个AutoCAD会话得到优先处理)。
 
如果是这样,是否可以通过从目标会话调用的AutoCAD VBA例程启动访问代码?这样你就有机会通过这张图。可以想象,应用程序是访问例程的正确实例,因此不需要GetObject。
回复

使用道具 举报

1

主题

6

帖子

8

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 18:26:53 | 显示全部楼层
我编写了一些代码,从AutoCAD的一个会话中打开access数据库,但它似乎并没有解决我的问题。
 
但我什么都没通过,我所做的只是从一个不是第一次打开的AutoCAD会话中打开db。不幸的是,当我试图将块发送回CAD时,它转到了第一个实例。
 
但当我打开它时,我可能能够“传递”当前图形以访问它。(如果我能想出办法的话)。我会尽量让你知道的。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 16:47 , Processed in 0.546200 second(s), 70 queries .

© 2020-2025 乐筑天下

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