AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ

Автор Тема: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ  (Прочитано 24601 раз)

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

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Если в контексте приложения попытаться закрыть не текущий документ - вываливается ошибка Drawing is busy
Код:
Код - C# [Выбрать]
  1. [CommandMethod("test", CommandFlags.Session)]
  2. public void test()
  3. {
  4.         DocumentCollection documents = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
  5.         Document currentDWG = documents.MdiActiveDocument;
  6.         string path = @"c:\temp\test.dwg";
  7.         documents.Open(path, false);
  8.         currentDWG.CloseAndDiscard();
  9. }
Открываем автокад, у нас есть текущий документ, потом запускаем команду, и получаем ошибку "Drawing is busy"
Алексей

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

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

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Nonono
При вызове
Код - C# [Выбрать]
  1. documents.Open(path, false);
текущим становится вновь открытый документ
Как раз, если я после открытия документа добавлю
Код - C# [Выбрать]
  1. documents.MdiActiveDocument = currentDWG
то закрытие пройдёт нормально
Алексей

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
то закрытие пройдёт нормально
Ну значит так и придется делать:
Код - C# [Выбрать]
  1. [CommandMethod("test1", CommandFlags.Session)]
  2. public static void test1()
  3. {
  4.   DocumentCollection documents =
  5.     Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
  6.   Document currentDWG = documents.MdiActiveDocument;
  7.   string path = @"c:\temp\test.dwg";
  8.   Document newDoc = documents.Open(path, false);
  9.   documents.MdiActiveDocument = currentDWG;
  10.   currentDWG.CloseAndDiscard();
  11.   documents.MdiActiveDocument = newDoc;
  12.   Document activeDWG = documents.MdiActiveDocument;
  13. }

Я поэкспериментировал еще с ActiveX/COM моделью и закрытием документа с её помощью, но получил в конечном итоге тоже исключение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Ну значит так и придется делать:
Кривоватый способ, не находите? Не плохо было бы сообщить в ADN.

UPD Кстати, я тоже сталкивался с этим несколько лет назад в 2009-м акаде и в качестве решения сделал именно так, как вы предложили. Точно не помню, но в ADN я это кажется не отправлял.

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

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

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
я тоже сталкивался с этим несколько лет назад в 2009-м акаде
Странно, в 2010-м автокаде у меня код наподобие как из заглавного сообщения работал прекрасно. Т.е. там эта ошибка не наблюдалась
Алексей

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Странно, в 2010-м автокаде у меня код наподобие как из заглавного сообщения работал прекрасно. Т.е. там эта ошибка не наблюдалась
Я в основном пишу под 2009-й, хотя раньше на вирт. машинке были установлены все от 2009-го и выше (для комиляции и тестирования). Может я не и не в 2009-м это наблюдал - в понедельник проверю в нём. Сейчас под рукой автокада нет.

Оффлайн fattyhallex

  • ADN Club
  • Сообщений: 16
  • Карма: 0
А если так попробовать у меня в 2010-м и в 2014-м закрывает
(имя файла измени):
Код - C# [Выбрать]
  1. [CommandMethod("tda", CommandFlags.Session)]
  2. public void testCloseActiveDocument()
  3. {
  4.     Document cdoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.     DocumentCollection mgr = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
  6.     mgr.DocumentBecameCurrent += new DocumentCollectionEventHandler(mgr_DocumentBecameCurrent);
  7.     string path = @"c:\test\blocks.dwg";
  8.     Document doc = mgr.Open(path, false) ;
  9.     if (mgr.MdiActiveDocument != doc)
  10.     {
  11.         mgr.MdiActiveDocument = doc;
  12.     }
  13.     Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog(doc.Name);
  14.     Autodesk.AutoCAD.Internal.Utils.CancelAndRunCmds(string.Format("{0} {1}", "_close", "_n"));
  15.     Autodesk.AutoCAD.Internal.Utils.PostCommandPrompt();
  16.     doc.CloseAndDiscard();
  17.     mgr.DocumentBecameCurrent -= new DocumentCollectionEventHandler(mgr_DocumentBecameCurrent);
  18.  }
  19.  
  20.  static void mgr_DocumentBecameCurrent(object sender, DocumentCollectionEventArgs e)
  21.  {
  22.      DocumentCollection mgr = (DocumentCollection)sender;
  23.      Document doc = mgr.MdiActiveDocument;
  24.  }
« Последнее редактирование: 03-02-2014, 00:46:43 от Александр Ривилис »

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Я в основном пишу под 2009-й, хотя раньше на вирт. машинке были установлены все от 2009-го и выше (для комиляции и тестирования). Может я не и не в 2009-м это наблюдал - в понедельник проверю в нём. Сейчас под рукой автокада нет.
Память меня всё-таки не подвела: код, обозначенный в первом сообщении темы выдаёт ошибку и в AutoCAD 2009 SP3.

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

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
А если так попробовать у меня в 2010-м и в 2014-м закрывает
Зачем так много и сложно?
Если переключаться на закрываемый документ (что в итоге и делает твой код), то можно просто сделать как уже Александр написал в #3
Андрей Бушман, странно..
Алексей

Оффлайн fattyhallex

  • ADN Club
  • Сообщений: 16
  • Карма: 0
Этот код выдает то же исключение "Drawing is busy" в 2014-м.
После тщательной проверки мой пример тоже не работает,
не пойму в чем дело, до этого проверял много раз и все было
нормально.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
не пойму в чем дело, до этого проверял много раз и все было
нормально.
Чудес не бывает. Скорее всего либо код, "проверяемый много раз", всё же был несколько иным, либо "проверка" была фиктивной...

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

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

Оффлайн fattyhallex

  • ADN Club
  • Сообщений: 16
  • Карма: 0
По барабану - это не влияет, скорее надо ставить DBMOD=1
для Drawing1, дальше активизировать открытый заново документ
тут еще много вариантов но пока не получается...