Последние сообщения

Последние сообщения

Страницы: [1] 2 3 ... 10
1
AutoCAD .NET API / Re: Закрытие чертежа - "чертеж занят"?
« Последний ответ от prajdziswet 20-11-2017, 08:12:20 »
Сама идея закрывать чертеж по событию его открытия - уже звучит бредово. Понятно что документ будет..
полностью согласен - но я привел, как вариант - хоть мне удобнее поступить (да и красивее будет), как предложил Александр...

Спасибо...(всегда что-то новое подчерпнешь...)
2
Это разве не оно?
Имя файла в нём не известно.
3
Эх, вот бы было событие BeforeOpen и получало бы оно имя файла до того как его Автокад начнет открывать - вот тогда была б красота....
Это разве не оно?
4
AutoCAD .NET API / Re: Закрытие чертежа - "чертеж занят"?
« Последний ответ от avc 19-11-2017, 23:43:22 »
Сама идея закрывать чертеж по событию его открытия - уже звучит бредово. Понятно что документ будет заблокирован и куча процессов его читает в этот момент. Поэтому я не долго мучился и сдался. Хотя полно случаев когда это нужно. Можно и без таймеров попробовать - повесить обработчик простоя OnIdle и ждать пока разблокирован будет файл. Все в одном потоке. Может даже ивок не понадобится.
Эх, вот бы было событие BeforeOpen и получало бы оно имя файла до того как его Автокад начнет открывать - вот тогда была б красота....
5
AutoCAD .NET API / Re: Закрытие чертежа - "чертеж занят"?
« Последний ответ от prajdziswet 19-11-2017, 23:06:49 »
то я себе позволил небольшой "хак".
буду разбираться...Спасибо!!!
Команда конечно сессионная. Вот рабочий код (Cns - это мой класс для работы с консолью Автокада)
И тебе avc, Большое Спасибо..Как раз у меня получается наверное не совсем сессионная (и смотрю закрывать как я),это хорошо видно на accore.dll - автокад даже не успевает загрузится, как она идет на обработку...Так же получается при моем (простом закрытии через ".CloseAndDiscard();),еще автокад грузит лисп-ы в чертеж и длл в автокад (но автокад уже загружен и поэтому исключение у меня вываливается, но чертеж не доконца еще загружен)=> как я пытаюсь его закрыть...

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

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

но это не очень красивое решение, как писал выше "костыль"....
6
AutoCAD .NET API / Re: Закрытие чертежа - "чертеж занят"?
« Последний ответ от avc 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.     }
7
МХ, а вот это интересно - просто я думал что сбросить флаг нельзя так как он только для чтения - обязательно прочитаю (впринципе задумка и была чистка -скидывания учебки, просто флаг только для чтения и я подумал, что нельзя скинуть)
Он и есть "только для чтения", но так как Autodesk отказался от флага учебной версии, то я себе позволил небольшой "хак".
8
AutoCAD .NET API / Re: склеивание различных ObjectIdCollection
« Последний ответ от German 19-11-2017, 21:45:04 »
Дима_, пользуясь случаем, раз уж тут такой оффтопик, не предложите свой вариант на F#?
9
AutoCAD .NET API / Re: Закрытие чертежа - "чертеж занят"?
« Последний ответ от prajdziswet 19-11-2017, 21:18:50 »
Например предупреди пользователя и всё.
А если речь идёт об AutoCAD 2014, то просто установи для него SP1 и забудь про отметку учебной версии.

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

Или воспользуйся моим кодом для снятия флажка учебной версии в AutoCAD 2014: http://adn-cis.org/forum/index.php?topic=1110.0
Тему читать всю от начала и до конца. Обратить внимание на EMRCLEAR.
МХ, а вот это интересно - просто я думал что сбросить флаг нельзя так как он только для чтения - обязательно прочитаю (впринципе задумка и была чистка -скидывания учебки, просто флаг только для чтения и я подумал, что нельзя скинуть)
10
Ничего не понял. Еще же AutoCAD не загрузился.
Не нужно насиловать AutoCAD. Просто придумай другой алгоритм без закрытия чертежа. Например предупреди пользователя и всё.
А если речь идёт об AutoCAD 2014, то просто установи для него SP1 и забудь про отметку учебной версии.
Или воспользуйся моим кодом для снятия флажка учебной версии в AutoCAD 2014: http://adn-cis.org/forum/index.php?topic=1110.0
Тему читать всю от начала и до конца. Обратить внимание на EMRCLEAR.
Страницы: [1] 2 3 ... 10