Тема: Как собрать несколько файлов dwg в один файл dwg?

У меня 50 акадовских файлов (формат А3).
Мне надо собрать эти форматки в один файл.
Подскажите, пожалуйста, как это сделать быстро.

Re: Как собрать несколько файлов dwg в один файл dwg?

В порядке предпочтения
1. _xref (если в один, то потом внедрить)
2. _insert (могут быть артефакты с повторным определением блоков)

Re: Как собрать несколько файлов dwg в один файл dwg?

Зачем столько много чертежей грузить в один файл? Гораздо продуктивней оставить как было, но собрать в один фолдер. Или по тематике но не в один, а в несколько файлов, а те-в один фолдер. И похоже, все сделано без использования пространства листа. Без анализа файлов могут быть проблемы, на которые указал VVA. Если в разных файлах одинаковым именем названы разной конфигурации блоки, получится бардак. Если одинаково названы слои, но имеют разные цвета, тоже будет бардак. То-же с масштабом линий, и так далее.

Re: Как собрать несколько файлов dwg в один файл dwg?

> Vova
У меня по проекту 3000 файлов и просмотр затруднителен, когда они в разных файлах. В папках по одной тематики до 80 файлов и смотреть их удобней когда они собраны в один файл. Проблем с блоками, слоями, цвет линии и т.д. нет.

Re: Как собрать несколько файлов dwg в один файл dwg?

> VVA
Спасибо за информацию, но не подходят эти варианты.

Re: Как собрать несколько файлов dwg в один файл dwg?

copy -> paste

Re: Как собрать несколько файлов dwg в один файл dwg?

> SID
Интересно, отчего совет VVA не подходит?

Re: Как собрать несколько файлов dwg в один файл dwg?

> LeonidSN
copy -> paste
долго

Re: Как собрать несколько файлов dwg в один файл dwg?

> BigScrew
1 Вариант – долго растаскивать изображения по чертежу. Мне желательно чтобы чертежи шли друг за другом, и весь этот процесс хотелось бы автоматизировать.
2 Вариант – рутинная работа (долго) copy -> paste.

Re: Как собрать несколько файлов dwg в один файл dwg?

Я так понимаю, нужен макрос для выполнения задуманного.

Re: Как собрать несколько файлов dwg в один файл dwg?

> SID
Пробуй

;|=============================================================================
*    функция z-files-in-directory возвращает список файлов находящаяся в заданной
* директории
*    Автор : Зуенко Виталий (ZZZ)
*  Параметры:
*    directory  путь к папке например "D:\\Мои документы\\ZEF\\Lisp"
*    pattern    шаблон например "*.lsp" или список '("*.dwg" "*.dxf")
*    nested    искать в вложенных папках: t (да) или nil (нет)
* Пример вызова:
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" "*.dwg" t)
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" '("*.dwg" "*.dwt") t)
=============================================================================|;
(defun z-files-in-directory (directory pattern nested /)
  (if (not (listp pattern))(setq pattern (list pattern)))
  (if nested (apply 'append (append (mapcar    '(lambda (_pattern)
   (mapcar '(lambda (f) (strcat directory "\\" f))
   (vl-directory-files directory _pattern 1)))    pattern) ;_ mapcar
   (mapcar '(lambda (d) (z-files-in-directory (strcat directory "\\" d)
   pattern nested))
  (vl-remove "." (vl-remove ".." (vl-directory-files directory nil -1))))))
  (apply 'append (mapcar '(lambda (_pattern)(mapcar '(lambda (f) (strcat directory "\\" f))
  (vl-directory-files directory _pattern 1))) pattern))))
