kunekainen 发表于 2022-7-6 22:06:39

从其他绘图复制对象

你好。我编写了一个代码,可以在活动文件目录中打开多个dwg文件并复制对象。但和往常一样,我有一个问题:
 
Sub MergeDrawings()

   Dim CurrentFile As String
   Dim Path As String
   Dim ssMerge As AcadSelectionSet
   Dim maindrawing As AcadDocument
   Dim tempdrawing As AcadDocument
   Dim destEnts As Variant
   Dim sourceEnts() As AcadObject
   
   Set maindrawing = Application.ActiveDocument()
   
   Path = Application.ActiveDocument.Path()
         
   CurrentFile = Dir(Path + "\*.dwg", vbNormal)
   
   Do While CurrentFile <> ""
      
       If Path & "\" & CurrentFile = maindrawing.FullName() Then
         
         GoTo 98176
         
       End If
      
   
       Application.Documents.Open CurrentFile, False
      
       Set tempdrawing = Application.ActiveDocument()
      
       Set ssMerge = tempdrawing.SelectionSets.Add("SSMERGE03")
       ssMerge.Select acSelectionSetAll
                              
       ReDim sourceEnts(ssMerge.Count - 1)
       For i = 0 To ssMerge.Count - 1
         Set sourceEnts(i) = ssMerge(i)
       Next
      
            
       destEnts = tempdrawing.CopyObjects(sourceEnts, maindrawing.ModelSpace)
      
       ThisDrawing.Close False
      
98176   CurrentFile = Dir

       MsgBox ("done")
      
   Loop

End Sub
 
实际上它是有效的,但是;
 
destEnts = tempdrawing.CopyObjects(sourceEnts,maindrawing.ModelSpace)
 
不允许我设置插入点。它只是将对象粘贴到其原始位置。我需要设置插入点的左下角,以便在其旁边添加其他图形。
 
对不起我的英语。提前谢谢。

RICVBA 发表于 2022-7-6 22:22:18

一些猜测
1) 将每个对象设置为在将其添加到sourceEnts()之前复制插入点
2) 将每个复制的对象插入点添加到目标文件后,使用以下方法设置它们:


destEnts = tempdrawing.CopyObjects(sourceEnts, maindrawing.ModelSpace)

dim myObj as AcadObject

For i = 0 To ssMerge.Count - 1

       Set myObj = sourceEnts(i)

      ' add code to change myObj insertion point

Next

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

kunekainen 发表于 2022-7-6 22:38:30

感谢您的努力和建议RICVBA。昨晚,我与代码作了斗争,不知何故我做到了。在从tempdrawing复制项目之前,我将它们移动到所需的位置。但有一个小问题,AutoCAD在Windows中打开每个图形,所以如果有太多的图形,这个过程会花费太多时间。我想知道是否有一种方法可以“在后台做事”。但这并不重要,代码对我来说已经足够好了。
 

Sub MergeDrawings()

   Dim CurrentFile As String
   Dim Path As String
   Dim ssMerge As AcadSelectionSet
   Dim maindrawing As AcadDocument
   Dim tempdrawing As AcadDocument
   Dim destEnts As Variant
   Dim sourceEnts() As AcadObject
   Dim tempEnt As AcadEntity
   
   Dim Extmin As Variant
   Dim Extmax As Variant
   
   Dim tempP1(2) As Double
   Dim tempP2(2) As Double
   
   'Define origin
   tempP1(0) = 0
   tempP1(1) = 0
   tempP1(2) = 0
   
   Set maindrawing = Application.ActiveDocument()
   
   'Set Drawing path
   Path = Application.ActiveDocument.Path()
   CurrentFile = Dir(Path + "\*.dwg", vbNormal)
   
   'Open Drawings
   Do While CurrentFile <> ""
         
       'Skip main drawing
       If Path & "\" & CurrentFile = maindrawing.FullName() Then
         
         GoTo 98176
         
       End If
      
       'Open temporary drawing for merge
       Application.Documents.Open CurrentFile, False
       Set tempdrawing = Application.ActiveDocument()
      
       'Regen for extent values
       maindrawing.Activate
       ThisDrawing.Regen (acAllViewports)
               
       Extmin = maindrawing.GetVariable("EXTMIN")
       Extmax = maindrawing.GetVariable("EXTMAX")
            
       'Set move distance
       d = Extmax(0) - Extmin(0)
      
       'Set destination move point
       tempP2(0) = d
       tempP2(1) = 0
       tempP2(2) = 0
                           
       tempdrawing.Activate
            
       Set ssMerge = tempdrawing.SelectionSets.Add("SSMERGE03")
       ssMerge.Select acSelectionSetAll
      
       'Move entities
       For Each tempEnt In ssMerge

         tempEnt.Move tempP1, tempP2

       Next
                              
       'Set array for copy
       ReDim sourceEnts(ssMerge.Count - 1)
       For i = 0 To ssMerge.Count - 1
         Set sourceEnts(i) = ssMerge(i)
       Next
            
       destEnts = tempdrawing.CopyObjects(sourceEnts, maindrawing.ModelSpace)
      
       ThisDrawing.Close False
      
98176   CurrentFile = Dir
      
   Loop
      
   ssMerge.Delete

End Sub

RICVBA 发表于 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图形实际上都是这样的)

kunekainen 发表于 2022-7-6 22:55:21

是的,很接近你的建议,效果很好。实际上是Autocad。可见属性差别不大。稍后我将尝试使用ObjectDBX。
 
再次感谢我的朋友。你和论坛里的其他人都很友善,很有帮助。我真的很感激。

RICVBA 发表于 2022-7-6 23:08:35

 
如果您能发布ObjectDBX的成果,我很乐意与大家分享。
页: [1]
查看完整版本: 从其他绘图复制对象