Копирование объектов между чертежами

Автор Тема: Копирование объектов между чертежами  (Прочитано 4032 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Здравствуйте.
Подскажите пожалуйста такую тему. В сети, как в прочем и на этом форуме, куча примеров как из чертежа-источника скопировать примитивы в открытый (текущий) чертеж. А как сделать обратную операцию? Допустим у меня есть открытый чертеж в котором нарисованы какие-либо примитивы. Как мне их скопировать в чертеж-хранилище, который к примеру еще и закрыт? Подскажите ссылку на пример.
Спасибо

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Открываешь чертеж и копируешь в него. Открывать необязательно в редакторе AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
То есть как-то так что ли
Код - vb.net [Выбрать]
  1. Dim sourceFileName As String = Path.Combine(NameFullPatch, NameFile)
  2.             Dim sourceDb As Database = New Database(False, True)
  3.             sourceDb.ReadDwgFile(sourceFileName, FileShare.Read, True, String.Empty)
  4.             Dim sourceTr As Transaction = sourceDb.TransactionManager.StartTransaction()
  5.             Using sourceTr
  6.                 Dim sourceBtr As BlockTableRecord = sourceTr.GetObject(sourceDb.CurrentSpaceId, OpenMode.ForWrite, False)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
То есть как-то так что ли
Почти, но с точностью до наоборот. sourceDb - это твой открытый в редакторе AutoCAD чертеж. А то куда ты собираешься копировать - это destDb.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Пример редактирования чертежа без его открытия (даже на VB.NET :) ):
http://www.cadtutor.net/forum/showthread.php?61496-VB.Net-Edit-dwg-files-without-opening-them
Сюда надо только добавить клонирование объектов.

Отмечено как Решение Захаров Максим 15-01-2018, 16:17:53

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Клонирование объектов в открытую без создания документа базу данных чертежа (взял из своего проекта):
Код - C# [Выбрать]
  1. // Копирование объектов в новую базу данных
  2. using (Database newDb = new Database(false, true))
  3. {
  4.     // Считываем файл шаблона
  5.     newDb.ReadDwgFile(templateFile, FileOpenMode.OpenForReadAndWriteNoShare, true, "");
  6.     // Для того, чтобы быть уверенным, что весь файл прочитался
  7.     newDb.CloseInput(true);
  8.  
  9.     ObjectId newDbMsId = SymbolUtilityServices.GetBlockModelSpaceId(newDb);
  10.     IdMapping idMap = new IdMapping();
  11.     db.WblockCloneObjects(cloneObjs, newDbMsId, idMap, DuplicateRecordCloning.Replace, false);
  12.     newDb.SaveAs(expFileName, DwgVersion.Current);
  13. }                
  14.  
templateFile - путь к файлу, который открываем.
db - база данных текущего чертежа, который открыт в AutoCAD
cloneObjs - коллекция ObjectId объектов из базы db, которые копируются d newDb
expFileName - путь, куда сохранить чертёж после изменений.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Спасибо Дмитрий.
Единственное, я так понимаю, скорости это не добавляет хотя и целевой чертеж не открывается, по крайней мере у меня так. А есть какие нибудь тонкости, например если примитивов много и объем копирования большой?
Код - vb.net [Выбрать]
  1. <CommandMethod("STPR-DrawCopyObject")>
  2.     Public Sub DrawCopyObject()
  3.         Dim strFileName As String = "p:\PROJECT_5-59-12Н\Сводный план.dwg"
  4.         '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  5.         'работа с текущим чертежем
  6.         Dim acDoc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
  7.         Dim CivilDoc As CivilDocument = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument()
  8.         Dim acCurDb As Database = acDoc.Database
  9.         Dim locker As Autodesk.AutoCAD.ApplicationServices.DocumentLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument
  10.         Dim acObjIDs As ObjectIdCollection = New ObjectIdCollection()
  11.         Using acLckDocCur As DocumentLock = acDoc.LockDocument()
  12.             Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  13.                 Dim acSourceBlockTable As BlockTable = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  14.                 Dim acSourceModelSpace As BlockTableRecord = acTrans.GetObject(acSourceBlockTable(BlockTableRecord.ModelSpace), OpenMode.ForRead)
  15.                 For Each acObjID As ObjectId In acSourceModelSpace
  16.                     acObjIDs.Add(acObjID)
  17.                 Next acObjID
  18.             End Using
  19.         End Using
  20.         '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  21.         Using newDb As Database = New Database(False, True)
  22.             newDb.ReadDwgFile(strFileName, FileOpenMode.OpenForReadAndWriteNoShare, True, "")
  23.             newDb.CloseInput(True)
  24.             Dim newDbMsId As ObjectId = SymbolUtilityServices.GetBlockModelSpaceId(newDb)
  25.             Dim idMap As IdMapping = New IdMapping()
  26.             acCurDb.WblockCloneObjects(acObjIDs, newDbMsId, idMap, DuplicateRecordCloning.Replace, False)
  27.             newDb.SaveAs(strFileName, DwgVersion.Current)
  28.         End Using
  29.     End Sub
« Последнее редактирование: 16-01-2018, 10:22:54 от Захаров Максим »

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Единственное, я так понимаю, скорости это не добавляет хотя и целевой чертеж не открывается, по крайней мере у меня так.
Должна быть довольно большая разница. Скорость не в отладке проверяется, надеюсь?

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Да, спасибо Дмитрий. Я действительно проверил скорость в режиме отладки. Без нее значительно быстрее.