乐筑天下

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

[编程交流] 从其他绘图复制对象

[复制链接]

9

主题

22

帖子

13

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-6 22:06:39 | 显示全部楼层 |阅读模式
你好。我编写了一个代码,可以在活动文件目录中打开多个dwg文件并复制对象。但和往常一样,我有一个问题:
 
  1. Sub MergeDrawings()
  2.    Dim CurrentFile As String
  3.    Dim Path As String
  4.    Dim ssMerge As AcadSelectionSet
  5.    Dim maindrawing As AcadDocument
  6.    Dim tempdrawing As AcadDocument
  7.    Dim destEnts As Variant
  8.    Dim sourceEnts() As AcadObject
  9.    
  10.    Set maindrawing = Application.ActiveDocument()
  11.    
  12.    Path = Application.ActiveDocument.Path()
  13.          
  14.    CurrentFile = Dir(Path + "\*.dwg", vbNormal)
  15.    
  16.    Do While CurrentFile <> ""
  17.       
  18.        If Path & "" & CurrentFile = maindrawing.FullName() Then
  19.            
  20.            GoTo 98176
  21.            
  22.        End If
  23.       
  24.    
  25.        Application.Documents.Open CurrentFile, False
  26.       
  27.        Set tempdrawing = Application.ActiveDocument()
  28.       
  29.        Set ssMerge = tempdrawing.SelectionSets.Add("SSMERGE03")
  30.        ssMerge.Select acSelectionSetAll
  31.                               
  32.        ReDim sourceEnts(ssMerge.Count - 1)
  33.        For i = 0 To ssMerge.Count - 1
  34.            Set sourceEnts(i) = ssMerge(i)
  35.        Next
  36.       
  37.             
  38.        destEnts = tempdrawing.CopyObjects(sourceEnts, maindrawing.ModelSpace)
  39.       
  40.        ThisDrawing.Close False
  41.       
  42. 98176   CurrentFile = Dir
  43.        MsgBox ("done")
  44.       
  45.    Loop
  46. End Sub

 
实际上它是有效的,但是;
 
  1. destEnts = tempdrawing.CopyObjects(sourceEnts,maindrawing.ModelSpace)

 
不允许我设置插入点。它只是将对象粘贴到其原始位置。我需要设置插入点的左下角,以便在其旁边添加其他图形。
 
对不起我的英语。提前谢谢。
回复

使用道具 举报

12

主题

175

帖子

77

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
149
发表于 2022-7-6 22:22:18 | 显示全部楼层
一些猜测
1) 将每个对象设置为在将其添加到sourceEnts()之前复制插入点
2) 将每个复制的对象插入点添加到目标文件后,使用以下方法设置它们:
  1. destEnts = tempdrawing.CopyObjects(sourceEnts, maindrawing.ModelSpace)
  2. dim myObj as AcadObject
  3. For i = 0 To ssMerge.Count - 1
  4.        Set myObj = sourceEnts(i)
  5.       ' add code to change myObj insertion point
  6. Next

 
一些最后的笔记(和猜测)
a) 我从AutoCAD ActiveX和VBA参考中看到,您声明为“Variant”的内容应声明为“Object”。可能这不会影响CopyObjects的结果,因为你说你在新文件中得到了它们。但以防万一。。。
b) 您将“所有者”设置为主图形。模型空间。这听起来像是默认选项。也许你可以试着把它设置为Tempdrawing。模型空间
回复

使用道具 举报

9

主题

22

帖子

