Тема: Копирование объектов.

Мне нужна программа, которая по очереди открывает чертежи и переносит все содержимое на исходный чертеж и закрывает отрытые.
   Вроде все понятно, не могу придумать как скопировать.

Re: Копирование объектов.

А почему бы _xref не использовать?

Re: Копирование объектов.

Точнее сказать не получается копировать с открытого листа, а копируется с исходного.

Re: Копирование объектов.

> Катюша
Вот код, который я писал когда-то для копирования объектов из ModelSpace открытых файлов .DXF в ModelSpace одного .DWG (тоже должен быть открыт)
Сильно править не стал, - выкинул из кода только не относящееся к вопросу и добавил немного комментариев. Думаю, разберетесь.
Не обращайте внимания на некоторую корявость, это были первые опыты в VBA:)

Public Sub MergeDXF()
'by Alexey Gromov
Dim i As Integer, j As Integer, n As Integer
Dim nm As String
Dim CollDoc As Object
Dim Elem As Object
Dim SentObj() As AcadEntity
Dim GetingObj As Variant
Dim Atr As Variant
Dim DOCO As Object
Dim MS As AcadModelSpace
Dim PFSS As AcadSelectionSet
Set CollDoc = Application.Documents
Set DOCO = Documents("ИМЯ ИЛИ ИНДЕКС ФАЙЛА-ПРИЕМНИКА")
'Цикл копирования элементов и придания им параметров (по слою, цвету и т.д.)
For i = 0 To CollDoc.Count - 1
    Set MS = CollDoc(i).ModelSpace
    n = MS.Count
    If n = 0 Then
        MsgBox CollDoc(i).name & " не содержит объектов"
        GoTo marker001
    End If
    Erase SentObj 'Обнуление массива (элемент устанавливается в Empty)
    ReDim SentObj(0 To n - 1) 'Установка размерности массива (иначе ошибка)
    nm = CollDoc(i).name
    Select Case Left(nm, 4)
        Case "Лини"
        'Заполняем массив элементов в исходном файле, которые будут скопированы
            For j = 0 To n - 1
                Set SentObj(j) = MS.Item(j)
            Next j
            'Вставляем массив в конечный файл
            GetingObj = Documents(i).CopyObjects(SentObj, DOCO.ModelSpace)
            For j = 0 To n - 1
                'Обработка втавленных элементов
                With GetingObj(j)
                    .Layer = "01 ЛЭП 0.4"
                    .color = acByLayer
                    .Linetype = "ByLayer"
                    .Lineweight = acLnWtByLayer
                    .LinetypeScale = 0.9
                End With
            Next j
        Case "Опор"
            For j = 0 To n - 1
                Set SentObj(j) = MS.Item(j)
            Next j
            GetingObj = Documents(i).CopyObjects(SentObj, DOCO.ModelSpace)
            For j = 0 To n - 1
                With GetingObj(j)
                    .Layer = "13 КТП съемка"
                    .color = acByLayer
                    .Linetype = "ByLayer"
                    .Lineweight = acLnWtByLayer
                    .LinetypeScale = 1#
                End With
            Next j
    End Select
marker001:
Next i
'Закрытие файлов DXF
'If MsgBox("Закрыть файлы DXF?", vbYesNo) = vbYes Then
    For Each Elem In CollDoc
        nm = Right(Elem.name, 4)
        If StrComp(nm, ".dxf", vbTextCompare) = 0 Then
            Elem.Close SaveChanges:=False
        End If
    Next Elem
'Else
'End If
DOCO.Activate
End Sub

Re: Копирование объектов.

А вот чтобы открывать файлы по одному в выбранной директории, это надо указать директорию, составить список файлов, удовлетворяющих какому-то условию (напр. все файлы *.dwg) и передать этот список в цикл открытие>копирование>закрытие. В Excel это очень легко, там для этого есть специальные операторы, а в автокаде я что-то пока не разобрался. Мне тоже хотелось бы узнать, как это делается.

Re: Копирование объектов.

> Катюша
Можно использовать ObjectDBX для копирования из
исходного файла
Пример для одного файла, замени имя файла,
список подгружаемых библиотек см. в декларации
(Транслировано с аналогичного файла .lsp,
версия AutoCAD 2005eng)

Option Explicit
'' written by Fatty T.O.H.
'' Requires reference to:
'' Visual Basic For Applications
'' AutoCAD 2005 Type Library
'' Ole Automation
'' AutoCAD/ObjectDBX Common 16. Type Library
'' Visual Lisp ActiveX module
Public Sub CopyDwg(fName As String)
Dim oDbx As New AxDbDocument
Set oDbx = GetInterfaceObject("ObjectDBX.AxDbDocument.16")
oDbx.Open fName
Dim copyVar() As Object
Dim iCnt As Long
On Error GoTo HoustonWeHaveAProblem
ReDim Preserve copyVar(oDbx.ModelSpace.Count - 1)
For iCnt = 0 To oDbx.ModelSpace.Count - 1
Set copyVar(iCnt) = oDbx.ModelSpace.Item(iCnt)
Next
Dim idPairs As Variant
Dim copyObj As Variant
copyObj = oDbx.CopyObjects(copyVar, ThisDrawing.ModelSpace, 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
''===============================''
Sub Test()
Dim dName As String
dName = "D:\AUTOLISP\LISPS\VBA_WORKBOOK\Block3.dwg"
Call CopyDwg(dName)
End Sub

~'J'~