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

ADN Club => AutoCAD .NET API => Тема начата: bert от 16-02-2017, 13:54:44

Название: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: bert от 16-02-2017, 13:54:44
Здравствуйте уважаемые форумчане! подскажите, как лучше всего проверить открыт ли файл в Autocad по имени файла?
пишу на c# dllку для Autocad 2014

изначально в библиотеке мы пробегаемся по всем открытым чертежам и ищем чертеж удовлетворяющий условиям -

Код - C# [Выбрать]
  1. DocumentCollection docs = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;          
  2.             foreach (Document doc in docs)
  3.             {              
  4.                 if (File.Exists(doc.Name))
  5.                 {  
  6.                     if ("некое условия")
  7.                     {
  8.                         b[i] = doc.Name;

{создается отдельный поток в таймере в котором передается имя удовлетворяющее условию}

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

заново пускать этот цикл в потоке?

 
Код - C# [Выбрать]
  1.  foreach (Document doc in docs)
  2.             {              
  3.                 if (File.Exists(doc.Name))
  4.                    сравнивать, равен ли doc.Name с b[i]

?

другими словами чтобы определить открыт ли файл с конкретным именем - я должен заново пустить цикл foreach и уже в нем каждый чертеж сравнивать с необходимым мне именем файла?
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: Александр Ривилис от 16-02-2017, 13:57:32
1. Тема создана не в том разделе - перенесу.
2. Код не форматирован - читай у меня в подписи.
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: Александр Ривилис от 16-02-2017, 14:03:16
уже в самом потоке как проверить не закрыл ли пользователь данный файл?

заново пускать этот цикл в потоке?
Ну а как иначе если чертеж может быть закрыт пользователем? Только есть большие шансы, что этот код работать не будет, так как AutoCAD .NET API не потокобезопасное и многие вещи нельзя делать не в основном потоке.
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: bert от 16-02-2017, 14:09:41
1. Тема создана не в том разделе - перенесу.
2. Код не форматирован - читай у меня в подписи.

Прошу прощения за плохое оформление. постараюсь следовать всем правилом форума.
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: bert от 16-02-2017, 14:15:08
уже в самом потоке как проверить не закрыл ли пользователь данный файл?

заново пускать этот цикл в потоке?
Ну а как иначе если чертеж может быть закрыт пользователем? Только есть большие шансы, что этот код работать не будет, так как AutoCAD .NET API не потокобезопасное и многие вещи нельзя делать не в основном потоке.

во второстепенном потоке у пользователей появляется Спам-предупреждение с определенными рекомендациями. но бывает так что пользователь просто напросто закрывает чертеж не выполнив рекомендации, указанные в Спам-предупреждении. и естественно Спам продолжается на уже закрытый чертеж. Естественно пользователь выражает недовольство)

а что касается повторной проверки на "открыт ли чертеж с конкретным именем которое мы успели запомнить в основном потоке" - хотелось просто не засорять дллку дополнительными циклами...Автокад и без них то фаталит. думал может есть более рациональный алгоритм
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: Александр Ривилис от 16-02-2017, 14:27:26
Автокад и без них то фаталит. думал может есть более рациональный алгоритм
Фаталит чаще всего именно из за работы в отдельном потоке. Еще раз. К AutoCAD обращаться из отдельного потока нельзя. Можно вот так: http://adn-cis.org/ispolzovanie-potokov-dlya-fonovoj-obrabotki.html

Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: Александр Ривилис от 16-02-2017, 14:30:02
но бывает так что пользователь просто напросто закрывает чертеж не выполнив рекомендации
Мне не понятен алгоритм работы этого вашего приложения, но если документ не должен быть закрыт во время обработки - значит нужно запретить пользователю его закрывать (технически или административно).
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: Дима_ от 16-02-2017, 16:33:03
уже в самом потоке как проверить не закрыл ли пользователь данный файл?
Я тоже не очень уловил суть Вашей задачи, но по моему, правильней, после проверки всех открытых документов при запуске, можно подписаться на соответствующие события работы с документом.
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: bert от 17-02-2017, 06:45:44
уже в самом потоке как проверить не закрыл ли пользователь данный файл?
Я тоже не очень уловил суть Вашей задачи, но по моему, правильней, после проверки всех открытых документов при запуске, можно подписаться на соответствующие события работы с документом.

Суть задачи следующая:
В случае если работник не сохранялся более 2х часов, то каждые 5 минут выскакивает форма с текстом-уведомлением, где четко указывается, как часто необходимо сохранять данный чертеж

Реализация:
В
Код - C# [Выбрать]
  1.  public void Initialize()
  2.         {
находится таймер цикл которого скажем 30минут.
в событии таймера идет проверка по всем чертежам

Код - C# [Выбрать]
  1.  foreach (Document doc in docs)
  2.             { if(если чертеж не сохранялся более 2 часов то создаем еще один "внутренний" таймер)

Во внутреннем таймере (интервал которого -5минут) выходит сообщение с предупреждением
естественно, если работник сохранился то внутренний таймер полностью "убивается"
Внешний работает всегда, пока работник не закроет автокад.

реализовывал с двумя таймера только потому, что хотелось грузить ресурсы ПК по минимуму.
если реализовывал с одним таймером, то интервал пришлось бы сделать 5минут, в событие пришлось загнать и проверку всех чертежей + сам спам в случае выполнения условия!
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: Владимир Шу от 17-02-2017, 07:20:26
А разве не проще в настройках автокада установить автосохранение на 1,5 часа и не парить голову с dll, потоками и прочим?
Просто принудительно устанавливать SAVETIME (System Variable) в нужное значение и все.
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: bert от 17-02-2017, 07:29:57
Вы про автосохранение на отдельное хранилище куда с определенным интервалом сохраняются файлы с расширением *.sv$ и *.bak ?
это уже работает. открытый чертеж при этом не сохраняется.
у нас основная теория в том, что открытый через какое-то время начинает собирать мусор, если его долго не сохранять. Потом автокад начинает виснуть, фаталить итд итп
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: Александр Ривилис от 17-02-2017, 09:46:37
реализовывал с двумя таймера только потому, что хотелось грузить ресурсы ПК по минимуму.
Не смеши меня. Цикл по всем открытым чертежам (даже если их сотни - чего на практике быть не может) занимает миллисекунды. Какая тут загрузка ресурсов ПК?
у нас основная теория в том, что открытый через какое-то время начинает собирать мусор, если его долго не сохранять.
Принудительно установи у всех пользователей ISAVEPERCENT (https://knowledge.autodesk.com/support/autocad/troubleshooting/caas/sfdcarticles/sfdcarticles/ISAVEPERCENT-system-variable-affecting-file-size-performance-and-interoperability.html) в 0 и мусора не будет.
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: Дима_ от 17-02-2017, 12:25:55
Не смеши меня. Цикл по всем открытым чертежам (даже если их сотни - чего на практике быть не может) занимает миллисекунды.
Ну этож как написать, мы кода не видели - там может и от 2 документов "все пропало", например перед тем как к документу обратится, его какой-нибудь готовой функцией вначале перерисовывают, а затем берут у него 8152 параметра (которые 3 раза еще все примитивы пересчитывают) из которых нужно только имя - но программисту было так удобней - функция-то уже готова.
Пример конечно натянутый - но суть вполне может быть в этом.
Название: Re: c#. алгоритм проверки использования чертежа в Autocad по имени файла
Отправлено: Дмитрий Загорулькин от 17-02-2017, 13:54:39
Как идея. Можно написать приложение, состоящее из двух компонентов:
Первый компонент (AutoCAD-компонент) загружается в AutoCAD и при открытии/закрытии документов куда-то выводит все нужные данные об открываемых/закрываемых файлах (например, в текстовый файл).
Второй компонент (Windows-компонент) загружается в Windows и следит за этими выводимыми данными. Получая эти данные, Windows-компонент отслеживает состояния файлов-чертежей и выводит сообщение, если заметит, что какой-то чертеж давно не сохранялся.
P.S. Тут, правда, есть одно тонкое место - как быть, если AutoCAD аварийно завершил работу? Ведь при этом AutoCAD-компонент не отработает и данные о закрытии файлов не будут переданы. Но, думаю, это решаемо. В общем, основная идея в том, что отслеживание чертежей будет выполняться не изнутри AutoCAD, а из внешнего по отношению к нему приложения.