Команда соединения файлов в один

Автор Тема: Команда соединения файлов в один  (Прочитано 7063 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Подскажите что не так делаю.
Хочу собрать элементы (кроме вставок блоков)
из нужных мне файлов в один текущий,
клонирую их, а мне выдается ошибка WrongDatabase

Проблемы в коде с 31 по 36 запись
Если эту ветку исключить, то все работает.


 
Код - C# [Выбрать]
  1.  [CAD_RTM.CommandMethod("COMM_GET_FILES_ELEMENTS")]
  2.     public void acad_comm_sborka()
  3.     {
  4.         // Корневой каталог
  5.         string Root = @"С:\TEST\";
  6.         SearchOption so = SearchOption.AllDirectories;
  7.          // перечень файлов
  8.         string[] fns = System.IO.Directory.GetFiles(Root, "*.dwg", so);
  9.         // Список всех примитивов из файлов
  10.         List<CAD_DBS.Entity> ents = new List<CAD_DBS.Entity>();
  11.         // Кол-во ошибок
  12.         int err = 0;
  13.         foreach (string f in fns)
  14.         {
  15.             CAD_DBS.Database db = new CAD_DBS.Database(false, true);
  16.             db.ReadDwgFile(f, System.IO.FileShare.Read,  false, null);
  17.             try
  18.             {
  19.                 using (CAD_DBS.Transaction tr = db.TransactionManager.StartTransaction())
  20.                 {
  21.                     CAD_DBS.BlockTable bt = (CAD_DBS.BlockTable)tr.GetObject(db.BlockTableId, CAD_DBS.OpenMode.ForRead, false, true);
  22.                     CAD_DBS.BlockTableRecord btr = (CAD_DBS.BlockTableRecord)tr.GetObject(bt[CAD_DBS.BlockTableRecord.ModelSpace], CAD_DBS.OpenMode.ForRead, false, true);
  23.                     CAD_DBS.BlockTableRecordEnumerator enu = btr.GetEnumerator();
  24.                     enu.Reset();  
  25.                     while (enu.MoveNext())
  26.                     {
  27.                         CAD_DBS.Entity ent = tr.GetObject(enu.Current, CAD_DBS.OpenMode.ForRead) as CAD_DBS.Entity;
  28.                         if (ent is CAD_DBS.BlockReference)
  29.                         {
  30.                             // выбираем все элементы блока кроме вставок блока
  31.                             CAD_DBS.DBObjectCollection coll = new CAD_DBS.DBObjectCollection();
  32.                             (ent as CAD_DBS.BlockReference).Explode(coll);
  33.                             foreach (CAD_DBS.DBObject dbo in coll)
  34.                                 if (!(dbo is CAD_DBS.BlockReference))
  35.                                     if (dbo is CAD_DBS.Entity )
  36.                                         ents.Add((CAD_DBS.Entity)dbo.Clone());
  37.                         }
  38.                         else
  39.                             ents.Add((CAD_DBS.Entity)ent.Clone());
  40.                     }
  41.                     tr.Commit();
  42.                 }
  43.             }
  44.             catch
  45.             {
  46.                 err++;
  47.             }
  48.             db.CloseInput(true);
  49.         }
  50.         if (err > 0)
  51.         {
  52.             MessageBox.Show("Ошибок при обработке файлов: " + err.ToString());
  53.         }
  54.         acad_Func.add_Ents(ents, true);
  55.     }
  56.  
  57.     public static class acad_Func
  58.     {
  59.         public static void add_Ents(List<CAD_DBS.Entity> ents,
  60.                             bool WithMsg = false)
  61.         {
  62.             try
  63.             {
  64.                 CAD_APS.Document doc =
  65.                      CAD_APS.Application.DocumentManager.MdiActiveDocument;
  66.                 CAD_DBS.Database db = doc.Database;
  67.                 using (doc.LockDocument())
  68.                 {
  69.                     using (CAD_DBS.Transaction tr = db.TransactionManager.StartTransaction())
  70.                     {
  71.                         CAD_DBS.BlockTable bt = (CAD_DBS.BlockTable)tr.GetObject(db.BlockTableId, CAD_DBS.OpenMode.ForWrite);
  72.                         CAD_DBS.BlockTableRecord btr =
  73.                            (CAD_DBS.BlockTableRecord)tr.GetObject(bt[CAD_DBS.BlockTableRecord.ModelSpace],
  74.                             CAD_DBS.OpenMode.ForWrite);
  75.                         foreach (CAD_DBS.Entity ent in ents)
  76.                         {
  77.                             if (ent != null)
  78.                             {
  79.                                 CAD_DBS.ObjectId id = btr.AppendEntity(ent);
  80.                                 tr.AddNewlyCreatedDBObject(ent, true);
  81.                             }
  82.                             else
  83.                             {
  84.  
  85.                             }
  86.                         }
  87.                         tr.Commit();
  88.                     }
  89.                 }
  90.             }
  91.             catch (System.Exception ex)
  92.             {
  93.                 if (WithMsg)
  94.                 {
  95.                     MessageBox.Show("Ошибка добавления элементов" + '\n' + ex.Message);
  96.                 }
  97.             }
  98.         }
  99. }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Команда соединения файлов в один
« Ответ #1 : 16-07-2019, 21:36:14 »
Вместо всего это воспользуйся Database.WblockCloneObjects для копирования из базы в базу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Команда соединения файлов в один
« Ответ #2 : 16-07-2019, 23:18:54 »
Вместо всего это воспользуйся Database.WblockCloneObjects для копирования из базы в базу.

А передать для четвертого аргумента (DuplicateRecordCloning) в функцию?
Код - C# [Выбрать]
  1. Database.WblockCloneObjects(... ,...,"???",...);
Чтобы имена блоков не имели конфликтов при совпадении из разных файлов.



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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Команда соединения файлов в один
« Ответ #3 : 16-07-2019, 23:23:39 »
Чтобы имена блоков не имели конфликтов при совпадении из разных файлов.
Попробуй kDrcMangleName. Хотя ты же BlockReference вроде пропускаешь...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Команда соединения файлов в один
« Ответ #4 : 16-07-2019, 23:29:01 »
BlockReference вроде пропускаешь...
Я пропускаю вложенный блок в блок.
Мне нужно потом будет сделать так, чтобы некоторые блоки
оставались блоками, а некоторые из них полностью были "разбиты" в файле-приемнике.

Хотя в примерах тех файлов с которыми я работаю вложенность более 2 уровней не будет.
Все же в общем случае нужно рекурсивную функцию делать для n-вложенности блоков.


Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Команда соединения файлов в один
« Ответ #5 : 16-07-2019, 23:41:56 »
Но может и рекурсия будет и не нужна функция WblockCloneObjects сама все сделает.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Команда соединения файлов в один
« Ответ #6 : 16-07-2019, 23:45:10 »
Я не вижу необходимости в рекурсии при такой постановке задачи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Команда соединения файлов в один
« Ответ #7 : 17-07-2019, 00:42:24 »
При передачи аргумента CAD_DBS.DuplicateRecordCloning.MangleName
в функцию клонирования блоков
Одинаковые блоки именуются с добавление перед
исходным именем $0$, $1$... $n$, что в
принципе и нужно чтобы исключить конфликты одинаковых
имен блоков в исходных файлах.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Re: Команда соединения файлов в один
« Ответ #8 : 17-07-2019, 07:19:12 »
В Map 3D для этого есть штатный функционал