Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: bargool от 31-01-2014, 17:50:50

Название: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: bargool от 31-01-2014, 17:50:50
Если в контексте приложения попытаться закрыть не текущий документ - вываливается ошибка 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"
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Александр Ривилис от 31-01-2014, 18:11:06
Если в контексте приложения попытаться закрыть не текущий документ
Судя по коду ты пытаешься закрыть как раз текущий документ.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: bargool от 31-01-2014, 19:49:45
Nonono
При вызове
Код - C# [Выбрать]
  1. documents.Open(path, false);
текущим становится вновь открытый документ
Как раз, если я после открытия документа добавлю
Код - C# [Выбрать]
  1. documents.MdiActiveDocument = currentDWG
то закрытие пройдёт нормально
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Александр Ривилис от 31-01-2014, 20:50:20
то закрытие пройдёт нормально
Ну значит так и придется делать:
Код - 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 моделью и закрытием документа с её помощью, но получил в конечном итоге тоже исключение.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Андрей Бушман от 31-01-2014, 21:29:03
Ну значит так и придется делать:
Кривоватый способ, не находите? Не плохо было бы сообщить в ADN.

UPD Кстати, я тоже сталкивался с этим несколько лет назад в 2009-м акаде и в качестве решения сделал именно так, как вы предложили. Точно не помню, но в ADN я это кажется не отправлял.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Александр Ривилис от 31-01-2014, 21:31:18
Кривоватый способ, не находите? Не плохо было бы сообщить в ADN.
Нахожу. Пока еще экспериментирую. Если не найду лучшего решения - обязательно сообщу.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: bargool от 31-01-2014, 22:58:09
я тоже сталкивался с этим несколько лет назад в 2009-м акаде
Странно, в 2010-м автокаде у меня код наподобие как из заглавного сообщения работал прекрасно. Т.е. там эта ошибка не наблюдалась
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Андрей Бушман от 31-01-2014, 23:06:49
Странно, в 2010-м автокаде у меня код наподобие как из заглавного сообщения работал прекрасно. Т.е. там эта ошибка не наблюдалась
Я в основном пишу под 2009-й, хотя раньше на вирт. машинке были установлены все от 2009-го и выше (для комиляции и тестирования). Может я не и не в 2009-м это наблюдал - в понедельник проверю в нём. Сейчас под рукой автокада нет.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: fattyhallex от 03-02-2014, 00:33:31
А если так попробовать у меня в 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.  }
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Андрей Бушман от 03-02-2014, 11:24:44
Я в основном пишу под 2009-й, хотя раньше на вирт. машинке были установлены все от 2009-го и выше (для комиляции и тестирования). Может я не и не в 2009-м это наблюдал - в понедельник проверю в нём. Сейчас под рукой автокада нет.
Память меня всё-таки не подвела: код, обозначенный в первом сообщении темы выдаёт ошибку и в AutoCAD 2009 SP3.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: bargool от 03-02-2014, 11:44:01
А если так попробовать у меня в 2010-м и в 2014-м закрывает
Зачем так много и сложно?
Если переключаться на закрываемый документ (что в итоге и делает твой код), то можно просто сделать как уже Александр написал в #3
Андрей Бушман, странно..
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: fattyhallex от 04-02-2014, 09:46:51
Этот код выдает то же исключение "Drawing is busy" в 2014-м.
После тщательной проверки мой пример тоже не работает,
не пойму в чем дело, до этого проверял много раз и все было
нормально.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Андрей Бушман от 04-02-2014, 09:50:53
не пойму в чем дело, до этого проверял много раз и все было
нормально.
Чудес не бывает. Скорее всего либо код, "проверяемый много раз", всё же был несколько иным, либо "проверка" была фиктивной...
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Александр Ривилис от 04-02-2014, 10:15:33
На поведение может влиять значение системной переменной FIBERWORLD
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: fattyhallex от 04-02-2014, 10:24:45
По барабану - это не влияет, скорее надо ставить DBMOD=1
для Drawing1, дальше активизировать открытый заново документ
тут еще много вариантов но пока не получается...
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Александр Ривилис от 06-02-2014, 14:24:42
Передал информацию в ADN DevHelp. Ждем ответа.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Александр Ривилис от 06-02-2014, 18:57:06
Получил ответ. Он на 100% повторяет #3 (http://adn-cis.org/forum/index.php?topic=500.msg1555#msg1555) с уточнением, что это единственная возможность избежать исключения.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: fattyhallex от 06-02-2014, 22:05:37
Очень рад, но уменя вываливается сообщение
"Drawing is busy"в примере из #3...
При любом значении NEXTFIBERWORLD  0 или 1
:(
Интересно, несколько раз переключил Nextfiberworld
с 1 на 0, и теперь работает нормально...
Никто не пробовал повторить?
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: bargool от 06-02-2014, 22:41:00
У меня сразу нормально работал вариант как в #3
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: fattyhallex от 06-02-2014, 22:42:14
Спасибо :)
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Александр Ривилис от 07-02-2014, 02:16:35
Спасибо :)
Олег. У меня это не воспроизводится. Если у тебя есть возможность записать видео с этой ошибкой в AutoCAD 2014 (в другой версии проверять нет смысла) - сделай. Я передам в Autodesk - пусть разбираются. Если нет - увы. Ничем помочь не смогу.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Андрей Бушман от 07-02-2014, 08:48:06
У меня это не воспроизводится.

Неработоспособность кода из #3 на моей машинке (Windows 7 x64) подтверждаю:

- AutoCAD 2009 Enu SP3 x64
- AutoCAD 2014 Enu SP1 x64

FIBERWORLD = 0 (read only).

В разных версиях AutoCAD сообщение об ошибке наблюдаю разное (скрины прилагаются). Компилировал в MS VS 2012 с настройкой AnyCPU.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Дмитрий Загорулькин от 07-02-2014, 10:36:12
Проверил код из #3 на:
AutoCAD 2014 Rus x64 (без SP)
AutoCAD Civil 3D 2014 Rus SP1 x64
AutoCAD Civil 3D 2014 Rus SP1 x64 as AutoCAD
Никаких ошибок. Текущий закрывает, указанный открывает.

Windows 7 SP1 Professional Rus x64

FIBERWORLD = 1 (только чтение)
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: fattyhallex от 07-02-2014, 10:50:00
Если нет - увы.
Извини Александр, не хочу ставить никаких программ, временно на
компьютере сына по причине заливки кипятком соседями сверху,
значит увы :)
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Дмитрий Загорулькин от 07-02-2014, 11:07:20
Можно практически без установки каких-то программ. Рекламировать не буду, через поисковик можно найти "запись видео с экрана онлайн" :)
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Андрей Бушман от 07-02-2014, 15:07:20
Проверил код из #3 на:
AutoCAD 2014 Rus x64 (без SP)
AutoCAD Civil 3D 2014 Rus SP1 x64
AutoCAD Civil 3D 2014 Rus SP1 x64 as AutoCAD
Никаких ошибок. Текущий закрывает, указанный открывает.

Windows 7 SP1 Professional Rus x64

UPD  После назначения переменной NEXTFIBERWORLD значения равного 1, нужно перезагружать AutoCAD. После перезагрузки AutoCAD значение FIBERWORLD уже будет равно 1 (read only) и при работе кода #3 ошибка более не возникает.

UPD2 Дополнительная информация: когда при FIBERWORLD = 0 (read only) возникает исключение, то в автокаде приходится нажимать несколько раз Esc, иначе всё висит. После того, как несколько раз нажимаю Esc, автокад временами тихо умирает (без каких-либо сообщений).

Если вернуть значение 0, то после перезагрузки акада ошибка снова появляется.

