Что такое "функция открытия чертежа"?Если правильно понимаю вопрос, то попробую подробнее объяснить ситуацию: этих функций даже две. Изначально стояла:
Application.DocumentManager.Open("fileName");Как минимум этот код нужно выполнять из контекста приложения (т.е., если это команда, то с флагом Session). И если открыт модальный диалог, то его нужно закрыть - иначе не сработает. Ну и DocumentActivationEnabled = true;
Она также выдавала ошибку, мол, контекст не существует.А ты случайно не пытаешься открыть чертеж из отдельного потока (Task)? Если да, то так делать нельзя - открывать нужно только из главного потока.
А ты случайно не пытаешься открыть чертеж из отдельного потока (Task)?Если честно, то сейчас по памяти сказать не могу (доступа к репозиторию на домашнем ПК, увы, нет), но, по-моему, всё же не вызывается из отдельного потока (но проверю обязательно эту версию). Но тогда небольшой вопрос: если бы это вызывалось из отдельного потока и "ломалось", то разве и в первом случае не было бы тогда ошибки?
то разве и в первом случае не было бы тогда ошибки?Извини, но я не понял разницу между первым и вторым.
разницу между первым и вторымХм. Я бы сказал, что разница именно в вызовах.
Здравствуйте.
Столкнулся со следующей проблемой -- у меня есть открытие чертежа, оно происходит так:
1. Открываем в плагине некую БД.
2. Появляется окно с пользовательским интерфейсом, где можно выбрать чертеж.
3.1. После выбора конкретного чертежа его можно скачать (и сохранить на компьютере в некоторой папке). В данном случае всё отрабатывает корректно. Вызывается некая команда с CommandMethod, из которой уже вызывается в дальнейшем метод открытия и сохранения чертежа.
Но после второго пункта может пойти и другой вариант развития событий:
3.2. Открываем историю чертежа -- тут появится ещё одно окошко, которое будет уже содержать историю изменения чертежа. Когда мы хотим скачать какую-либо из версий, то вылетает исключение eFileError (хотя сохранение пройдёт успешно, ошибку выдаёт именно открытие его в AutoCAD/Civil). Это всё происходит для одного и того же чертежа, так что проблема вряд ли в версии, в которой он сохранен. Но теперь же в цепочке методов, ведущих к открытию чертежа и его сохранению, не будет команды с CommandMethod. Появилось подозрение, что ошибка в этом (хоть это и не однозначно), однако "впихнуть" CommandMethod просто так не получится.
Что можете посоветовать в сложившейся ситуации?
Так что точно делается?Смотрите, насколько я разобрался в коде (а проект не мой), мы обращаемся к базе данных -- там лежат различные чертежи, некоторые из чертежей имеют несколько версий (та самая история, но как именно реализована не смогу подсказать, в эту сторону не копал). Мы скачиваем сначала из этой самой БД чертеж, сохраняем его в некотором месте на диске, а уже после открываем (путь, по которому мы открываем, корректный, проверял).
MVVM используется, да.99% из-за него вылетает эта ошибка.
Как вызывается окно? ShowModalDialog или ShowModelessDialog?Пока не смогу ответить наверняка, но... Интересная мысль, я в эту сторону и не думал копать. Посмотрю завтра, как появится доступ к коду.
Скорей всего окно нужно будет вызывать через ShowModelessDialog или вызов/закрытие окна/работу команды делить на 2/3 части (в зависимости от того как регистрируется команда).Как вызывается окно? ShowModalDialog или ShowModelessDialog?Пока не смогу ответить наверняка, но... Интересная мысль, я в эту сторону и не думал копать. Посмотрю завтра, как появится доступ к коду.
А вот про делить 2/3 части не совсем понял.У меня команда в САПРе регистрируется через Utils.AddCommand();
Цитата: Lis от 13-08-2022, 18:50:37Ух ты, а почему именно из-за MVVM?
MVVM используется, да.
99% из-за него вылетает эта ошибка.
Цитата: Lis от 13-08-2022, 18:50:37Ух ты, а почему именно из-за MVVM?
MVVM используется, да.
99% из-за него вылетает эта ошибка.
Может, проблема не в паттерне, а в том, как именно был "переписан" код? Потому как у меня как минимум несколько проектов нормально работают в MVVM. Правда, без асинхронщины. Ну и интерфейсы с делегатами в полный рост используются.Цитата: Lis от 13-08-2022, 18:50:37Ух ты, а почему именно из-за MVVM?
MVVM используется, да.
99% из-за него вылетает эта ошибка.
Точно не скажу. Я столкнулся с этой проблемой только тогда когда стал переписывать весь код на MVVM. То, что работало с codebehind, перестало работать с MVVM. Пришлось переделывать подход к работе с окнами и новыми файлами.
Новые документы добавляются в коллекцию документов, во время работы окна?Может, проблема не в паттерне, а в том, как именно был "переписан" код? Потому как у меня как минимум несколько проектов нормально работают в MVVM. Правда, без асинхронщины. Ну и интерфейсы с делегатами в полный рост используются.Цитата: Lis от 13-08-2022, 18:50:37Ух ты, а почему именно из-за MVVM?
MVVM используется, да.
99% из-за него вылетает эта ошибка.
Точно не скажу. Я столкнулся с этой проблемой только тогда когда стал переписывать весь код на MVVM. То, что работало с codebehind, перестало работать с MVVM. Пришлось переделывать подход к работе с окнами и новыми файлами.
несмотря на некоторые асинхронные сортировкиЧто за асинхронные сортировки?
открываются через Application.ShowModalWindow(window)Попробуй заменить на ShowModelessWindow()
Что за асинхронные сортировки?Некто из других разработчиков сделал метод, где сортирует из бд записи по признаку (так как не все записи доступны могут быть пользователю).
Попробуй заменить на ShowModelessWindow()А вот как раз попробовал, что интересно -- это даже принесло свои плоды, так как теперь из окошка истории действительно можно сохранять без проблем, однако вызывается первое окошко из команды и почему-то прогрузка завершается только после того, как команда полностью завершит своё выполнение. Это не очень хорошо, у ShowModalWindow такого не наблюдается.
Вызов Show... стоит в return'еИнтересное решение.
Некто из других разработчиков сделал метод, где сортирует из бд записи по признакуЧто-то мне подсказывает, что код работает синхронно. Этот разработчик не тестировал работу плагина/модуля/команды?
В принципе можно, наверное, сделать публичное свойство bool? ShowResult, с приватным set'ом.У меня своё кастомное окно так сделано, которое имитирует окно палитры, в котором уже хостятся UserControl.
А вот когда мы открываем историю и уже из неё выбираем какую-либо версию для той же операции, то закрывается только модальное окно истории, а вот первое модальное окно остаётся в том же состоянии, в котором и было.Вот об этом я и говорил. Открытое модальное окно препятствует переключению документов.
Открытое модальное окно препятствует переключению документов.Вы были правы. :)