WedX - журнал о программировании и компьютерных науках

Не удается инициализировать окно WPF из Revit ExternalCommand

Я делаю надстройку Revit, которая откроет окно WPF для взаимодействия с пользователем. Я следовал примеру немодального диалога в SDK. Я сделал свою программу по шаблону MVVM. Однако отладка программы продолжала вызывать исключение на этапе ExternalCommand: "ссылка на объект не указывает на экземпляр объекта", класс ExternalCommand выглядит следующим образом:

[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
class RevitCommand : IExternalCommand
{        
    public virtual Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        try
        {
            ThisApplication.thisApp.ShowWindow(commandData.Application);

            return Result.Succeeded;
        }
        catch (Exception ex)
        {
            message = ex.Message;
            return Result.Failed;
        }
    }
}

В то время как класс ExternalApplication:

    public class ThisApplication : IExternalApplication
{
    //Class instance
    internal static ThisApplication thisApp;

    //Modeless instance
    private MainWindow m_MainWindow;

    public Result OnShutdown(UIControlledApplication application)
    {
        if (m_MainWindow != null && m_MainWindow.IsVisible)
        {
            m_MainWindow.Dispose();
        }
        return Result.Succeeded;
    }

    public Result OnStartup(UIControlledApplication application)
    {
        m_MainWindow = null;   // no dialog needed yet; the command will bring it
        thisApp = this;  // static access to this application instance
        return Result.Succeeded;
    }

    public void ShowWindow(UIApplication uiapp)
    {
        // If we do not have a dialog yet, create and show it
        if (m_MainWindow == null )
        {
            RequestHandler handler = new RequestHandler();
            ExternalEvent exEvent = ExternalEvent.Create(handler);
            MyViewModel vmod = new MyViewModel(exEvent,handler);
            m_MainWindow = new MainWindow();                
            m_MainWindow.DataContext = vmod;
            m_MainWindow.Show();
        }
    }

}

Я подозреваю, что было создано исключение, поскольку thisApp имеет значение null, но пример в SDK работает нормально. Единственное отличие состоит в том, что они использовали WinForm вместо WPF, а ExternalEvent передается в представление вместо модели представления.

25.08.2018

  • В какой строке трассировка стека исключений показывает, из чего возникло исключение? 25.08.2018
  • Я предполагаю, что ThisApplication.thisApp равно нулю. Вы уверены, что ваш метод ThisApplication.OnStartup вызывается до вашего метода RevitCommand.Execute? 25.08.2018
  • Да, «ThisApplication.OnStartup» никогда не вызывался, исключение «ExternalCommand» выбрасывается сразу. 25.08.2018

Ответы:


1

оказалось, что мое подозрение верно, thisApp, будучи нулевым, действительно заставил Revit выдать исключение, чтобы исправить это, я инициирую новый экземпляр класса thisApplication, а затем вызываю метод ShowWindow. и он делает то, что я ожидал.

public virtual Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        try
        {
            new ThisApplication().ShowWindow(commandData.Application);

            return Result.Succeeded;
        }
        catch (Exception ex)
        {
            message = ex.Message;
            return Result.Failed;
        }
    }

Спасибо @Dai за ваше предложение.

25.08.2018
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]