13

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-6 22:38:30 | 显示全部楼层
感谢您的努力和建议RICVBA。昨晚,我与代码作了斗争,不知何故我做到了。在从tempdrawing复制项目之前,我将它们移动到所需的位置。但有一个小问题,AutoCAD在Windows中打开每个图形,所以如果有太多的图形,这个过程会花费太多时间。我想知道是否有一种方法可以“在后台做事”。但这并不重要,代码对我来说已经足够好了。
 
  1. Sub MergeDrawings()
  2.    Dim CurrentFile As String
  3.    Dim Path As String
  4.    Dim ssMerge As AcadSelectionSet
  5.    Dim maindrawing As AcadDocument
  6.    Dim tempdrawing As AcadDocument
  7.    Dim destEnts As Variant
  8.    Dim sourceEnts() As AcadObject
  9.    Dim tempEnt As AcadEntity
  10.    
  11.    Dim Extmin As Variant
  12.    Dim Extmax As Variant
  13.    
  14.    Dim tempP1(2) As Double
  15.    Dim tempP2(2) As Double
  16.    
  17.    'Define origin
  18.    tempP1(0) = 0
  19.    tempP1(1) = 0
  20.    tempP1(2) = 0
  21.    
  22.    Set maindrawing = Application.ActiveDocument()
  23.    
  24.    'Set Drawing path
  25.    Path = Application.ActiveDocument.Path()
  26.    CurrentFile = Dir(Path + "\*.dwg", vbNormal)
  27.    
  28.    'Open Drawings
  29.    Do While CurrentFile <> ""
  30.          
  31.        'Skip main drawing
  32.        If Path & "" & CurrentFile = maindrawing.FullName() Then
  33.            
  34.            GoTo 98176
  35.            
  36.        End If
  37.       
  38.        'Open temporary drawing for merge
  39.        Application.Documents.Open CurrentFile, False
  40.        Set tempdrawing = Application.ActiveDocument()
  41.       
  42.        'Regen for extent values
  43.        maindrawing.Activate
  44.        ThisDrawing.Regen (acAllViewports)
  45.                
  46.        Extmin = maindrawing.GetVariable("EXTMIN")
  47.        Extmax = maindrawing.GetVariable("EXTMAX")
  48.             
  49.        'Set move distance
  50.        d = Extmax(0) - Extmin(0)
  51.       
  52.        'Set destination move point
  53.        tempP2(0) = d
  54.        tempP2(1) = 0
  55.        tempP2(2) = 0
  56.                            
  57.        tempdrawing.Activate
  58.               
  59.        Set ssMerge = tempdrawing.SelectionSets.Add("SSMERGE03")
  60.        ssMerge.Select acSelectionSetAll
  61.       
  62.        'Move entities
  63.        For Each tempEnt In ssMerge
  64.            tempEnt.Move tempP1, tempP2
  65.        Next
  66.                               
  67.        'Set array for copy
  68.        ReDim sourceEnts(ssMerge.Count - 1)
  69.        For i = 0 To ssMerge.Count - 1
  70.            Set sourceEnts(i) = ssMerge(i)
  71.        Next
  72.             
  73.        destEnts = tempdrawing.CopyObjects(sourceEnts, maindrawing.ModelSpace)
  74.       
  75.        ThisDrawing.Close False
  76.       
  77. 98176   CurrentFile = Dir
  78.       
  79.    Loop
  80.       
  81.    ssMerge.Delete
  82. End Sub
回复

使用道具 举报

12

主题

175

帖子

77

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
149
发表于 2022-7-6 22:52:33 | 显示全部楼层
所以你已经做了类似于我的“猜测”数字1)
 
关于时间问题,我可以指出以下几点
一) 在宏的开头将AutoCAD Visible属性设置为“False”
所以你可以摆脱那些耗时的可视化工作
然后记得在宏结束之前将该属性设置回“True”
 
二) 使用ObjectDBX
正如肖特最近在这个论坛上所记得的那样(http://www.cadtutor.net/forum/showthread.php?30302-所选线路长度的VBA代码&p=608193#post608193)
它应该允许您“使用”图形,而不必在Autocad中打开它们,因为您使用的是它们的数据库(每个Autocad图形实际上都是这样的)
回复

使用道具 举报

9

主题

22

帖子

13

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-6 22:55:21 | 显示全部楼层
是的,很接近你的建议,效果很好。实际上是Autocad。可见属性差别不大。稍后我将尝试使用ObjectDBX。
 
再次感谢我的朋友。你和论坛里的其他人都很友善,很有帮助。我真的很感激。
回复

使用道具 举报

12

主题

175

帖子

77

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
149
发表于 2022-7-6 23:08:35 | 显示全部楼层
 
如果您能发布ObjectDBX的成果,我很乐意与大家分享。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 09:01 , Processed in 0.391702 second(s), 64 queries .

© 2020-2025 乐筑天下

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