Тема: Помогите !! бьюсь уже неделю !!

Доброго всем времени суток!
Перекопал весь форум, нашел пару подбных ссылок, но не могу сделать аналогичный код !! Помогите - не найд никак решения.
Вот моя задача: У меня есть 2 чертежа и надо определенные блоки скопировать из одного чертежа - в другой.
вот мой код (тестовый пока):
Private Sub CommandButton2_Click()
    Me.Hide
Me.Show 0
  Dim objarr(0 To 100) As Object
  Dim cparr As AcadBlockReference
  Dim lc As AcadDocument
  Dim ret As Variant
  s = 0
Set lc = Documents.Application.ActiveDocument
n = ThisDrawing.Blocks.Count
For i = 0 To n - 1
If Left(ThisDrawing.Blocks(i).Name, 1) <> "*" Then
Set objarr(s) = ThisDrawing.Blocks(i)
s = s + 1
End If
Next i
Set lc = Documents.Add
ret = lc.CopyObjects(objarr)
End Sub
ret = lc.CopyObjects(objarr) - и вот на этой строке пишет:
"method copyobjects failed iAcaddocument" и все тут !
помогите пожалуйста !

Re: Помогите !! бьюсь уже неделю !!

> St@n
Попробую догадаться: тебе нужно скопировать блоки уже вставленные в пространство листа,
т.е. объекты типа AcadBlockReference, которые называются вхождениями блоков
или же тебе нужно скопировать объекты типа AcadBlock, которые называются описаниями блоков?

Это обычная путаница в терминологии, причем как я смотрю и у англоязычных программистов
та же самая история
~'J'~

Re: Помогите !! бьюсь уже неделю !!

я тут сам путаюсь - у меня на чертеже  блок - это несколько примитивов, объединенные в группу - видятся они как acadblockreference и их-то мне и надо вставлять

Re: Помогите !! бьюсь уже неделю !!

> St@n
Как я и предполагал, ты перебираешь коллекцию описаний блоков
вместо того чтобы копировать вставки блоков
Тут нужно что-то вроде

Dim ent as acadentity
dim blk as acadblockreference
dim i as integer
dim ar()as acadobject
For each ent in thisdrawing.modelspace
if typeof ent is acadblockreference then
set blk =ent
end if
if blk.name like "`*@*" then
redim preserve ar(i)as acadobject
set ar(i)=blk
i=i+1
end if
next ent

Потом смотришь пример в Хэлпе насчет CopyObjects
там вроде как раз то что нужно
Сейчас времени нет, а то я смог бы показать конкретный
пример по этому вопросу
~'J'~

Re: Помогите !! бьюсь уже неделю !!

перепробовал все, вместо acadblockreference ставил  AcadBlock (то же и вместо objects) хотя пример из хелпа - выполняется !

Re: Помогите !! бьюсь уже неделю !!

> St@n
Вот нашел в инете готовый пример:

Option Explicit
Sub test2()
'very quick sample, no error checking
'but it may get you started
Dim oDocA As AcadDocument
Dim oDocB As AcadDocument
Set oDocA = ThisDrawing
'this assumes that you have a drawing named "test2.dwg" open in this session
Set oDocB = ThisDrawing.Application.Documents("CHECKS.dwg") '<--куда вставлять
'this is just there to show the doc is valid
MsgBox oDocB.Name
'set up the block you want to copy to
'in this case model space of docB
Dim oMSB As AcadModelSpace
Set oMSB = oDocB.ModelSpace
'get selection set
Dim ss As AcadSelectionSet
On Error Resume Next
Set ss = oDocA.SelectionSets.Add("sant")
If Err Then
oDocA.SelectionSets.Item("sant").Delete
Err.Clear
Set ss = oDocA.SelectionSets.Add("sant")
End If
On Error GoTo Sayme
ss.SelectOnScreen
'create array to hold items
Dim oent As AcadEntity
'must be dynamic since you don't know how many items
Dim eArray() As Object
'resize to how many items
ReDim eArray(0 To ss.Count - 1)
'put selection set items into an array
Dim i As Long
For i = 0 To ss.Count - 1
Set eArray(i) = ss.Item(i)
Next i
'pass array to copy objects method
oDocA.CopyObjects eArray, oMSB
Sayme:
MsgBox Err.Description
End Sub