(defun C:LotXref ( / col icol dX dY dYmax fil dwglist pt ptv adoc p1 p2)
(vl-load-com)
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(vla-StartUndoMark adoc)
(setvar "CMDECHO" 0)
(setq col 10  ;_По 10 элементов в строку
      icol 0 dX 0 dY 0 dYmax 0)
(if *LAST_DIR*
    (setq fil (getfiled "Выберите файл для вставки" *LAST_DIR* "dwg" 16))
    (setq fil (getfiled "Выберите файл для вставки" "" "dwg" 16))
  ) ;_ end of if
(if fil (progn
 (setq *LAST_DIR* (strcat (vl-filename-directory fil) "\\"))
 (VL-PROPAGATE '*LAST_DIR*)
 (setq dwglist (z-files-in-directory (vl-filename-directory fil) '"*.dwg" nil))
 (setq pt '(0 0 0) ptv pt)
(foreach dwg dwglist
 (if (= icol col)
   (setq ptv (list (car pt)(cadr ptv))
         ptv (polar ptv (* 0.5 pi)(+ dYmax 50))
       dYmax 0 dX 0 dY 0 icol 0))
 (setq ptv (polar ptv 0 (+ dX 50)))
 (princ "\nОбрабатываю ")(princ dwg)
 (vl-cmdf "_-XREF" "_Attach" dwg ptv "1" "1" "0")
 (setq xref (vlax-ename->vla-object (entlast)))
 (vla-GetBoundingBox xref 'p1 'p2)
 (vla-move xref p1 (vlax-3d-point ptv))
 (setq minpt (vlax-safearray->list p1))
 (setq maxpt(vlax-safearray->list p2))
 (setq dY (abs (- (cadr maxpt)(cadr minpt))))
 (setq dX (abs (- (car maxpt)(car minpt))))
 (if (or (null dYmax)(< dYmax dY))(setq dYmax dY))
 (setq icol (1+ icol)))))
  (vla-StartUndoMark adoc)
  (vl-cmdf "_ZOOM" "_ALL")
  (princ))
(princ "\nНаберите LotXref")

Re: Как собрать несколько файлов dwg в один файл dwg?

Скопируй этот текст в модуль и запусти макрос "ОбединитьФайлы"

Option Explicit
Declare Function GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" _
(pOpenfilename As OPENFILENAME) As Long
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _
(pOpenfilename As OPENFILENAME) As Long
Const OFN_ALLOWMULTISELECT = &H200
Const OFN_EXPLORER = &H80000
'Don 't change Windows's current directory to match the one chosen in the dialog box.
Type OPENFILENAME
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
End Type
Const mstrНазваниеПрограммы As String = "Объединение файлов"
Dim mlngОтвет As Long
Public Sub ОбъединитьФайлы()
'Подпрограмма просит выделить несколько чертежей и вставляет их в виде блоков в текущий чертёж в одну линию
Dim intНомЧертежа As Integer, intКолвоЧертежей As Integer
Dim colСписокЧертежей As Collection, vСписокФайлов As Variant
Dim objБлокЧертежа As AcadExternalReference
Dim insertionPnt(0 To 2) As Double
Dim vТочка As Variant
Dim lngНомОбъекта As Long, objОбъектЧертежа As AcadObject
Dim vminExt As Variant, vmaxExt As Variant, blnПризнакПолученияНачКоординат As Boolean
Dim dblЛеваяНижняяТочка(0 To 2) As Double, dblПраваяВерхняяТочка(0 To 2) As Double
Dim dblШирина As Double, dblВысота As Double
On Error GoTo ОбработкаОшибок
'Выведем диалоговое окно открытия файлов и попросим выбрать чертежи
   Set vСписокФайлов = ShowOpen("Чертежи AutoCAD  (*.dwg)" + Chr$(0) + "*.dwg" + Chr$(0) + _
      "Чертежи AutoCAD  (*.dxf)" + Chr$(0) + "*.dxf" + Chr$(0), "Выбери файлы объединяемых чертежей")
   If VarType(vСписокФайлов) = vbEmpty Then
      MsgBox "Наверное выбрано слишком много файлов", vbInformation, mstrНазваниеПрограммы
      Exit Sub
   End If
'Получим точку вставки
ПолучитьТочкуВставки:
   vТочка = ThisDrawing.Utility.GetPoint(, "Укажи точку вставки:")
   If Err.Number <> 0 Then
      mlngОтвет = MsgBox("Продолжать выбирать точку вставки?", vbYesNo, mstrНазваниеПрограммы)
      If mlngОтвет = vbYes Then
         Err.Clear
         GoTo ПолучитьТочкуВставки
      ElseIf mlngОтвет = vbNo Then
         Exit Sub
      End If
   End If
'Для каждого чертежа определим ширину и вставим блок
   For intНомЧертежа = 2 To vСписокФайлов.Count
'Создадим новый блок
      Set objБлокЧертежа = ThisDrawing.ModelSpace.AttachExternalReference(vСписокФайлов(1) & "\" & vСписокФайлов(intНомЧертежа), vСписокФайлов(intНомЧертежа), vТочка, 1, 1, 1, 0, False)
'Получим координаты крайних точек чертежа
      objБлокЧертежа.GetBoundingBox vminExt, vmaxExt
      dblЛеваяНижняяТочка(0) = vminExt(0)
      dblЛеваяНижняяТочка(1) = vminExt(1)
      dblПраваяВерхняяТочка(0) = vmaxExt(0)
      dblПраваяВерхняяТочка(1) = vmaxExt(1)
      dblШирина = (dblПраваяВерхняяТочка(0) - dblЛеваяНижняяТочка(0))
'      dblВысота = (dblПраваяВерхняяТочка(1) - dblЛеваяНижняяТочка(1))
      ThisDrawing.Blocks.Item(objБлокЧертежа.Name).Bind False
      vТочка(0) = vТочка(0) + dblШирина
   Next intНомЧертежа
   MsgBox "Было вставлено " & vСписокФайлов.Count - 1 & " файлов", vbInformation, mstrНазваниеПрограммы
   Exit Sub
ОбработкаОшибок:
   MsgBox "При объединении файлов произошла ошибка:" & vbLf & _
          "номер = " & Err.Number & vbLf & _
          "с описанием: " & Err.Description, vbExclamation, mstrНазваниеПрограммы
   Resume Next
End Sub
'@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@
' Display and use the File open dialog
'@~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@
Private Function ShowOpen(strFilter As String, strTitle As String) As Variant
  Dim strTemp As String
  Dim VertName As OPENFILENAME
  VertName.lStructSize = Len(VertName)
  VertName.hwndOwner = ThisDrawing.hWnd
  VertName.lpstrFilter = strFilter
  VertName.lpstrFile = Space$(254)
  VertName.nMaxFile = 255
  VertName.lpstrFileTitle = Space$(254)
  VertName.nMaxFileTitle = 255
  VertName.lpstrInitialDir = CurDir
  VertName.lpstrTitle = strTitle
  VertName.flags = OFN_ALLOWMULTISELECT + OFN_EXPLORER
  If GetOpenFileName(VertName) Then
    strTemp = (Trim(VertName.lpstrFile))
    Set ShowOpen = ПолучитьСемействоПодстрок(Left(strTemp, Len(strTemp) - 1), Right(strTemp, 1))
  End If
End Function
Private Function ПодсчётКоличестваЛексем(ByVal strТекст As String, ByVal strРаделитель As String) As Long
'Фунция определения числа появлений строки strРаделитель в строке strТекст (стр. 61 "Программирование в Microsoft Office. Полное руководство по VBA")
Dim lngКоличество As Long
Dim lngНачПозиция As Long
'Если не задана строка для поиска, то, естественно,
'ничего не может быть найдено, таким образом возвращается 0
   If VBA.Len(strТекст) > 0 Then
      lngНачПозиция = 1
      Do
         lngНачПозиция = VBA.InStr(lngНачПозиция, strТекст, strРаделитель, vbTextCompare)
         If lngНачПозиция > 0 Then
            lngКоличество = lngКоличество + 1
            lngНачПозиция = lngНачПозиция + VBA.Len(strРаделитель)
         End If
      Loop While lngНачПозиция > 0
   Else
      lngКоличество = 0
   End If
   ПодсчётКоличестваЛексем = lngКоличество
End Function
Private Function ВыделениеЗаданнойПодстроки(ByVal strТекст As String, ByVal lngНомСлова As Long, _
   ByVal strРазделители As String) As String
'Функция выделения лексем из списка с разделителями (стр. 85 "Программирование в Microsoft Office. Полное руководство по VBA")
'Список содержится в переменной strТекст
'а параметр lngНомСлова определяет, какой из фрагментов выделять
Dim lngНомПозиции As Long
Dim lngПрошлаяПозиция As Long
Dim lngНомНайденногоСлова As Long
Dim lngНайденнаяПозиция As Long
   lngНомПозиции = 1
   lngПрошлаяПозиция = -Len(strРазделители) + 1
   lngНомНайденногоСлова = lngНомСлова
   Do While lngНомНайденногоСлова > 0
      lngПрошлаяПозиция = lngНомПозиции
      lngНайденнаяПозиция = VBA.InStr(lngНомПозиции, strТекст, strРазделители)
      If lngНайденнаяПозиция > 0 Then
         lngНомПозиции = lngНайденнаяПозиция + Len(strРазделители)
         lngНомНайденногоСлова = lngНомНайденногоСлова - 1
      Else
         Exit Do
      End If
   Loop
'Если искомой строки не обнаружено,
'Данная итерация не была первой
'(в этом случае значения lngНомНайденногоСлова и lngНомСлова были бы равны)
'и lngНомНайденногоСлова > 1, то вы закончили просмотр лексем, не найдя нужную
'Это означает, что номер лексемы был слишком большим
'В таком случае возвращается ""
   If (lngНайденнаяПозиция = 0) And (lngНомНайденногоСлова <> lngНомСлова) And (lngНомНайденногоСлова > 1) Then
      ВыделениеЗаданнойПодстроки = ""
   Else
      ВыделениеЗаданнойПодстроки = VBA.Mid$(strТекст, lngПрошлаяПозиция, lngНайденнаяПозиция - lngПрошлаяПозиция)
   End If
End Function
Private Function ПолучитьСемействоПодстрок(ByVal strТекст As String, ByVal strРаделитель As String) As Variant
'Возвращает семейство, содержащее все лексемы строки,
'используя указанные разделители (стр. 91 "Программирование в Microsoft Office. Полное руководство по VBA")
Dim colКоллекцияЛексем As New Collection
Dim lngНомЛексемы  As Long
Dim strВременнаяСтрока  As String
Dim lngКолвоЛексем As Long
Dim strСимвол As String * 1
'Определяется количество лексем в заданной строке
   lngКолвоЛексем = ПодсчётКоличестваЛексем(strТекст, strРаделитель)
'Цикл по всем лексемам с добавлением их к выходному семейству
   For lngНомЛексемы = 1 To lngКолвоЛексем
      strВременнаяСтрока = ВыделениеЗаданнойПодстроки(strТекст, lngНомЛексемы, strРаделитель)
      colКоллекцияЛексем.Add strВременнаяСтрока, strВременнаяСтрока
   Next lngНомЛексемы
   'Возврат выходного семейства
   Set ПолучитьСемействоПодстрок = colКоллекцияЛексем
End Function