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

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

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

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #15 : 19-11-2017, 21:18:50 »
Например предупреди пользователя и всё.
А если речь идёт об AutoCAD 2014, то просто установи для него SP1 и забудь про отметку учебной версии.

Насчет сервес-пака он установлен и у меня то оно просто предупреждало пользователя, что "учебная версия" (а так автокад молчит). Но люди как пользовались, так и пользуются - а на наши чертежи потом ругаются, админ выложил "DWG TrueView" - чтобы люди пользовались и чистили (часть чистит, но все равно воз поныне там).

Или воспользуйся моим кодом для снятия флажка учебной версии в AutoCAD 2014: http://adn-cis.org/forum/index.php?topic=1110.0
Тему читать всю от начала и до конца. Обратить внимание на EMRCLEAR.
МХ, а вот это интересно - просто я думал что сбросить флаг нельзя так как он только для чтения - обязательно прочитаю (впринципе задумка и была чистка -скидывания учебки, просто флаг только для чтения и я подумал, что нельзя скинуть)

Отмечено как Решение prajdziswet 19-11-2017, 23:27:44

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #16 : 19-11-2017, 22:02:19 »
МХ, а вот это интересно - просто я думал что сбросить флаг нельзя так как он только для чтения - обязательно прочитаю (впринципе задумка и была чистка -скидывания учебки, просто флаг только для чтения и я подумал, что нельзя скинуть)
Он и есть "только для чтения", но так как Autodesk отказался от флага учебной версии, то я себе позволил небольшой "хак".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #17 : 19-11-2017, 22:33:29 »
По теме закрытия у меня как-то была задача обновлять файл чертежа если пользователь открыл старый локальный  а на сервере лежит новая версия. Так вот из обработчика события открытия файла я так и не смог сделать его закрытие. Ограничился (в точности как писалось выше) предупреждением пользователю типа "Файл старый, вызови команду обновления". А вот уже из команды - пожалуйста, все вполне закрывается и открывается. Команда конечно сессионная. Вот рабочий код (Cns - это мой класс для работы с консолью Автокада):
Код - C# [Выбрать]
  1.   [CommandMethod("ReOpen", CommandFlags.NoBlockEditor | CommandFlags.Session | CommandFlags.Modal)]
  2.     public static void ReOpen()
  3.     {
  4.        try
  5.       {
  6.         Document doc = AcadApp.DocumentManager.MdiActiveDocument;
  7.         if (doc == null) return;
  8.  
  9.         if (!DocSaved)
  10.         {
  11.           if (!Cns.Query(
  12.             "Чертеж отредактирован и не сохранен!\n" +
  13.             "Перезагрузка вызовет потерю всех изменений.\n" +
  14.             "Закрыть файл без сохранения?"))
  15.             return;
  16.         }
  17.  
  18.         if (!doc.TryClose()) return;
  19.         string fileName = LoadFile(.......);
  20.         if (File.Exists(fileName))
  21.           AcadApp.DocumentManager.Open(fileName, false);
  22.         else
  23.           Cns.Err("Файл " + fileName + " не существует");
  24.         }
  25.       catch (System.Exception ex) { Cns.Err(ex); }
  26.     }
  27.        
  28.     public static bool DocSaved
  29.     {
  30.       get
  31.       {
  32.         object obj = AcadApp.GetSystemVariable("DBMOD"); // Check the value of DBMOD, if 0 then the drawing has no unsaved changes
  33.         return (System.Convert.ToInt16(obj) == 0);
  34.       }
  35.     }
  36.        
  37.     public static bool TryClose(this Document doc)
  38.     {
  39.       if (doc.LockMode(true) != DocumentLockMode.NotLocked)
  40.       {
  41.         Cns.Warning("Файл " + Path.GetFileNameWithoutExtension(doc.Name) + " заблокирован. Закрыть не получится.");
  42.         return false;
  43.       }
  44.       try
  45.       {
  46.         doc.CommitAll();
  47.         doc.CloseAndDiscard();
  48.       }
  49.       catch (Exception e)
  50.       {
  51.         Cns.Warning("Попытка закрыть чертеж " + Path.GetFileNameWithoutExtension(doc.Name) + " не удалась. Ошибка: " + e.Message);
  52.         return false;
  53.       }
  54.       return true;
  55.     }

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #18 : 19-11-2017, 23:06:49 »
то я себе позволил небольшой "хак".
буду разбираться...Спасибо!!!
Команда конечно сессионная. Вот рабочий код (Cns - это мой класс для работы с консолью Автокада)
И тебе avc, Большое Спасибо..Как раз у меня получается наверное не совсем сессионная (и смотрю закрывать как я),это хорошо видно на accore.dll - автокад даже не успевает загрузится, как она идет на обработку...Так же получается при моем (простом закрытии через ".CloseAndDiscard();),еще автокад грузит лисп-ы в чертеж и длл в автокад (но автокад уже загружен и поэтому исключение у меня вываливается, но чертеж не доконца еще загружен)=> как я пытаюсь его закрыть...

Большое СПАСИБО за подсказки ... :)

п.с А закрытие можно реализовать как писал выше(но мне это вариант не очень нравится = лучше прочитаю решение Александра по снятию флага= это лучше). А решение может быть таким (но это "костыль" извиняюсь за название, но моймете по ходу рассуждения):
- так как в моем случае автокад .CloseAndDiscard() - выдает исключение, можно его вызывать через определение время..
т.е вызываем паралельный поток (чтобы автокад продолжал выполнять свои действия) выполняющий через определенное время допустим 1 сек (или таймер) закрытие файла..и пробуем закрывать файл пока он не закроет, так как файл закрыть можно только из основного потока вызываем наш метод через Invoke...

но это не очень красивое решение, как писал выше "костыль"....

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #19 : 19-11-2017, 23:43:22 »
Сама идея закрывать чертеж по событию его открытия - уже звучит бредово. Понятно что документ будет заблокирован и куча процессов его читает в этот момент. Поэтому я не долго мучился и сдался. Хотя полно случаев когда это нужно. Можно и без таймеров попробовать - повесить обработчик простоя OnIdle и ждать пока разблокирован будет файл. Все в одном потоке. Может даже ивок не понадобится.
Эх, вот бы было событие BeforeOpen и получало бы оно имя файла до того как его Автокад начнет открывать - вот тогда была б красота....

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #20 : 19-11-2017, 23:55:29 »
Эх, вот бы было событие BeforeOpen и получало бы оно имя файла до того как его Автокад начнет открывать - вот тогда была б красота....
Это разве не оно?

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

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

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 0
Re: Закрытие чертежа - "чертеж занят"?
« Ответ #22 : 20-11-2017, 08:12:20 »
Сама идея закрывать чертеж по событию его открытия - уже звучит бредово. Понятно что документ будет..
полностью согласен - но я привел, как вариант - хоть мне удобнее поступить (да и красивее будет), как предложил Александр...

Спасибо...(всегда что-то новое подчерпнешь...)