乐筑天下

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

[讨论]Bug??炸开插入文件块后MText也被炸开。

[复制链接]

6

主题

20

帖子

2

银币

初来乍到

Rank: 1

铜币
44
发表于 2003-12-16 09:26:00 | 显示全部楼层 |阅读模式
我用VBA将一个DWG文件插入当前文件中,代码如下:
插入结果是MText也被炸开称为Text,但是PLine等却没有被炸开,请问是不是CAD的bug?
我用的是2000中文版。
Public Sub insertFile()
  Dim insertPoint(0 To 2) As Double
  Dim block As AcadBlockReference
  Dim FileToInsert As String
  insertPoint(0) = 0
  insertPoint(1) = 0
  insertPoint(2) = 0
  
  FileToInsert = "C:\MText.dwg"
  Set block = ThisDrawing.ModelSpace.InsertBlock(insertPoint, FileToInsert, 1, 1, 1, 0)
  block.Explode
  'block.Delete
End Sub
回复

使用道具 举报

28

主题

117

帖子

4

银币

后起之秀

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

铜币
229
发表于 2003-12-16 09:58:00 | 显示全部楼层
呵呵,奇怪了,居然跟用Explode命令的效果不同?
实在不行的话就用thisdrawing.sendcommand "Explode last  "
来代替block.Explode咯
回复

使用道具 举报

6

主题

20

帖子

2

银币

初来乍到

Rank: 1

铜币
44
发表于 2003-12-16 10:17:00 | 显示全部楼层
谢谢回复!
看来我只有用sendcommand代替了。
回复

使用道具 举报

6

主题

20

帖子

2

银币

初来乍到

Rank: 1

铜币
44
发表于 2003-12-16 15:41:00 | 显示全部楼层
刚刚实际应用时发现一点小问题:当被插入的文件中有图层被关闭时用"Explode last  "时不会炸开图形,修改为直接使用句柄作为Explode的参数即可。完整代码如下:
Public Sub insertFile()
  Dim insertPoint(0 To 2) As Double
  Dim block As AcadBlockReference
  Dim FileToInsert As String
  insertPoint(0) = 0
  insertPoint(1) = 0
  insertPoint(2) = 0
  
  FileToInsert = "C:\MText.dwg"
  Set block = ThisDrawing.ModelSpace.InsertBlock(insertPoint, FileToInsert, 1, 1, 1, 0)
  'block.Explode
  'block.Delete
'  ThisDrawing.SendCommand "explode " & axEnt2lspEnt(block) & "  "
   ThisDrawing.SendCommand "explode last  "
End Sub
Public Function axEnt2lspEnt(entObj As AcadEntity) As String
    Dim entHandle As String
    entHandle = entObj.Handle
    axEnt2lspEnt = "(handent " & Chr(34) & entHandle & Chr(34) & ")"
End Function
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2003-12-17 15:11:00 | 显示全部楼层
以下函数可解决该问题,该函数使用了大家比较少认识的CopyObjects方法来直接将图块中的对象复制到当前的空间中并按照插入点的位置移动到图块插入的位置。
  1. Sub BlkExp()
  2.     Dim ent As AcadEntity
  3.     Dim pnt As Variant
  4.     On Error Resume Next
  5.     Do
  6.         ThisDrawing.Utility.GetEntity ent, pnt, "选择要分解的图块参照对象:"
  7.         If Err  0 Then
  8.             Err.Clear
  9.         Else
  10.             If ent.ObjectName = "AcDbBlockReference" Then Exit Do
  11.         End If
  12.     Loop
  13.     MsgBox "选定的图块被分解后共有" & UBound(BlockRefExplode(ent)) & "个图元。", , "乐筑天下VBA示例"
  14. End Sub
  15. ' 该函数用于代替ActiveX方法中图块的Explode方法, _
  16.   因为原先的Explode方法带有BUG, _
  17.   分解带MText时连MText都被分解成Text。
  18.   
  19. Function BlockRefExplode(BlockRef As AcadBlockReference) As Variant
  20.     Dim Space As AcadBlock
  21.     Dim BlockName As String
  22.     Dim InsertPoint As Variant
  23.     Dim OriginPoint(2) As Double
  24.     Dim Block As AcadBlock
  25.     BlockName = BlockRef.Name
  26.     InsertPoint = BlockRef.InsertionPoint
  27.     Set Space = ThisDrawing.ObjectIdToObject(BlockRef.OwnerID)
  28.     Set Block = ThisDrawing.Blocks(BlockName)
  29.     Dim BlkEnt() As AcadEntity
  30.     ReDim BlkEnt(Block.Count - 1)
  31.     Dim i As Long
  32.     For i = 0 To Block.Count - 1
  33.         Set BlkEnt(i) = Block(i)
  34.     Next
  35.     Dim SpaceCount As Long
  36.     SpaceCount = Space.Count
  37.     ThisDrawing.CopyObjects BlkEnt, Space
  38.    
  39.     Dim TotalCount As Long
  40.     TotalCount = Space.Count - SpaceCount
  41.    
  42.     Dim BlkRefEnt() As AcadEntity
  43.     ReDim BlkRefEnt(TotalCount)
  44.     For i = 0 To TotalCount - 1
  45.         Space(i + SpaceCount).Move OriginPoint, InsertPoint
  46.         Set BlkRefEnt(i) = Space(i + SpaceCount)
  47.     Next
  48.     BlockRef.Delete
  49.     BlockRefExplode = BlkRefEnt
  50. End Function
回复

使用道具 举报

6

主题

20

帖子

2

银币

初来乍到

Rank: 1

铜币
44
发表于 2003-12-18 11:40:00 | 显示全部楼层
谢谢老大!
我认为直接用Sendcommand运行CAD的命令不是太好,但是有时候又不知道如何直接用VBA解决一些问题,下面的代码也是直接用CAD的Pedit命令将一些首尾相连的直线连接成一个PLine,老大可不可以转换为直接使用VBA函数实现同样功能?
'合并选择集中分离的线为PLine
Public Sub JoinLineToPline(sel As AcadSelectionSet)
   Dim strCommand As String
    strCommand = "_Pedit" & vbCr & axEnt2lspEnt(sel.Item(0)) & " Y J "
    Dim i As Integer
      For i = 0 To sel.Count - 1
        strCommand = strCommand + axEnt2lspEnt(sel.Item(i)) + vbCr
      Next
      strCommand = strCommand + vbCr + vbCr
      ThisDrawing.SendCommand strCommand
End Sub
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-15 07:32 , Processed in 0.437613 second(s), 64 queries .

© 2020-2025 乐筑天下

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