eFileError, когда вызов функции открытия чертежа идёт не из CommandMethod

Автор Тема: eFileError, когда вызов функции открытия чертежа идёт не из CommandMethod  (Прочитано 5890 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Здравствуйте.

Столкнулся со следующей проблемой -- у меня есть открытие чертежа, оно происходит так:
1. Открываем в плагине некую БД.
2. Появляется окно с пользовательским интерфейсом, где можно выбрать чертеж.
3.1. После выбора конкретного чертежа его можно скачать (и сохранить на компьютере в некоторой папке). В данном случае всё отрабатывает корректно. Вызывается некая команда с CommandMethod, из которой уже вызывается в дальнейшем метод открытия и сохранения чертежа.
Но после второго пункта может пойти и другой вариант развития событий:
3.2. Открываем историю чертежа -- тут появится ещё одно окошко, которое будет уже содержать историю изменения чертежа. Когда мы хотим скачать какую-либо из версий, то вылетает исключение eFileError (хотя сохранение пройдёт успешно, ошибку выдаёт именно открытие его в AutoCAD/Civil). Это всё происходит для одного и того же чертежа, так что проблема вряд ли в версии, в которой он сохранен. Но теперь же в цепочке методов, ведущих к открытию чертежа и его сохранению, не будет команды с CommandMethod. Появилось подозрение, что ошибка в этом (хоть это и не однозначно), однако "впихнуть" CommandMethod просто так не получится.

Что можете посоветовать в сложившейся ситуации?

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

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

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Что такое "функция открытия чертежа"?
Если правильно понимаю вопрос, то попробую подробнее объяснить ситуацию: этих функций даже две. Изначально стояла:
Application.DocumentManager.Open("fileName");
Она также выдавала ошибку, мол, контекст не существует. Предположили, что ошибки уйдут с помощью следующей функции:
Application.DocumentManager.AppContextOpenDocument("fileName");
Но нет, эта уже выдаёт eFileError.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Application.DocumentManager.Open("fileName");
Как минимум этот код нужно выполнять из контекста приложения (т.е., если это команда, то с флагом Session). И если открыт модальный диалог, то его нужно закрыть - иначе не сработает. Ну и DocumentActivationEnabled = true;
Ну и убедись, что это файл закрыт (т.е. не открыт ни в одной из программ в Windows).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Александр Ривилис, спасибо большое за советы! Я обязательно попробую их все и дам обратную связь.)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Она также выдавала ошибку, мол, контекст не существует.
А ты случайно не пытаешься открыть чертеж из отдельного потока (Task)? Если да, то так делать нельзя - открывать нужно только из главного потока.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
А ты случайно не пытаешься открыть чертеж из отдельного потока (Task)?
Если честно, то сейчас по памяти сказать не могу (доступа к репозиторию на домашнем ПК, увы, нет), но, по-моему, всё же не вызывается из отдельного потока (но проверю обязательно эту версию). Но тогда небольшой вопрос: если бы это вызывалось из отдельного потока и "ломалось", то разве и в первом случае не было бы тогда ошибки?

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

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

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
разницу между первым и вторым
Хм. Я бы сказал, что разница именно в вызовах.

В первом случае идёт вызов function(), которая помечена CommandMethod (кстати говоря, с Session -- это точно помню). Из этой команды уже вызывается некий третий метод, который использует Application.DocumentManager.AppContextOpenDocument("fileName");
А во втором случае вызывается также function(), но в другом проекте и без помеченного CommandMethod (то бишь обычная функция). Эта функция вызывает абсолютно тот же третий метод, но вот там уже как раз ошибка, где происходит Application.DocumentManager.AppContextOpenDocument("fileName");

Пытался добавить CommandMethod для второй function(), но не получилось, так как он в упор не хотел видеть ссылки на подключенные библиотеки. То есть ссылки сами добавил, но он никакого Autodesk.* и знать не хочет. :)

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Здравствуйте.

Столкнулся со следующей проблемой -- у меня есть открытие чертежа, оно происходит так:
1. Открываем в плагине некую БД.
2. Появляется окно с пользовательским интерфейсом, где можно выбрать чертеж.
3.1. После выбора конкретного чертежа его можно скачать (и сохранить на компьютере в некоторой папке). В данном случае всё отрабатывает корректно. Вызывается некая команда с CommandMethod, из которой уже вызывается в дальнейшем метод открытия и сохранения чертежа.
Но после второго пункта может пойти и другой вариант развития событий:
3.2. Открываем историю чертежа -- тут появится ещё одно окошко, которое будет уже содержать историю изменения чертежа. Когда мы хотим скачать какую-либо из версий, то вылетает исключение eFileError (хотя сохранение пройдёт успешно, ошибку выдаёт именно открытие его в AutoCAD/Civil). Это всё происходит для одного и того же чертежа, так что проблема вряд ли в версии, в которой он сохранен. Но теперь же в цепочке методов, ведущих к открытию чертежа и его сохранению, не будет команды с CommandMethod. Появилось подозрение, что ошибка в этом (хоть это и не однозначно), однако "впихнуть" CommandMethod просто так не получится.

Что можете посоветовать в сложившейся ситуации?

Так что точно делается? Открытие или скачивание чертежа? Или сначала скачивание, а потом открытие? Что за истории чертежа, как реализованы? Используется MVVM паттерн?

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Так что точно делается?
Смотрите, насколько я разобрался в коде (а проект не мой), мы обращаемся к базе данных -- там лежат различные чертежи, некоторые из чертежей имеют несколько версий (та самая история, но как именно реализована не смогу подсказать, в эту сторону не копал). Мы скачиваем сначала из этой самой БД чертеж, сохраняем его в некотором месте на диске, а уже после открываем (путь, по которому мы открываем, корректный, проверял).
MVVM используется, да.

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
MVVM используется, да.
99% из-за него вылетает эта ошибка.

Как вызывается окно? ShowModalDialog или ShowModelessDialog?

Вот моя тема, когда я столкнулся с данной проблемой https://adn-cis.org/forum/index.php?topic=10569.0

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Как вызывается окно? ShowModalDialog или ShowModelessDialog?
Пока не смогу ответить наверняка, но... Интересная мысль, я в эту сторону и не думал копать. Посмотрю завтра, как появится доступ к коду.

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 379
  • Карма: 21
Как вызывается окно? ShowModalDialog или ShowModelessDialog?
Пока не смогу ответить наверняка, но... Интересная мысль, я в эту сторону и не думал копать. Посмотрю завтра, как появится доступ к коду.
Скорей всего окно нужно будет вызывать через ShowModelessDialog или вызов/закрытие окна/работу команды делить на 2/3 части (в зависимости от того как регистрируется команда).

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 1
Lemieux, прочитал топик с Вашей проблемой, весьма любопытно. Тоже попробую проверить открытие/закрытие, ибо тоже подозреваю в этом некоторую проблему, ибо в первом UI окне всё нормально отрабатывает же, а когда в нём открываем историю (появляется второе уже окно) и скачиваем, то тут уже ошибки.

А вот про делить 2/3 части не совсем понял.