Оба чертежа должны быть открыты, имя чертежа
куда копировать измени - отмечено в тексте
~'J'~

Re: Помогите !! бьюсь уже неделю !!

спасибо, щя попробую !

Re: Помогите !! бьюсь уже неделю !!

> St@n
Чуть доработал

Option Explicit
Sub CopyBlocksToOtherDwg()
'very quick sample, no error checking
'but it may get you started
Dim oDocA As AcadDocument
Dim oDocB As AcadDocument
Set oDocA = ThisDrawing
'this assumes that you have a drawing named "test2.dwg" open in this session
Set oDocB = ThisDrawing.Application.Documents(1)
'this is just there to show the doc is valid
'set up the block you want to copy to
'in this case model space of docB
Dim oMSB As AcadModelSpace
Set oMSB = oDocB.ModelSpace
'get selection set
Dim ss As AcadSelectionSet
Dim ftype(0 To 1) As Integer
Dim fdata(0 To 1) As Variant
ftype(0) = 0: ftype(1) = 2
fdata(0) = "INSERT": fdata(1) = "`*@*"
          With oDocA.SelectionSets
               While .Count > 0
                    .Item(0).Delete
               Wend
          End With
Set ss = oDocA.SelectionSets.Add("$blocks$")
On Error GoTo Sayme
ss.Select acSelectionSetAll, , , ftype, fdata
MsgBox ss.Count
'create array to hold items
Dim oent As AcadEntity
'must be dynamic since you don't know how many items
Dim eArray() As Object
'resize to how many items
ReDim eArray(0 To ss.Count - 1)
'put selection set items into an array
Dim i As Long
For i = 0 To ss.Count - 1
Set eArray(i) = ss.Item(i)
Next i
'pass array to copy objects method
oDocA.CopyObjects eArray, oMSB
Sayme:
MsgBox Err.Description
End Sub

~'J'~

Re: Помогите !! бьюсь уже неделю !!

Я, когда необходимо вставить блоки из одного файла в другой, использую что-то вроде этого:

Dim Point(0 To 2) As Double
Dim DrawingName As String
Dim Block_P As AcadExternalReference
DrawingName = "D:\Opisaniya_blokov.dwg"'Файл, из которого переносятся описания блоков
Point(0) = 0: Point(1) = 1: Point(2) = 0
If ThisDrawing.FullName <> DrawingName Then
  Set Block_P = ThisDrawing.ModelSpace.AttachExternalReference(DrawingName, "Block_P", I_Point, 1, 1, 1, 0, False)
ThisDrawing.Blocks.Item(Block_P.Name).Bind True
Block_P.Delete
ThisDrawing.Blocks.Item("Block_P").Delete
End If

То есть вставляю файл внешней ссылкой, соответственно переносятся все описания блоков.
Плюс в том, что вставляемый файл может быть закрыт; минус - переносятся много лишней информации- слои, размерные, текстовые стили и т.д.

Re: Помогите !! бьюсь уже неделю !!

Да, естественно, чтобы вставить блок:

Dim InsertPnt As Variant,BlockName as string
Dim insertedBlock As AcadBlockReference
BlockName="NNN"
InsertPnt = ThisDrawing.Utility.GetPoint(, vbCrLf & "Укажите точку вставки блока:")
Set insertedBlock = ThisDrawing.ModelSpace.InsertBlock(InsertPnt, BlockName, 1#, 1#, 1#, 0#)

Конечно, этот метод работает, если известно имя блока, который нужно вставить.

Re: Помогите !! бьюсь уже неделю !!

Здравствуйте.
Пишу для оптимизации работы программку для работы со стандартными блоками. Вставляю блок также, как в последнем посте. Вопрос: как сделать, чтобы блок был виден до того, как я укажу точку, т.е. таскался за курсором? Как при  обычной вставке блока?

Re: Помогите !! бьюсь уже неделю !!

> peshkoff
Посмотри здесь:
https://www.caduser.ru/forum/topic39444.html
~'J'~

Re: Помогите !! бьюсь уже неделю !!

Проблема решилась просто )))
_copyclip
_pasteblock ))