Закрытие чертежа - "чертеж занят"?

Автор Тема: Закрытие чертежа - "чертеж занят"?  (Прочитано 7175 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Наверное вопрос легкий (Autocad 2014), но я не знаю как правильно:

При открытии чертежа проверяю "учебную версию" если учебная хочу сразу закрыть - но вываливается ошибка "чертеж занят". как правильно закрыть чертеж, ну или оно чтобы дождалось (как освободился чертеж" и закрыло. Делаю так:
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.ApplicationServices.Document dwgopen = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  2. bool pr=dwgopen.Database.IsEmr;
  3. if (pr)
  4. dwgopen.CloseAndDiscard();
  5.  
Как закрыть чертеж?
« Последнее редактирование: 17-11-2017, 16:32:19 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #1 : 17-11-2017, 16:35:18 »
1. Пожалуйста прочитай у меня в подписи как следует форматировать код на форуме и в дальнейшем соблюдай это правило.
2. В каком контексте ты пытаешься закрыть документ? Это событие открытия документа или команда? И еслиа команда то контекста документа или контекста приложения?
Слишком мало информации.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #2 : 17-11-2017, 16:47:17 »
Простейший вариант - затолкай в консоль команду Close. Когда сможет тогда и выполнится.

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #3 : 17-11-2017, 18:57:15 »
при автозагрузке одного из лисп вызывается команда через командную строку:
Код - Auto/Visual Lisp [Выбрать]
  1. (command "checkuv")
А до этого загружается dll на c#, типо что то такого:
Код - C# [Выбрать]
  1. public class Main : IExtensionApplication
  2.     {
  3. //.........
  4.  
  5.         [CommandMethod("checkuv")]
  6.         public void checkuv()
  7.         {
  8. //ну и впринципе сам код который писался ранее
  9. Autodesk.AutoCAD.ApplicationServices.Document dwgopen = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  10. bool pr=dwgopen.Database.IsEmr;
  11. if (pr)
  12. dwgopen.CloseAndDiscard();
  13.          }
  14.  
  15. //.........
  16. }

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #4 : 17-11-2017, 19:41:24 »
Для начала попробуй заменить:
Код - C# [Выбрать]
  1. [CommandMethod("checkuv")]
на
Код - C# [Выбрать]
  1. [CommandMethod("checkuv",CommandFlags.Session)]
Еще вариант с использованием COM/ActiveX здесь: http://adndevblog.typepad.com/autocad/2012/05/closing-drawing-file-without-saving.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #5 : 17-11-2017, 22:03:22 »
Не помогло, не то не другое:
при загрузке автокада и запуска отдельно команды, оно срабатывает.
Но при загрузке команды через лисп - оно выдает ошибку и аварийно закрывается


как и предложение avc правда не в консоль а в командную строку close
Код - C# [Выбрать]
  1. dwgop.SendStringToExecute("(command \"_close\")\n", true, false, false);
- все тоже аварийное закрытие автокада

//без флага CommandFlags.Session простой способ закрытия выбивал ошибку, но не фатальную...

___________
а есть ли событие завершение открытие загрузки чертежа? = просто у меня подозрение, что оно просто не загружает доконца чертеж = т.е в него еще грузятся лиспы и длл ====и мы пытаемся закрыть его, хоть он еще не загрузился?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #6 : 18-11-2017, 00:16:16 »
а есть ли событие завершение открытие загрузки чертежа? = просто у меня подозрение, что оно просто не загружает доконца чертеж = т.е в него еще грузятся лиспы и длл ====и мы пытаемся закрыть его, хоть он еще не загрузился?
Такого события в чистом виде нет. И в любом случае из события закрыть чертеж ты не сможешь - в лучшем случае сможешь запустить команду на закрытие. Вариант с COM\ActiveX уже проверил?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #7 : 18-11-2017, 00:19:03 »
И в любом случае из события закрыть чертеж ты не сможешь
Вы имеете в виду события документа? Может быть, стоит попробовать сделать это в Application.Idle?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #8 : 18-11-2017, 00:21:32 »
Может быть, стоит попробовать сделать это в Application.Idle?
Запустить из этого события команду, закрывающую чертеж - можно. А вот выполнять в этом событии что-то типа CloseAndDiscard я бы не рискнул.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #9 : 18-11-2017, 00:34:23 »
Кстати команду можно запускать через:
Код - C# [Выбрать]
  1. [DllImport("accore.dll", CharSet = CharSet.Unicode,  CallingConvention = CallingConvention.Cdecl,  EntryPoint = "ads_queueexpr")]
  2. extern static private int ads_queueexpr(byte[] command);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #10 : 18-11-2017, 15:08:32 »
Вариант с COM\ActiveX уже проверил?
да я сразу тогда и проверил, и отписался что не тот и не тот не прошел ...
насчет accore.dll попробую...

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #11 : 19-11-2017, 18:07:59 »
Кстати команду можно запускать через:
Александр, а это на 2014 автокаде работает или с 2015, или не так делаю:
Код - C# [Выбрать]
  1. ads_queueexpr(System.Text.Encoding.UTF32.GetBytes("Close"));
У меня самое интересное что оно запускается в отладчике раньше чем запускается сам автокад, а если дать потом с чертежа ничего не происходит. Пробывал и "_Close" и UTF8...может я что то не так делаю ::)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #12 : 19-11-2017, 19:09:23 »
Кстати команду можно запускать через:
Александр, а это на 2014 автокаде работает или с 2015, или не так делаю:
Код - C# [Выбрать]
  1. ads_queueexpr(System.Text.Encoding.UTF32.GetBytes("Close"));
У меня самое интересное что оно запускается в отладчике раньше чем запускается сам автокад, а если дать потом с чертежа ничего не происходит. Пробывал и "_Close" и UTF8...может я что то не так делаю ::)
Работает начиная с AutoCAD 2000 еще до всяких .NET.

Должно быть как-то так:
Код - C# [Выбрать]
  1. ads_queueexpr("(command \"_Close\")\n");
В описании ads_queueexpr кажется ошибка. Должно быть:
Код - C# [Выбрать]
  1. [DllImport("accore.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
  2. extern static private int ads_queueexpr(string strExpr);
« Последнее редактирование: 19-11-2017, 20:08:07 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #13 : 19-11-2017, 20:57:22 »
все таже ошибка:



как впринципе если и в лисп(автозагрузки) вставить команду закрытия... :'(

п.с конечно можно поробывать ход конем, хоть мне и не нравится -не красиво  :( :
запускать паралельный процесс с эксепшн и таймером(первый самый вариант хоть исключение выкидвало) и через Invoke пробывать пока не закроет



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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #14 : 19-11-2017, 21:02:46 »
Ничего не понял. Еще же AutoCAD не загрузился.
Не нужно насиловать AutoCAD. Просто придумай другой алгоритм без закрытия чертежа. Например предупреди пользователя и всё.
А если речь идёт об AutoCAD 2014, то просто установи для него SP1 и забудь про отметку учебной версии.
Или воспользуйся моим кодом для снятия флажка учебной версии в AutoCAD 2014: http://adn-cis.org/forum/index.php?topic=1110.0
Тему читать всю от начала и до конца. Обратить внимание на EMRCLEAR.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение