Обновление изменений в Layout

Автор Тема: Обновление изменений в Layout  (Прочитано 8147 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: Обновление изменений в Layout
« Ответ #15 : 21-05-2019, 00:33:27 »
На простых работает. Завтра на работе проверю на "грязных". А почему тогда переключение или ранняя инициализация db.CurrentSpaceId выправляют ситуацию с удаленными viewports? Восстанавливает или запоминает предварительное состояние viewports?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Обновление изменений в Layout
« Ответ #16 : 21-05-2019, 00:38:21 »
А почему тогда переключение или ранняя инициализация db.CurrentSpaceId выправляют ситуацию с удаленными viewports?
После того как ты удаляешь все видовые экраны листа db.CurrentSpaceId уже не знает в каком листе ты находишься. При переключении на другой лист/модель и обратно создаётся основной видовой экран, если он был удалён. В AutoCAD 2020 этого бага нет. В 2016-ом есть. В какой версии исправили - не знаю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Re: Обновление изменений в Layout
« Ответ #17 : 21-05-2019, 09:00:30 »
Завтра на работе проверю на "грязных"
Александр абсолютно прав, ты зря удаляешь все объекты в листе, хотя для модели это нормально.

Чтобы работало корректно, ты должен получить ObjectId главного Viewport листа, и при удалении сверять не он ли это!

как-то так
Код - C# [Выбрать]
  1. ObjectId generalViewportId = GetGeneralViewportId (currentLayoutId);
  2. foreach (ObjectId id in acObjIdColl)
  3. {
  4.    if (id!=generalViewportId)
  5.    {
  6.       var objObject = tr.GetObject(id, OpenMode.ForWrite);
  7.       objObject.Erase();
  8.    }
  9.    
  10. }

Функция для определения главного Viewport листа
Код - C# [Выбрать]
  1. public ObjectId GetGeneralViewportId (ObjectId currentLayoutId)
  2. {
  3.    ObjectId id = ObjectId.Null;
  4.  
  5.    Database db = HostApplicationServices.WorkingDatabase;
  6.    using (Transaction tr = db.TransactionManager.StartTransaction())
  7.    {
  8.       Layout currentLayout = tr.GetObject(currentLayoutId, OpenMode.ForRead) as Layout;
  9.       if (currentLayout != null)
  10.       {
  11.          using (ObjectIdCollection ids = currentLayout.GetViewports())
  12.          {
  13.             if (ids.Count > 0)
  14.             {
  15.               //Главный вьюпорт - первый в списке.
  16.               //В пространстве модели нет вьюпортов.
  17.               id = ids[0];
  18.             }
  19.          }
  20.       }
  21.       tr.Commit();
  22.    }
  23.    return id;
  24. }
« Последнее редактирование: 21-05-2019, 14:49:42 от Привалов Дмитрий »

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: Обновление изменений в Layout
« Ответ #18 : 21-05-2019, 09:07:44 »
Да Дмитрий, спасибо. Я не догадался, что Erase еще и нулевой вьюпорт удаляет.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Обновление изменений в Layout
« Ответ #19 : 21-05-2019, 10:13:40 »
Я не догадался, что Erase еще и нулевой вьюпорт удаляет.
Это не Erase нулевой порт удаляет, а твой фильтр выбора захватывает его.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: Обновление изменений в Layout
« Ответ #20 : 21-05-2019, 13:59:19 »
Разобрался со всеми своими примерами, все заработало. Думаю ответ на вопрос в названии темы такой - универсального метода обновления изменений в листе нет, все зависит от самого кода, т.е. что конкретно мы хотим обновить и при условии что в коде нет ошибок :).

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Re: Обновление изменений в Layout
« Ответ #21 : 21-05-2019, 14:56:02 »
Разобрался со всеми своими примерами, все заработало.
Подправил немного код, вынес ObjectId generalViewportId = GetGeneralViewportId (currentLayoutId) за цикл.
А то плохой пример для новичков, еще скопируют 1 в 1.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Обновление изменений в Layout
« Ответ #22 : 21-05-2019, 15:16:41 »
А не проще так:
Код - C# [Выбрать]
  1. acObjIdColl.Remove(generalViewportId)
?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Обновление изменений в Layout
« Ответ #23 : 21-05-2019, 15:24:49 »
А не проще так:
Код - C# [Выбрать]
  1. acObjIdColl.Remove(generalViewportId)
?
Так может быть немножко дольше. Хотя это всё не принципиально...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Re: Обновление изменений в Layout
« Ответ #24 : 21-05-2019, 15:33:06 »
А не проще так:
Если вникнуть в код, то да, лучше.

Если уж копать глубже, не понятно зачем создавать фильтр для выбора без параметров, и получать коллекцию, которая похоже только для итерации. Тогда уж лучше получить BlockTableRecord и пройтись по DbObject.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Обновление изменений в Layout
« Ответ #25 : 21-05-2019, 15:38:04 »
Если уж копать глубже, не понятно зачем создавать фильтр для выбора без параметров, и получать коллекцию, которая похоже только для итерации. Тогда уж лучше получить BlockTableRecord и пройтись по DbObject.
Полностью согласен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 150
  • Карма: 3
Re: Обновление изменений в Layout
« Ответ #26 : 21-05-2019, 15:40:32 »
Изначально параметры были, в процессе алгоритм поменялся, для простоты параметры удалил, но не учел, что такой "пустой"фильтр еще и главный вьюпорт затрагивает.