Тема: Копирование объектов.
Мне нужна программа, которая по очереди открывает чертежи и переносит все содержимое на исходный чертеж и закрывает отрытые.
Вроде все понятно, не могу придумать как скопировать.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Копирование объектов.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Мне нужна программа, которая по очереди открывает чертежи и переносит все содержимое на исходный чертеж и закрывает отрытые.
Вроде все понятно, не могу придумать как скопировать.
Точнее сказать не получается копировать с открытого листа, а копируется с исходного.
> Катюша
Вот код, который я писал когда-то для копирования объектов из 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
А вот чтобы открывать файлы по одному в выбранной директории, это надо указать директорию, составить список файлов, удовлетворяющих какому-то условию (напр. все файлы *.dwg) и передать этот список в цикл открытие>копирование>закрытие. В Excel это очень легко, там для этого есть специальные операторы, а в автокаде я что-то пока не разобрался. Мне тоже хотелось бы узнать, как это делается.
> Катюша
Можно использовать 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'~
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Копирование объектов.
Форум работает на PunBB, при поддержке Informer Technologies, Inc