Ошибка при повторном использовании OpenAndActivateDocument

Автор Тема: Ошибка при повторном использовании OpenAndActivateDocument  (Прочитано 3060 раз)

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

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Добрый день!

Столкнулся со странным поведением Revit.
Выполняю простейший метод
Код - C# [Выбрать]
  1. commandData.Application.OpenAndActivateDocument("C:\\Temp\\test.rvt");
Файл открывается. Закрываю его через
Код - C# [Выбрать]
  1. SendKeys.SendWait("^{F4}");
Пытаюсь повторить действия, появляется ошибка:
Цитировать
A managed exception was thrown by Revit or by one of its external applications.

Убрал метод закрытия и закрываю вручную, смог открыть два раза, на третий вылезла та же самая ошибка.
Что это может быть?

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Закрываю его через
Зачем так закрывать? Есть же специальный метод - Document.Close()


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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Зачем так закрывать? Есть же специальный метод - Document.Close()
Ну все дело в том, что этот метод не работает с активным документом и это всех раздражает:)
http://thebuildingcoder.typepad.com/blog/2010/10/closing-the-active-document-and-why-not-to.html

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Зачем так закрывать? Есть же специальный метод - Document.Close()
Ну все дело в том, что этот метод не работает с активным документом и это всех раздражает:)
http://thebuildingcoder.typepad.com/blog/2010/10/closing-the-active-document-and-why-not-to.html
Вот прям там же в этой статье советуют так не делать =)
Проще создать новый пустой документ, сделать его активным, а нужный закрыть. Все методы есть в API
Плюс - какая версия Ревита у Вас? Вы пробовали на других версиях?
Да и какие действия вы совершаете с документом? Может проблема где-то в коде?

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Проще создать новый пустой документ, сделать его активным, а нужный закрыть.
Мне это не совсем подходит, но не суть.
Плюс - какая версия Ревита у Вас?
2018.1
Вы пробовали на других версиях?
Не пробовал, но собираюсь потестить на другой машине для начала.
Да и какие действия вы совершаете с документом?
Только открытие и закрытие
Может проблема где-то в коде?
Не думаю, потому что в целом код это только открытие документа.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Да, в Ревите проблемы - даже документ активировать нет возможности((
Попробовал так:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.Revit.Attributes;
  3. using Autodesk.Revit.DB;
  4. using Autodesk.Revit.UI;
  5.  
  6. namespace DocumentopenTest
  7. {
  8.     [Transaction(TransactionMode.Manual)]
  9.     public class Class1 : IExternalCommand
  10.     {
  11.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  12.         {
  13.             try
  14.             {
  15.                 var fileName = "C:/Temp/Test_2017.rvt";
  16.                 // open document
  17.                 var openedDoc = commandData.Application.OpenAndActivateDocument(fileName);
  18.                 // some work
  19.                 TaskDialog.Show("Title", "Hello");
  20.                 // activate help doc
  21.                 commandData.Application.OpenAndActivateDocument("C:/Temp/Проект2.rvt");
  22.                 // close opened doc
  23.                 openedDoc.SaveAndClose();
  24.  
  25.                 return Result.Succeeded;
  26.             }
  27.             catch (Exception exception)
  28.             {
  29.                 message += exception.Message;
  30.                 return Result.Failed;
  31.             }
  32.         }
  33.     }
  34. }
Все работает отлично - несколько раз подряд запускал.
В моем случае Проект2.rvt был открыт открыт в текущий момент - при работе кода просто происходит переключение на него. Т.е. если при запуске команды открыт какой-то файл, то можно у него получить свойство "путь к файлу" (там правда тоже свои приколы) и после работы "переключаться" на него. В принципе при запуске плагина всегда открыт какой-то документ (если вы специально не делали иного).

Это как вариант

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

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Да вот только закончил, на другой машине работает хорошо, видимо, мой сломался :( Попробую починить.


var fileName = "C:/Temp/Test_2017.rvt";
                // open document
                var openedDoc = commandData.Application.OpenAndActivateDocument(fileName);
                // some work
                TaskDialog.Show("Title", "Hello");
                // activate help doc
                commandData.Application.OpenAndActivateDocument("C:/Temp/Проект2.rvt");
                // close opened doc
                openedDoc.SaveAndClose();

Что касается такого решения, оно мне не нравится тем, что в случае закрытия нескольких файлов, например 5ти, время открытия - закрытия документов увеличивается в разы, а если файлы огромные, то вообще можно чай идти пить.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Что касается такого решения, оно мне не нравится тем, что в случае закрытия нескольких файлов, например 5ти, время открытия - закрытия документов увеличивается в разы, а если файлы огромные, то вообще можно чай идти пить
Не понял - в каком моменте время увеличивается? При открытии у вас время во всех вариантах будет одинаковым. При закрытии - можно закрыть двумя способами. Первый я в примере использовал - метод SaveAndClose() у UiDocument'а - при этом идет сохранение, а второй я писал в первом ответе - он уже у Document'а - в него можно подать false и закрытие будет без сохранения