2015-02-13 1 views
1

Я работаю в AutoCAD 2014 с помощью Visual Studio 2013.Почему MdiActiveDocument null в начале в AutoCAD 2015+?

С моим кодом я обращаюсь к базе данных MdiActiveDocument из DocumentManager.

Использование базы данных Я начинаю транзакцию и использую метод GetObject транзакции для извлечения объектов Entity.

  Database acCurDb = Application.DocumentManager.MdiActiveDocument.Database; 
      using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) 
      { 
       var obj = acTrans.GetObject(id, OpenMode.ForRead); 
       if (obj is Entity) 
       { 
        // do stuff 
       } 

       acTrans.Commit(); 
      } 

Это прекрасно работает, пока я нахожусь в разработке и запускаю AutoCAD изнутри Visual Studio. В разработке я установил переключатель «Запустить внешнюю программу» на вкладке «Отладка» свойств приложения, чтобы он запускал AutoCAD для меня, и все работает отлично.

Проблема, с которой я столкнулся, заключается в том, что при загрузке приложения AutoCAD через настройки реестра (я использую загрузку по требованию) MdiActiveDocument имеет значение null, поэтому код выходит из строя. Я обнаружил, что есть документ в Application.DocumentManager, но когда я назначаю базу данных из этого документа в acCurDb, TransactionManager вызывает ошибку, я пытаюсь использовать метод StartTransaction.

   if (Application.DocumentManager.Count > 0) 
       { 
        foreach(Document doc in Application.DocumentManager) 
        { 
         acCurDb = doc.Database; 
         break; 
        } 
       } 

       using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) 
       { 

       } 

Может кто-то помочь мне понять, почему MdiActiveDocument является недействительным и/или направить меня на правильный способ, чтобы получить объект транзакции в AutoCAD?

ответ

1

Начиная с 2015 года, AutoCAD может иметь нулевой активный документ при запуске в зависимости от пользовательских системных переменных. Это просто еще одна проверка, которую вы должны добавить перед запуском вашей программы.

+0

Хорошо спасибо за это. Есть ли у вас какие-либо идеи о том, как я сам загружаю MdiActiveDocument или как обойти это? Также я не упомянул, но я работаю в AutoCAD 2014. Я отредактирую свой вопрос и поставлю его. –

+0

Я считаю, что в диспетчере документов есть открытый метод. –

0

Как уже упоминалось @ david-wolfe, AutoCAD 2015 может начинаться без активного документа (только приборной панели). В этом случае MdiActiveDocument может быть нулевым.

Теперь вы находитесь на AutoCAD 2014, поэтому может произойти другой сценарий: если ваше приложение загружается с помощью AutoCAD, код может запускаться до того, как что-либо действительно будет готово. Как вы используете код? Это CommandMethod? Если это команда, пользователь может запускать ее только из команды, поэтому она будет активным документом. Но если вы запустите его из другого метода (например, прямой вызов из ленты или из палитры), он может быть нулевым.