P.S. Кстати, в 2009-м акаде FIBERWORLD нет... :(
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Александр Ривилис от 08-02-2014, 04:57:17
Кстати, в 2009-м акаде FIBERWORLD нет... :(
NEXTFIBERWORLD и FIBERWORLD появились в AutoCAD 2011 и до сих пор недокументированные, так как используются только программистами для отладки программ. Связано это с дефектами отладчика Microsoft Visual Studio, который плохо работает с фиберами и не в состоянии ловить точки останова внутри форм, которые работают внутри фиберов:

Точки останова в пользовательской форме не обрабатываются при отладке .NET - приложения для AutoCAD 2012 в Visual Studio 2010 (http://adn-cis.org/tochki-ostanova-v-polzovatelskoj-forme-ne-obrabatyivayutsya-pri-otladke.html)

С другой стороны сам AutoCAD очень некорректно работает в отсутствии фиберов. Особенно это проявляется при переключении документов, работе с Лентой и т.п. Так что нужно максимально быстро переключаться в режим FIBERWORLD = 1.

P.S.: Андрей! Спасибо что подтвердил моё предположение о причине этой ошибки.

Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Андрей Бушман от 08-02-2014, 09:54:04
NEXTFIBERWORLD и FIBERWORLD появились в AutoCAD 2011 и до сих пор недокументированные, так как используются только программистами для отладки программ. Связано это с дефектами отладчика Microsoft Visual Studio, который плохо работает с фиберами и не в состоянии ловить точки останова внутри форм, которые работают внутри фиберов
Это всё, конечно, здорово, но меня интересует, как решить проблему именно в AutoCAD 2009? Может быть до FIBERWORLD всё же существовали какие-то способы, так же не документированные?

Как хотя бы узнать, включены они у меня в 2009-м или выключены? А то может в 2009-м и не в них дело (текст сообщения об ошибке ведь другой)...
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Александр Ривилис от 08-02-2014, 21:40:53
Это всё, конечно, здорово, но меня интересует, как решить проблему именно в AutoCAD 2009? Может быть до FIBERWORLD всё же существовали какие-то способы, так же не документированные?

Как хотя бы узнать, включены они у меня в 2009-м или выключены? А то может в 2009-м и не в них дело (текст сообщения об ошибке ведь другой)...

В 2009-ом фиберы включены (т.е. эквивалент FIBERWORLD = 1). Можешь попробовать закрывать чем ActiveX/COM - я проверить не могу, т.к. именно 2009-ая версия у меня не установлена.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: SatanaXIII от 25-10-2018, 10:34:22
Автокад 2018. Код из поста №3 не работает. Не зависимо от состояния переменной FIBERWORLD.
Попытка изменить значение переменной NEXTFIBERWORLD заканчивается исключением: "Autodesk.AutoCAD.Runtime.Exception: eInvalidInput".
При чем и FIBERWORLD и NEXTFIBERWORLD установлены изначально в ноль.
Не получатся закрыть открытый документ. Бросает исключение, что документ занят.
Код - C# [Выбрать]
  1. var FIBERWORLD      = Application.TryGetSystemVariable("FIBERWORLD"); // 0
  2. var NEXTFIBERWORLD  = Application.TryGetSystemVariable("NEXTFIBERWORLD"); // 0
  3. Application.SetSystemVariable("FIBERWORLD", 1/*0*/);
  4.  
  5. DocumentCollection documents = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
  6. Document currentDWG = documents.MdiActiveDocument;
  7. string path = @"C:\Temp\TestCreate.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.  
  14. Application.SetSystemVariable("FIBERWORLD", /*1*/0);
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Александр Ривилис от 25-10-2018, 10:47:48
Автокад 2018. Код из поста №3 не работает. Не зависимо от состояния переменной FIBERWORLD.
В AutoCAD 2018 уже нет FIBERWORLD. Точнее она всегда соответствует 0.
Код работает в контексте приложения или в контексте документа?
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Дмитрий Загорулькин от 25-10-2018, 10:54:44
Перечитайте внимательно сообщения 25 и 26 из этой темы и больше никогда в коде не пытайтесь менять значения этих переменных. Ну и начиная с версии 2015 эти переменные не работают - фиберов в Автокаде больше нет
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: SatanaXIII от 25-10-2018, 14:56:50
В AutoCAD 2018 уже нет FIBERWORLD. Точнее она всегда соответствует 0.
А еще точнее nil, который приводится к нулю (прошу прощения за буквоедство). Если попробовать получить значение переменной, которой никогда не существовало, то результат будет тот же.
больше никогда в коде не пытайтесь менять значения этих переменных
Имеется в виду именно этих переменных или основной посыл в том, что в коде менять значения системных переменных чем-либо чревато?
Код работает в контексте приложения или в контексте документа?
В контексте документа, если я правильно понимаю (вызов происходит непосредственно в теле выполняемой команды). Пробовал оборачивать вызов в функцию ExecuteInApplicationContext, но результат тот же.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Александр Ривилис от 25-10-2018, 15:05:07
А еще точнее nil, который приводится к нулю (прошу прощения за буквоедство). Если попробовать получить значение переменной, которой никогда не существовало, то результат будет тот же.
Именно так. Этой переменной уже нет.
Имеется в виду именно этих переменных или основной посыл в том, что в коде менять значения системных переменных чем-либо чревато?
Одну из этих переменных вообще нельзя менять (она "read-only"). Вторая отрабатывает только после перезапуска AutoCAD, так что в коде нет смысла её менять.

В контексте документа, если я правильно понимаю (вызов происходит непосредственно в теле выполняемой команды).
В контексте документа работать и не будет. Нужно добавить команде флаг CommandFlags.Session
как сделано здесь: http://adn-cis.org/forum/index.php?topic=500.msg1555#msg1555
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: Дмитрий Загорулькин от 25-10-2018, 15:45:19
Имеется в виду именно этих переменных или основной посыл в том, что в коде менять значения системных переменных чем-либо чревато?
Именно этих, Александр Наумович выше объяснил почему.
Название: Re: AutoCAD 2014 в контексте приложения отказывается закрывать фоновый документ
Отправлено: SatanaXIII от 26-10-2018, 11:35:13
В контексте документа работать и не будет. Нужно добавить команде флаг CommandFlags.Session
как сделано здесь
С флагом заработало.
Александр Ривилис, Дмитрий Загорулькин, большое спасибо.