Тема: Как программно выполнить перенос блока в другой документ ?

Здравствуйте дорогие друзья. Я знаю, что на вашем форуме данный вопрос уже рассматривался, но не откажите в подсказке.
Имеется файл со множеством блоков, которые я использую в качестве библиотеки. Мне нужно вставить в другой документ autocad блок с заранее известным именем. Я нашел похожие вопросы на вашем форуме и на их основе написал кусок программы. Открываю документ базы блоков, делаю его не активным. Нахожу блок с нужным именем , но не знаю как скопировать блок в новый документ в выбираемую точку.
Private Sub CommandButton1_Click()
UserForm1.Hide
Dim lib As AcadDocument
  Dim i As Integer
  Dim error_msg As String
  Dim blk As AcadBlock
  Dim user_doc As AcadDocument
  Dim old_filedia As Integer
  Dim already_present As Boolean
  Dim t As String
  Dim blockRefObj As AcadBlockReference
Dim InsertPnt As Variant
  Set lib = Nothing
  error_msg = "Библиотечный файл  " & lib_name & " не открыт"
  For i = 0 To AcadApplication.Documents.Count - 1
    If AcadApplication.Documents.Item(i).Name = lib_name Then
      Set lib = AcadApplication.Documents.Item(i)
End If
  Next i
  If ActiveDocument.Name = lib_name Then
    error_msg = "Библиотечный файл  " & lib_name & "   не должен быть активным документ"
    Set lib = Nothing
  End If
  If lib Is Nothing Then
    MsgBox error_msg
    Else
     For Each blk In lib.Blocks
      If blk.Name = "имя_блока" Then
      TextBox1.Text = blk.Name
      blk_name = blk.Name
      InsertPnt = ThisDrawing.Utility.GetPoint _
(, vbCrLf & "Укажите точку вставки:")
Set blockRefObj = ActiveDocument.Blocks.Item(i).InsertBlock
(InsertPnt, blk.Name, 1#, 1#, 1#, 0)  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       End If
       Next
  End If
End Sub

Re: Как программно выполнить перенос блока в другой документ ?

> Андрей
В этом случае InsertBlock вроде как не подойдет. Нужно, чтобы блок был уже вставлен в чертеж, или, чтобы блок был одним файлом, а не библиотекой.
А может, кто из корифеев уже знает, как работает вставка блока из библиотеки, может, даже без открытия оной, как через Tool Palettes или Design Center. Я бы тоже послушал:)
Вы, наверное, базировались на этом примере:https://www.caduser.ru/forum/topic14721.html
Но Вы пропустили еще много шагов. Там, насколько я понял, сначала все имена блоков из библиотеки заносятся в listbox, затем в форме из него выбирается нужный блок, который потом при помощи -wblock посылается во временный файл, из которого потом и вставляется в текущий чертеж.
Вот лисперы тоже обсуждали эту тему:
https://www.caduser.ru/forum/topic6943.html
https://www.caduser.ru/forum/topic16813.html

Re: Как программно выполнить перенос блока в другой документ ?

> Сидор Лютый
Предлагаю всем (не таким слабым в VBA как я)раз и навсегда закрыть эту тему показательно!!!
Так и напрашивается метод ObjectDBX для подобных ситуаций
Покажите класс!
~'J'~

Re: Как программно выполнить перенос блока в другой документ ?

Я понимаю, что блок можно вставить при помощи команды  - wblock, но меня интересовала есть ли более простой и "элегантный" способ?

Re: Как программно выполнить перенос блока в другой документ ?

> Андрей
Попробуй такой вариант, правда далеко до элегантности
вроде работает, не забудь заменить название чертежа,
он должен находиться в той же папке
Код для UserForm:

Option Explicit
'' Note
'' Requires reference to:
'' Visual Basic For Applications
'' AutoCAD 2005 Type Library
'' Ole Automation
'' Microsoft Forms 2.0 Object Library
'' AutoCAD/ObjectDBX Common 16. Type Library
'' Copy and insert block from other drawing
'' written by Fatty T.O.H. (c)2006
'' All rights removed
'' Insert UserForm with name frmDBXBlocks,
'' add in this form 1 ListBox and 3 CommandButtons
Dim oDbx As New AxDbDocument
Dim fname As String
Dim sBlkName As String
'' F.T.O.H.
Function GetBlocks(FileName As String) As Variant
Dim i As Integer
Dim blkVar() As String
Dim objDBX As New AxDbDocument
objDBX.Open FileName
Dim objEnt As AcadBlock
i = -1
For Each objEnt In objDBX.Blocks
If Not objEnt.IsXRef And Not objEnt.IsLayout And _
Not objEnt.Name Like "*,*|*" Then
i = i + 1
ReDim Preserve blkVar(i)
blkVar(i) = objEnt.Name
End If
Next
Set objDBX = Nothing
GetBlocks = blkVar
End Function '' ok
'' F.T.O.H.
Public Sub CopyBlock(fname As String, bName As String)
Set oDbx = GetInterfaceObject("ObjectDBX.AxDbDocument.16")
oDbx.Open fname
Dim oBlocks As AcadBlocks
Dim oBlock As AcadBlock
Dim copyVar(0) As AcadBlock
Set oBlocks = oDbx.Blocks
Set oBlock = oBlocks.Item(bName)
Set copyVar(0) = oBlock
On Error GoTo HoustonWeHaveAProblem
Dim idPairs As Variant
Dim copyObj As Variant
copyObj = oDbx.CopyObjects(copyVar, ThisDrawing.Blocks, idPairs)
Set oDbx = Nothing
HoustonWeHaveAProblem:
If Err.Number <> 0 Then
MsgBox "ObjectDBX CopyObjects method objects failed." & vbCr & Err.Number & " " & _
Err.Description, vbCritical
End If
End Sub '' ok
Private Sub CommandButton1_Click()
Call CopyBlock(fname, sBlkName)
CommandButton1.ForeColor = vbBlack
CommandButton2.SetFocus
CommandButton2.ForeColor = vbRed
End Sub
Private Sub CommandButton2_Click()
Dim blkRef As AcadBlockReference
Dim pickPt As Variant
frmDBXBlocks.hide
pickPt = ThisDrawing.Utility.GetPoint(, vbCr & "Insertion point :")
Set blkRef = ThisDrawing.ModelSpace.InsertBlock(pickPt, sBlkName, 1#, 1#, 1#, 0#)
blkRef.Update
CommandButton2.ForeColor = vbBlack
CommandButton3.SetFocus
CommandButton3.ForeColor = vbRed
frmDBXBlocks.Show
End Sub
Private Sub CommandButton3_Click()
Unload Me
End
End Sub
Private Sub ListBox1_Click()
Dim i As Integer
Dim cBlock As AcadBlock
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) = True Then
sBlkName = ListBox1.Value
End If
Next i
For Each cBlock In ThisDrawing.Blocks
If StrComp(UCase(sBlkName), UCase(cBlock.Name), 1) = 0 Then
MsgBox "This block already exist"
CommandButton1.ForeColor = vbBlack
CommandButton2.SetFocus
CommandButton2.ForeColor = vbRed
Exit For
Else
CommandButton1.SetFocus
CommandButton1.ForeColor = vbRed
End If
Next
End Sub
Private Sub UserForm_Initialize()
frmDBXBlocks.Caption = "Copy/Insert Block From Library"
CommandButton1.Caption = "Copy Block"
CommandButton2.Caption = "Insert Block"
CommandButton3.Caption = "Done/Exit"
Dim bVar() As String
fname = ThisDrawing.Path & "\" & "CHECKS.dwg"
'' <- change block library name here
bVar = GetBlocks(fname)
ListBox1.Clear
ListBox1.ColumnCount = 1
ListBox1.List() = bVar
End Sub

Код для Module1:

Option Explicit
Sub RunMe()
frmDBXBlocks.Show
End Sub

~'J'~

Re: Как программно выполнить перенос блока в другой документ ?

Спасибо за помощь, буду разбираться.  Но по первому впечатлению, этот кусочек программы намного больше того, что я применил с использованием  _wblock.

Re: Как программно выполнить перенос блока в другой документ ?

Андрей пишет:

Но по первому впечатлению, этот кусочек программы намного больше того, что я применил с использованием _wblock.

Но ваш кусочек в том виде, в котором вы его привели, вообще-то не работает..:)