Созданный слой не отображается в диспетчере слоев.

Автор Тема: Созданный слой не отображается в диспетчере слоев.  (Прочитано 9850 раз)

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

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Всем доброго дня!

Создаю слой:
Код - C# [Выбрать]
  1. var ltrMarks = new LayerTableRecord();
  2. ltrMarks.Name = newName;
  3. ltrMarks.IsPlottable = false;
  4. lt.UpgradeOpen();
  5. _idLayerMarks = lt.Add(ltrMarks);
  6. t.AddNewlyCreatedDBObject(ltrMarks, true);
  7. t.Commit();
Дальше в коде назначаю этот слой объектам в блоке.
Но слой не отображается в диспетчере слоев, пока не зайдешь в редактор блока в котором есть объект в этом слое.

Возможно причина где-то в моем проекте.
Подозрения на метод копирования определения блока:
Код - C# [Выбрать]
  1. public static ObjectId CopyBtr(ObjectId idBtr, string name)
  2.       {
  3.          ObjectId idBtrCopy = ObjectId.Null;
  4.          Database db = HostApplicationServices.WorkingDatabase;
  5.          using (var t = db.TransactionManager.StartTransaction())
  6.          {
  7.             var btrSource = t.GetObject(idBtr, OpenMode.ForRead) as BlockTableRecord;
  8.             var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  9.             //проверка имени блока
  10.             if (bt.Has(name))
  11.             {
  12.                idBtrCopy = bt[name];
  13.             }
  14.             else
  15.             {  
  16.                var btrCopy = btrSource.Clone () as BlockTableRecord;              
  17.                btrCopy.Name = name;
  18.                bt.UpgradeOpen();
  19.                idBtrCopy = bt.Add(btrCopy);
  20.                t.AddNewlyCreatedDBObject(btrCopy, true);
  21.                // Копирование объектов блока
  22.                ObjectIdCollection ids = new ObjectIdCollection();
  23.                foreach (ObjectId idEnt in btrSource)
  24.                {
  25.                   ids.Add(idEnt);
  26.                }
  27.                IdMapping map = new IdMapping();
  28.                db.DeepCloneObjects(ids, idBtrCopy, map, true);
  29.             }
  30.             t.Commit();
  31.          }
  32.          return idBtrCopy;
  33.       }
Есть какие предположения?

Спасибо!

AutoCAD 2015 рус sp2. Visual studio Community 2015. Net 4.5.2.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Упрости задачу поиска ошибки. Напиши код, который создаёт слой в виде отдельной команды. Запусти её и посмотри появится ли слой в Диспетчере слоёв.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Создал тестовый проект.
Копируется блок.
Создается слой.
Код - C# [Выбрать]
  1. [CommandMethod("Test")]
  2.       public static void Test()
  3.       {
  4.          Document doc = Application.DocumentManager.MdiActiveDocument;
  5.  
  6.          //Выбор блока для копирования
  7.          var resPrompt = doc.Editor.GetEntity("Выбери блок");          
  8.  
  9.          //Копирование блока
  10.          TestCopyBtr(resPrompt.ObjectId, "TestBlockName");  
  11.  
  12.          // Создание слоя      
  13.          TestCreateLayer("TestLayerName");
  14.       }
  15.  
  16.       private static void TestCreateLayer(string layerName)
  17.       {
  18.          Database db = HostApplicationServices.WorkingDatabase;
  19.          using (var t = db.TransactionManager.StartTransaction())
  20.          {
  21.             var lt = t.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
  22.             if (!lt.Has(layerName))
  23.             {
  24.                // Если слоя нет, то он создается.
  25.                var ltrMarks = new LayerTableRecord();
  26.                ltrMarks.Name = layerName;
  27.                ltrMarks.IsPlottable = false;
  28.                lt.UpgradeOpen();
  29.                lt.Add(ltrMarks);
  30.                t.AddNewlyCreatedDBObject(ltrMarks, true);
  31.             }
  32.             t.Commit();
  33.          }
  34.       }
  35.  
  36.       public static ObjectId TestCopyBtr(ObjectId idBlref, string name)
  37.       {
  38.          ObjectId idBtrCopy = ObjectId.Null;
  39.          Database db = HostApplicationServices.WorkingDatabase;
  40.          using (var t = db.TransactionManager.StartTransaction())
  41.          {
  42.             var blRefSource = t.GetObject(idBlref, OpenMode.ForRead) as BlockReference;
  43.             var btrSource = t.GetObject(blRefSource.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  44.             var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  45.             //проверка имени блока
  46.             if (bt.Has(name))
  47.             {
  48.                idBtrCopy = bt[name];
  49.             }
  50.             else
  51.             {
  52.                var btrCopy = btrSource.Clone() as BlockTableRecord;
  53.                btrCopy.Name = name;
  54.                bt.UpgradeOpen();
  55.                idBtrCopy = bt.Add(btrCopy);
  56.                t.AddNewlyCreatedDBObject(btrCopy, true);
  57.                // Копирование объектов блока
  58.                ObjectIdCollection ids = new ObjectIdCollection();
  59.                foreach (ObjectId idEnt in btrSource)
  60.                {
  61.                   ids.Add(idEnt);
  62.                }
  63.                IdMapping map = new IdMapping();
  64.                db.DeepCloneObjects(ids, idBtrCopy, map, true);
  65.             }
  66.             t.Commit();
  67.          }
  68.          return idBtrCopy;
  69.       }
Слой не отображается в диспетчере, пока не сходишь в редактор блока. Причем слой, только создается, не присваивается никаким примитивам.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Напиши код, который создаёт слой в виде отдельной команды. Запусти её и посмотри появится ли слой в Диспетчере слоёв.
Да, просто создание слоя работает и в проекте и в тесте.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Есть какие предположения?
Добавь слой сразу в чертеж (думаю так даже правильней)
http://through-the-interface.typepad.com/through_the_interface/2010/01/creating-an-autocad-layer-using-net.html

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

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Добавь слой сразу в чертеж (думаю так даже правильней)
Когда сразу? )
Во время работы команды мне нужен слой, но его может не оказаться в чертеже, и я его создаю.
Проверяешь под отладчиком? Если да, то попробуй без отладчика загрузить своё приложение и выполнить его.
Не, запускал по всякому, и в релизе.

Отмечено как Решение Вильдар 03-09-2015, 13:23:28

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Замени:
Код - C# [Выбрать]
  1. db.DeepCloneObjects(ids, idBtrCopy, map, true);
на:
Код - C# [Выбрать]
  1. db.DeepCloneObjects(ids, idBtrCopy, map, false);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Эххх не успел ответить))

Правда мой ответ был-бы другим. Типа:
"Спорим, что вот так работает?!"
Код - C# [Выбрать]
  1. [CommandMethod("Test")]
  2.         public static void Test()
  3.         {
  4.             //Document doc = Application.DocumentManager.MdiActiveDocument;
  5.  
  6.             ////Выбор блока для копирования
  7.             //var resPrompt = doc.Editor.GetEntity("Выбери блок");
  8.  
  9.             ////Копирование блока
  10.             //TestCopyBtr(resPrompt.ObjectId, "TestBlockName");
  11.  
  12.             // Создание слоя      
  13.             TestCreateLayer("TestLayerName");
  14.         }

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
"Спорим, что вот так работает?!"
Об этом vildar82 уже писал:
Да, просто создание слоя работает и в проекте и в тесте.
Смысл в том, что db.DeepCloneObjects(ids, idBtrCopy, map, true); серьезно рушит базу чертежа.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение