Удаление нескольких листов

Автор Тема: Удаление нескольких листов  (Прочитано 16351 раз)

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Надеюсь тема не окажется снова глупой ))
Значит так - есть два метода: один удаляет листы, второй добавляет новый лист. С удалением одного листа вроде проблем не замечается, но с удалением нескольких - происходит следующая проблема
По порядку:
1. Удаление нескольких листов происходит так:
Код - C# [Выбрать]
  1. else if (LvLayouts.SelectedItems.Count > 1)
  2. {
  3.     if (MpQstWin.Show("Вы уверены, что хотите удалить выбранные листы?"))
  4.     {
  5.         var layoutsToDelete = LvLayouts.SelectedItems.OfType<Layout>().Where(selectedLayout => !selectedLayout.ModelType).ToList();
  6.  
  7.         if (layoutsToDelete.Count > 0)
  8.         {
  9.             using (var tr = _currentDocument.TransactionManager.StartTransaction())
  10.             {
  11.                 using (_currentDocument.LockDocument())
  12.                 {
  13.                     var lm = LayoutManager.Current;
  14.                     foreach (var layout in layoutsToDelete)
  15.                     {
  16.                         lm.DeleteLayout(layout.LayoutName);
  17.                         _currentDocLayouts.Remove(layout);
  18.                     }
  19.                     BindingLayoutsToListView();
  20.                 }
  21.                 tr.Commit();
  22.                 _currentDocument.Editor.Regen();
  23.             }
  24.         }
  25.     }
  26. }
Пояснять, думаю, особо нечего - в ListBox'е я выбрал листы (там идет Binding самих Layout) и по именам этих листов удаляю их, используя LayoutManager.DeleteLayout. Читал на форумах, что это работать должно без транзакции, но не работает...
В автокаде на первый взгляд все выглядит нормально. Листы удаляются. В примере - было 8 листов и я удалил 3:



Дальше я использую метод для создания нового листа. В общем сам метод не важен, а важно только то, что для задания имени нового листа я использую такой код: Text = "Лист" + lm.LayoutCount. Т.е. беру номер, равный количеству листов в LayoutManager. И вот тут самая проблема и возникает - в LayoutManager.LayoutCount совсем другое значение! Я добавил в этот метод строчку MessageBox.Show(lm.LayoutCount.ToString()); и в показанном на картинке выше примере сразу-же вызвал этот метод. И вот результат:



В LayoutManager.LayoutCount должно быть значение 5, а там значение 7. Думаю, вся проблема в коде удаления нескольких листов. Получается, что нужно для удаления каждого открывать транзакцию и вызывать метод Commit()???

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удаление нескольких листов
« Ответ #1 : 03-11-2016, 16:03:29 »
Я не понял. У тебя коллекция Layout гуляет вне рамок транзакции?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Удаление нескольких листов
« Ответ #2 : 03-11-2016, 16:23:26 »
Я не понял. У тебя коллекция Layout гуляет вне рамок транзакции?
Еще как гуляет)) Но с ней ничего не происходит - эта коллекция используется для биндинга и значения в ней не изменяются. Спешил просто - переделаю немного и сделаю свой класс, используемый для биндинга. К сути вопроса это не относится

Переделал код на вот такой:
Код - C# [Выбрать]
  1. else if (LvLayouts.SelectedItems.Count > 1)
  2. {
  3.     if (MpQstWin.Show("Вы уверены, что хотите удалить выбранные листы?"))
  4.     {
  5.         var layoutsToDelete = LvLayouts.SelectedItems.OfType<Layout>().Where(selectedLayout => !selectedLayout.ModelType).ToList();
  6.  
  7.         if (layoutsToDelete.Count > 0)
  8.         {
  9.             //using (var tr = _currentDocument.TransactionManager.StartTransaction())
  10.             //{
  11.             //    using (_currentDocument.LockDocument())
  12.             //    {
  13.             //        var lm = LayoutManager.Current;
  14.             //        foreach (var layout in layoutsToDelete)
  15.             //        {
  16.             //            lm.DeleteLayout(layout.LayoutName);
  17.             //            _currentDocLayouts.Remove(layout);
  18.             //        }
  19.             //        BindingLayoutsToListView();
  20.             //    }
  21.             //    tr.Commit();
  22.             //    _currentDocument.Editor.Regen();
  23.             //}
  24.            
  25.             foreach (var layout in layoutsToDelete)
  26.             {
  27.                 using (var tr = _currentDocument.TransactionManager.StartTransaction())
  28.                 {
  29.                     using (_currentDocument.LockDocument())
  30.                     {
  31.                         var lm = LayoutManager.Current;
  32.                         lm.DeleteLayout(layout.LayoutName);
  33.                         _currentDocLayouts.Remove(layout);
  34.                     }
  35.                     tr.Commit();
  36.                    
  37.                 }
  38.             }
  39.             BindingLayoutsToListView();
  40.             _currentDocument.Editor.Regen();
  41.         }
  42.     }
  43. }

Вот он работает! Но на сколько это будет правильным каждый раз открывать транзакцию для удаления листа?

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удаление нескольких листов
« Ответ #3 : 03-11-2016, 16:28:00 »
К сути вопроса это не относится
Это листы из базы? Тогда ты делаешь черт знает что. Даже комментировать не хочу. Ведь на днях же этот вопрос обсуждался на форуме...
И кто тебе сказал, что нужно сначала открывать транзакцию, а потом блокировать документ?
Жуть. No Comments.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Удаление нескольких листов
« Ответ #4 : 03-11-2016, 16:58:20 »
Ведь на днях же этот вопрос обсуждался на форуме...
Меня там не было наверно))
И кто тебе сказал, что нужно сначала открывать транзакцию, а потом блокировать документ?
Ну тут да - чет я закосячил
Это листы из базы? Тогда ты делаешь черт знает что. Даже комментировать не хочу
Эту жуть я уже убрал. При работе с автокадом ни как себе в голову не вобью, что так не нужно делать  :-\
Сделал свой класс для биндинга:
Код - C# [Выбрать]
  1. private class LayoutForBinding
  2. {
  3.     public string LayoutName { get; set; }
  4.     public bool ModelType { get; set; }
  5.     public int TabOrder { get; set; }
  6.     public bool TabSelected { get; set; }
  7. }
Получаю листы из файла так:
Код - C# [Выбрать]
  1. _currentDocLayouts = new ObservableCollection<LayoutForBinding>();
  2. if (_currentDocument != null & _currentDatabase != null)
  3. {
  4.     bool b;
  5.     var showModel = !bool.TryParse(MpSettings.GetValue("Settings", "mpLayoutManager", "ShowModel"), out b) || b; // true
  6.  
  7.     using (var tr = _currentDatabase.TransactionManager.StartTransaction())
  8.     {
  9.         var layoutDic = tr.GetObject(_currentDatabase.LayoutDictionaryId,OpenMode.ForRead,false) as DBDictionary;
  10.  
  11.         if (layoutDic != null)
  12.             foreach (var entry in layoutDic)
  13.             {
  14.                 var layoutId = entry.Value;
  15.                 var layout = tr.GetObject(layoutId, OpenMode.ForRead) as Layout;
  16.                 if (layout != null)
  17.                 {
  18.                     var layoutForBinding = new LayoutForBinding
  19.                     {
  20.                         LayoutName = layout.LayoutName,
  21.                         ModelType = layout.ModelType,
  22.                         TabOrder = layout.TabOrder,
  23.                         TabSelected = layout.TabSelected
  24.                     };
  25.  
  26.                     if (showModel)
  27.                         _currentDocLayouts.Add(layoutForBinding);
  28.                     else if (!layout.ModelType)
  29.                         _currentDocLayouts.Add(layoutForBinding);
  30.                 }
  31.             }
  32.         tr.Commit();
  33.     }
  34.     _currentDocLayouts = new ObservableCollection<LayoutForBinding>(_currentDocLayouts.OrderBy(x => x.TabOrder)); // сортируем
  35. }
Ну и, соответственно, удаление:
Код - C# [Выбрать]
  1. if (MpQstWin.Show("Вы уверены, что хотите удалить выбранные листы?"))
  2. {
  3.     var layoutsToDelete = LvLayouts.SelectedItems.OfType<LayoutForBinding>().Where(selectedLayout => !selectedLayout.ModelType).ToList();
  4.  
  5.     if (layoutsToDelete.Count > 0)
  6.     {
  7.         foreach (var layout in layoutsToDelete)
  8.         {
  9.             using (_currentDocument.LockDocument())
  10.             {
  11.                 using (var tr = _currentDocument.TransactionManager.StartTransaction())
  12.                 {
  13.  
  14.                     var lm = LayoutManager.Current;
  15.                     lm.DeleteLayout(layout.LayoutName);
  16.                     _currentDocLayouts.Remove(layout);
  17.                     tr.Commit();
  18.                 }
  19.             }
  20.         }
  21.         BindingLayoutsToListView();
  22.         _currentDocument.Editor.Regen();
  23.     }
  24. }

Но на сколько это будет правильным каждый раз открывать транзакцию для удаления листа?

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удаление нескольких листов
« Ответ #5 : 03-11-2016, 17:38:41 »
Ну тут да - чет я закосячил
Тебе достаточно однократно заблокировать документ, если не переключаешься на другой! Ты же все-равно пытаешься это сделать в цикле...
Но на сколько это будет правильным каждый раз открывать транзакцию для удаления листа?
Если работает только так, то нормально. Хотя у меня есть сомнения, но сейчас проверить не могу.
Я не увидел в коде проверки на то, что ты не удаляешь текущий Лист.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Удаление нескольких листов
« Ответ #6 : 03-11-2016, 17:45:19 »
Тебе достаточно однократно заблокировать документ, если не переключаешься на другой! Ты же все-равно пытаешься это сделать в цикле...
Ох ох! И действительно! Не обратил внимания. Спасибо, подправил
Если работает только так, то нормально. Хотя у меня есть сомнения, но сейчас проверить не могу.
Буду ждать с нетерпением вашей проверки))
Я не увидел в коде проверки на то, что ты не удаляешь текущий Лист.
А зачем? Если пользователь хочет удалить несколько листов, включая текущий - пусть удаляет. Ошибок это не вызывает никаких, т.к. и стандартные средства это поддерживают

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удаление нескольких листов
« Ответ #7 : 03-11-2016, 17:53:52 »
Посмотри пока этот код: http://forums.autodesk.com/t5/net/erasing-layouts/m-p/5801221#M45848
Там вроде всё удаляется без транзакций.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удаление нескольких листов
« Ответ #8 : 03-11-2016, 17:54:53 »
А зачем? Если пользователь хочет удалить несколько листов, включая текущий - пусть удаляет. Ошибок это не вызывает никаких, т.к. и стандартные средства это поддерживают
Только предварительно нужно переключится на какой-то лист, который не будет удален.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Удаление нескольких листов
« Ответ #9 : 03-11-2016, 18:05:17 »
Посмотри пока этот код: http://forums.autodesk.com/t5/net/erasing-layouts/m-p/5801221#M45848
Там вроде всё удаляется без транзакций.
Видел его сегодня. Не знаю почему, но при отсутствии транзакции у меня ловится фатал:


Только предварительно нужно переключится на какой-то лист, который не будет удален.
Не нужно. Автокад это все делает сам

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удаление нескольких листов
« Ответ #10 : 03-11-2016, 18:11:42 »
Видел его сегодня. Не знаю почему, но при отсутствии транзакции у меня ловится фатал:
Что говорит о том, что какой-то объект открыт на чтение и поэтому AutoCAD не может его открыть на запись.
Ты пробовал тот пример в чистом виде или встраивал его в свой код? Если в чистом виде не проверял, то проверь.
Не нужно. Автокад это все делает сам
Ну-ну... Это точно про тебя:
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 04-11-2016, 19:22:10

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удаление нескольких листов
« Ответ #11 : 04-11-2016, 00:44:24 »
Похоже ты меня решил снова ввести в заблуждение. Смотрим код немного переработанный и результат его работы:

Код - C# [Выбрать]
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using System.Text.RegularExpressions;
  5.  
  6. using Autodesk.AutoCAD.Runtime;
  7. using Autodesk.AutoCAD.ApplicationServices;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.Geometry;
  10. using Autodesk.AutoCAD.EditorInput;
  11.  
  12. [assembly: CommandClass(typeof(DeleteLayouts.MyCommands))]
  13.  
  14. namespace DeleteLayouts
  15. {
  16.  
  17.   public class MyCommands
  18.   {
  19.     [CommandMethod("TestDelLayout")]
  20.     public void TestDelLayout()
  21.     {
  22.       Document doc = null;
  23.       Database db = null;
  24.       Editor ed = null;
  25.  
  26.       try
  27.       {
  28.         doc = Application.DocumentManager.MdiActiveDocument;
  29.         db = doc.Database;
  30.         ed = doc.Editor;
  31.         var layoutManager = LayoutManager.Current;
  32.  
  33.         foreach (string layoutName in GetTabOrderedLayoutNames(db))
  34.         {
  35.           if (Regex.IsMatch(layoutName, "^Лист[0-9]+", RegexOptions.IgnoreCase) ||
  36.               Regex.IsMatch(layoutName, "^Layout[0-9]+", RegexOptions.IgnoreCase))
  37.             layoutManager.DeleteLayout(layoutName);
  38.         }
  39.         ed.Regen();
  40.       }
  41.       catch (System.Exception ex)
  42.       {
  43.         if (ed != null)
  44.           ed.WriteMessage("\n Error: " + ex.Message);
  45.       }
  46.     }
  47.  
  48.     public static List<string> GetTabOrderedLayoutNames(Database db)
  49.     {
  50.       if (db == null)
  51.         return null;
  52.  
  53.       var tabOrderedLayouts = new Dictionary<int, string>();
  54.       using (Transaction tr = db.TransactionManager.StartTransaction())
  55.       {
  56.         DBDictionary layoutDict = (DBDictionary)tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead);
  57.         foreach (DBDictionaryEntry layoutEntry in layoutDict)
  58.         {
  59.           Layout layout = (Layout)tr.GetObject(layoutEntry.Value, OpenMode.ForRead);
  60.           if (!layout.ModelType)
  61.             tabOrderedLayouts[layout.TabOrder] = layout.LayoutName;
  62.         }
  63.         tr.Commit();
  64.       }
  65.       return tabOrderedLayouts.OrderBy(n => n.Key).Select(n => n.Value).ToList();
  66.     }
  67.   }
  68. }

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Удаление нескольких листов
« Ответ #12 : 04-11-2016, 08:29:39 »
Ну тогда я ничего не понимаю  :( Ваш код, конечно-же, работает
У меня грузится палитра. На палитре расположен ListView
Делаю свой класс:
Код - C# [Выбрать]
  1. private class LayoutForBinding
  2. {
  3.     public string LayoutName { get; set; }
  4.     public bool ModelType { get; set; }
  5.     public int TabOrder { get; set; }
  6.     public bool TabSelected { get; set; }
  7. }
При загрузке палитры в методе Load я запускаю метод получения листов:
Код - C# [Выбрать]
  1. private void GetCurrentDocLayouts()
  2. {
  3.     try
  4.     {
  5.         var doc = AcApp.DocumentManager.MdiActiveDocument;
  6.         var db = doc.Database;
  7.         _currentDocLayouts = new ObservableCollection<LayoutForBinding>();
  8.  
  9.         using (var tr = db.TransactionManager.StartTransaction())
  10.         {
  11.             var layoutDic = tr.GetObject(db.LayoutDictionaryId, OpenMode.ForRead, false) as DBDictionary;
  12.  
  13.             if (layoutDic != null)
  14.                 foreach (var entry in layoutDic)
  15.                 {
  16.                     var layoutId = entry.Value;
  17.                     var layout = tr.GetObject(layoutId, OpenMode.ForRead) as Layout;
  18.                     if (layout != null)
  19.                     {
  20.                         var layoutForBinding = new LayoutForBinding
  21.                         {
  22.                             LayoutName = layout.LayoutName,
  23.                             ModelType = layout.ModelType,
  24.                             TabOrder = layout.TabOrder,
  25.                             TabSelected = layout.TabSelected
  26.                         };
  27.  
  28.                         if (_showModel)
  29.                             _currentDocLayouts.Add(layoutForBinding);
  30.                         else if (!layout.ModelType)
  31.                             _currentDocLayouts.Add(layoutForBinding);
  32.                     }
  33.                 }
  34.             tr.Commit();
  35.         }
  36.         _currentDocLayouts = new ObservableCollection<LayoutForBinding>(_currentDocLayouts.OrderBy(x => x.TabOrder)); // сортируем
  37.     }
  38.     catch (Exception exception)
  39.     {
  40.         MpExWin.Show(exception);
  41.     }
  42.  
  43.     BindingLayoutsToListView();
  44. }
Биндинг к окну:
Код - C# [Выбрать]
  1. private void BindingLayoutsToListView()
  2. {
  3.     LvLayouts.ItemsSource = null;
  4.     var cl = GetCurrentLayoutName();
  5.     foreach (var currentDocLayout in _currentDocLayouts)
  6.     {
  7.         currentDocLayout.TabSelected = currentDocLayout.LayoutName.Equals(cl);
  8.     }
  9.     LvLayouts.ItemsSource = _currentDocLayouts;
  10. }
  11.  
  12. private static string GetCurrentLayoutName()
  13. {
  14.     var lm = LayoutManager.Current;
  15.     return lm.CurrentLayout;
  16. }
И ВСЕ! Больше ничего не происходит. Сразу при загрузке я выбираю лист в списке и пытаюсь его удалить - ловлю вышеуказанную ошибку - eNotOpenForWrite
Код удаления:
Код - C# [Выбрать]
  1. // delete
  2. private void MenuItem_Delete_OnClick(object sender, RoutedEventArgs e)
  3. {
  4.     try
  5.     {
  6.         var doc = AcApp.DocumentManager.MdiActiveDocument;
  7.  
  8.         if (LvLayouts.SelectedItems.Count == 1)
  9.         {
  10.             var selectedLayout = LvLayouts.SelectedItem as LayoutForBinding;
  11.  
  12.             if (selectedLayout != null)
  13.                 if (
  14.                         MpQstWin.Show("Вы уверены, что хотите удалить лист" + Environment.NewLine +
  15.                                       selectedLayout.LayoutName + "?"))
  16.                 {
  17.                     var lm = LayoutManager.Current;
  18.                     lm.DeleteLayout(selectedLayout.LayoutName);
  19.                     _currentDocLayouts.Remove(selectedLayout);
  20.                     BindingLayoutsToListView();
  21.                     doc.Editor.Regen();
  22.                 }
  23.         }
  24.         else if (LvLayouts.SelectedItems.Count > 1)
  25.         {
  26.             if (MpQstWin.Show("Вы уверены, что хотите удалить выбранные листы?"))
  27.             {
  28.                 var layoutsToDelete = LvLayouts.SelectedItems.OfType<LayoutForBinding>().Where(selectedLayout => !selectedLayout.ModelType).ToList();
  29.  
  30.                 if (layoutsToDelete.Count > 0)
  31.                 {
  32.                     foreach (var layout in layoutsToDelete)
  33.                     {
  34.                         var lm = LayoutManager.Current;
  35.                         lm.DeleteLayout(layout.LayoutName);
  36.                         _currentDocLayouts.Remove(layout);
  37.                     }
  38.                     BindingLayoutsToListView();
  39.                     doc.Editor.Regen();
  40.                 }
  41.             }
  42.         }
  43.     }
  44.     catch (Exception exception) { MpExWin.Show(exception); }
  45. }
Фатал ловится на строчке lm.DeleteLayout(selectedLayout.LayoutName);
Я просто никак понять не могу - что именно у меня "не открыто для записи"?!

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Удаление нескольких листов
« Ответ #13 : 04-11-2016, 08:46:15 »
Удалились без транзакции!!! НО! Но с блокировкой документа
Код - C# [Выбрать]
  1. if (LvLayouts.SelectedItems.Count == 1)
  2. {
  3.     var selectedLayout = LvLayouts.SelectedItem as LayoutForBinding;
  4.  
  5.     if (selectedLayout != null)
  6.         if (
  7.                 MpQstWin.Show("Вы уверены, что хотите удалить лист" + Environment.NewLine +
  8.                               selectedLayout.LayoutName + "?"))
  9.         {
  10.             using (doc.LockDocument())
  11.             {
  12.                 var lm = LayoutManager.Current;
  13.                 lm.DeleteLayout(selectedLayout.LayoutName);
  14.                 _currentDocLayouts.Remove(selectedLayout);
  15.                 BindingLayoutsToListView();
  16.  
  17.                 doc.Editor.Regen();
  18.             }
  19.         }
  20. }

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Удаление нескольких листов
« Ответ #14 : 04-11-2016, 09:29:00 »
Удалились без транзакции!!! НО! Но с блокировкой документа
А что тебе не очевидно, что из контекста приложения нужно блокировать документ если его собираешься модифицировать?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение