c#. алгоритм проверки использования чертежа в Autocad по имени файла

Автор Тема: c#. алгоритм проверки использования чертежа в Autocad по имени файла  (Прочитано 10474 раз)

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

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 1
Здравствуйте уважаемые форумчане! подскажите, как лучше всего проверить открыт ли файл в 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 и уже в нем каждый чертеж сравнивать с необходимым мне именем файла?
« Последнее редактирование: 16-02-2017, 14:27:28 от bert »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Тема создана не в том разделе - перенесу.
2. Код не форматирован - читай у меня в подписи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 16-02-2017, 14:30:33

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
уже в самом потоке как проверить не закрыл ли пользователь данный файл?

заново пускать этот цикл в потоке?
Ну а как иначе если чертеж может быть закрыт пользователем? Только есть большие шансы, что этот код работать не будет, так как AutoCAD .NET API не потокобезопасное и многие вещи нельзя делать не в основном потоке.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 1
1. Тема создана не в том разделе - перенесу.
2. Код не форматирован - читай у меня в подписи.

Прошу прощения за плохое оформление. постараюсь следовать всем правилом форума.

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 1
уже в самом потоке как проверить не закрыл ли пользователь данный файл?

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

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

а что касается повторной проверки на "открыт ли чертеж с конкретным именем которое мы успели запомнить в основном потоке" - хотелось просто не засорять дллку дополнительными циклами...Автокад и без них то фаталит. думал может есть более рациональный алгоритм

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Автокад и без них то фаталит. думал может есть более рациональный алгоритм
Фаталит чаще всего именно из за работы в отдельном потоке. Еще раз. К AutoCAD обращаться из отдельного потока нельзя. Можно вот так: http://adn-cis.org/ispolzovanie-potokov-dlya-fonovoj-obrabotki.html

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
но бывает так что пользователь просто напросто закрывает чертеж не выполнив рекомендации
Мне не понятен алгоритм работы этого вашего приложения, но если документ не должен быть закрыт во время обработки - значит нужно запретить пользователю его закрывать (технически или административно).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
уже в самом потоке как проверить не закрыл ли пользователь данный файл?
Я тоже не очень уловил суть Вашей задачи, но по моему, правильней, после проверки всех открытых документов при запуске, можно подписаться на соответствующие события работы с документом.

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 1
уже в самом потоке как проверить не закрыл ли пользователь данный файл?
Я тоже не очень уловил суть Вашей задачи, но по моему, правильней, после проверки всех открытых документов при запуске, можно подписаться на соответствующие события работы с документом.

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

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

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

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

реализовывал с двумя таймера только потому, что хотелось грузить ресурсы ПК по минимуму.
если реализовывал с одним таймером, то интервал пришлось бы сделать 5минут, в событие пришлось загнать и проверку всех чертежей + сам спам в случае выполнения условия!

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
А разве не проще в настройках автокада установить автосохранение на 1,5 часа и не парить голову с dll, потоками и прочим?
Просто принудительно устанавливать SAVETIME (System Variable) в нужное значение и все.

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

  • ADN OPEN
  • Сообщений: 32
  • Карма: 1
Вы про автосохранение на отдельное хранилище куда с определенным интервалом сохраняются файлы с расширением *.sv$ и *.bak ?
это уже работает. открытый чертеж при этом не сохраняется.
у нас основная теория в том, что открытый через какое-то время начинает собирать мусор, если его долго не сохранять. Потом автокад начинает виснуть, фаталить итд итп

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
реализовывал с двумя таймера только потому, что хотелось грузить ресурсы ПК по минимуму.
Не смеши меня. Цикл по всем открытым чертежам (даже если их сотни - чего на практике быть не может) занимает миллисекунды. Какая тут загрузка ресурсов ПК?
у нас основная теория в том, что открытый через какое-то время начинает собирать мусор, если его долго не сохранять.
Принудительно установи у всех пользователей ISAVEPERCENT в 0 и мусора не будет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Не смеши меня. Цикл по всем открытым чертежам (даже если их сотни - чего на практике быть не может) занимает миллисекунды.
Ну этож как написать, мы кода не видели - там может и от 2 документов "все пропало", например перед тем как к документу обратится, его какой-нибудь готовой функцией вначале перерисовывают, а затем берут у него 8152 параметра (которые 3 раза еще все примитивы пересчитывают) из которых нужно только имя - но программисту было так удобней - функция-то уже готова.
Пример конечно натянутый - но суть вполне может быть в этом.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Как идея. Можно написать приложение, состоящее из двух компонентов:
Первый компонент (AutoCAD-компонент) загружается в AutoCAD и при открытии/закрытии документов куда-то выводит все нужные данные об открываемых/закрываемых файлах (например, в текстовый файл).
Второй компонент (Windows-компонент) загружается в Windows и следит за этими выводимыми данными. Получая эти данные, Windows-компонент отслеживает состояния файлов-чертежей и выводит сообщение, если заметит, что какой-то чертеж давно не сохранялся.
P.S. Тут, правда, есть одно тонкое место - как быть, если AutoCAD аварийно завершил работу? Ведь при этом AutoCAD-компонент не отработает и данные о закрытии файлов не будут переданы. Но, думаю, это решаемо. В общем, основная идея в том, что отслеживание чертежей будет выполняться не изнутри AutoCAD, а из внешнего по отношению к нему приложения.
« Последнее редактирование: 17-02-2017, 14:26:53 от Дмитрий Загорулькин »