eBadDxfSequence во время ImportLayerStateFromDb

Автор Тема: eBadDxfSequence во время ImportLayerStateFromDb  (Прочитано 7271 раз)

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

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Добрый день.Копирую вьюпорты в новую базу при помощи WblockCloneObjects. Не нашел легкого способа собрать содержимое вьюпортов (примитивы, состояния слоев), поэтому захожу внутрь каждого вьюпорта, собираю в коллекции id, создаю новый layerstate, название layerstate заношу в xdate, привязанному к вьюпорту. Никак не могу вставить layerstates в новую базу (las файлы не особо хочется использовать) . На методе ImportLayerStateFromDb вываливается eBadDxfSequence. Почему?

Код - C# [Выбрать]
  1. Document doc = Application.DocumentManager.MdiActiveDocument;
  2. Editor ed = doc.Editor;
  3. Database db = doc.Database;
  4.  
  5. ....
  6.  
  7. LayerStateManager lm = db.LayerStateManager;
  8.  
  9. System.Collections.ArrayList arrList = lm.GetLayerStateNames(false, false);
  10.  
  11.  
  12. Database dbOrig = HostApplicationServices.WorkingDatabase;
  13.  
  14.  
  15.  using (Database acDbNewDoc = new Database(true, true))
  16.  
  17.    {
  18.       HostApplicationServices.WorkingDatabase = acDbNewDoc;
  19.  
  20.  
  21.            foreach (ObjectIdCollection ids in listIds)
  22.  
  23.                     {
  24.                       ....
  25.  
  26.                        using (Transaction acTrans = acDbNewDoc.TransactionManager.StartTransaction())
  27.                        
  28.                         {
  29.  
  30.                          .....
  31.  
  32.                             IdMapping acIdMap = new IdMapping();
  33.  
  34.                             using (DocumentLock acLckDoc = doc.LockDocument())
  35.                             {
  36.                                 db.WblockCloneObjects(ids, spaceId, acIdMap, DuplicateRecordCloning.Ignore, false);
  37.                             }
  38.                          ....
  39.  
  40.                          acTrans.Commit();
  41.  
  42.                          }
  43.  
  44.                      }
  45.  
  46.  
  47.             LayerStateManager lm2 = acDbNewDoc.LayerStateManager;
  48.  
  49.             foreach (string s in arrList)
  50.  
  51.               lm2.ImportLayerStateFromDb(s, dbOrig); // здесь eBadDxfSequence
  52.  
  53.  
  54.        HostApplicationServices.WorkingDatabase = dbOrig;
  55.  
  56.  
  57.        acDbNewDoc.SaveAs(nameFile, DwgVersion.Current);
  58.    
  59.       }
  60.  
  61.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eBadDxfSequence во время ImportLayerStateFromDb
« Ответ #1 : 11-12-2020, 19:57:35 »
pavka_97,
Мне все эти действия кажутся крайне странными. В чем причина сказать не смогу. Может и баг в AutoCAD, может и твои действия к этому приводят...
Одно могу сказать - информация layerstate содержится в Xrecord, которая в ExtensionDictionary для LayerTable:



Теоретически ты можешь скопировать эту Xrecord. Впрочем к чему это приведёт я сказать не берусь.

« Последнее редактирование: 11-12-2020, 20:30:59 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eBadDxfSequence во время ImportLayerStateFromDb
« Ответ #2 : 11-12-2020, 21:13:23 »
Проверил вот такой код:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. #pragma warning disable 0618
  9. // This line is not mandatory, but improves loading performances
  10. [assembly: CommandClass(typeof(CopyLayerState.MyCommands))]
  11.  
  12. namespace CopyLayerState
  13. {
  14.  
  15.   public class MyCommands
  16.   {
  17.     [CommandMethod("CopyLayersState")]
  18.     public void CopyLayersStateHandler()
  19.     {
  20.       Document doc = Application.DocumentManager.MdiActiveDocument;
  21.       if (doc == null) return;
  22.       Database curDb = doc.Database;
  23.       Editor ed = doc.Editor;
  24.       using (Database newDb = new Database(true, false))
  25.       {
  26.         ObjectIdCollection idsLayers = new ObjectIdCollection();
  27.         // Копируем все слои из чертежа
  28.         using (LayerTable lt = curDb.LayerTableId.Open(OpenMode.ForRead) as LayerTable)
  29.         {
  30.           foreach (ObjectId idLayer in lt) idsLayers.Add(idLayer);
  31.         }
  32.         IdMapping maps = new IdMapping();
  33.         curDb.WblockCloneObjects(idsLayers, newDb.LayerTableId, maps, DuplicateRecordCloning.Replace, false);
  34.         // Копируем все состояния слоёв
  35.         LayerStateManager lsmanCurDb = curDb.LayerStateManager;
  36.         LayerStateManager lsmanNewDb = newDb.LayerStateManager;
  37.         object[] names = lsmanCurDb.GetLayerStateNames(false, false).ToArray();
  38.         foreach (string name in names) {
  39.           lsmanNewDb.ImportLayerStateFromDb(name, curDb);
  40.         }
  41.         newDb.SaveAs(doc.Name.Substring(0, doc.Name.Length - 4) + "-1.dwg", DwgVersion.Current);
  42.       }
  43.     }
  44.   }
  45. }

Всё работает нормально.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: eBadDxfSequence во время ImportLayerStateFromDb
« Ответ #3 : 12-12-2020, 22:01:08 »
В 2021 и ваш и мой код работает. А в 2013 он по-прежнему ловит eBadDxfSequence, да и с переключением баз проблемы через раз. Но что странно, в каких-то сочетаниях, не понял еще в каких, под отладчиком в 2013, новый файл сохраняется , layerstate передаются, хоть и с рекавери старого файла, а в нормальной работе вылетает..

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eBadDxfSequence во время ImportLayerStateFromDb
« Ответ #4 : 12-12-2020, 22:05:38 »
т. А в 2013 он по-прежнему ловит eBadDxfSequence,
Так как версия неподдерживаемая, то и говорить не о чем. Вполне возможно, что это был баг и его исправили.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pavka_97Автор темы

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: eBadDxfSequence во время ImportLayerStateFromDb
« Ответ #5 : 12-12-2020, 22:18:00 »
Off-Topic: показать

Но допилить под 2013 надо хоть какой-то способ. Ноут нормально только его тянет.  Придется либо las, либо  extension dictionary пробовать.