autosave

Автор Тема: autosave  (Прочитано 18225 раз)

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

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
autosave
« : 29-05-2015, 09:19:16 »
Добрый день!

Есть необходимость "допилить" Autosave автокада.

2 события для перехвата
database.BeginSave += new DatabaseIOEventHandler(database_BeginSave);
database.SaveComplete += new DatabaseIOEventHandler(database_EndSave);

Дальше нужно сделать
database.SaveAs()
SaveAs выдает ошибки
BeginSave - eFileSharingViolation
SaveComplete - вылетает без возврата ошибки

Испробовал функции с различными параметрами:
database.SaveAs()
document.Database.SaveAs
Результат тот же.
Если сделать отдельную команду, то все ОК, сохраняет. Т.е. SaveAs работает сам по себе

Отсюда предположение, что база заблокирована во время событий BeginSave и SaveComplete

Подскажите что можно сделать.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #1 : 29-05-2015, 09:30:33 »
Если в обработчике событий через SaveAs ты пытаешься заменить текущий DWG файл, то я подозреваю, что это не удаётся по той причине, что на время работы кода в обработчике события  файл вероятно блокируется. Насколько я понимаю, твой алгоритм способствует появлению бесконечного цикла, ведь когда ты вызываешь SaveAs - снова срабатывают те же события, на которые ты повесил обработчики. В коде одного из обработчиков ты опять вызываешь сохранение и так до бесконечности (ситуация аля "у попа была собака"). Видимо для того, чтобы избежать подобных казусов сохранение в обработчике этих событий и было запрещено на уровне API.

А чем не устроила отдельная команда? Вариант, мягко говоря не самый лучший, но в качестве общей информации обозначаю: при помощи команды undefine можно спрятать команду (и определить свою с тем же именем), но вызвать оригинальную всё равно можно, если перед именем поставить точку (так что финт ушами - так себе), ну или пользователь может вызвать redefine, вернув оригинал в обычную область видимости.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #2 : 29-05-2015, 10:04:27 »
А чем не устроила отдельная команда?

Дело не в команде, а в несовершенстве Autosave.
Долго рассказывать, про проблемы с чертежами в конторе, расскажу про проблемы автосейва от Автодеска.

"Autosave" записывает бэкап в один файл, при нажатии на "_qsave" бэкап удаляется.
Т.к. если "_qsave" удачно, то как считает автодеск все гуд и бэкап не нужен.
Дальше, если пройдет глючное"_qsave" до следующего "Autosave",
То порушится автокад и сохраняемый чертеж, и не будет бэкапа!

Выход, поставить создавать bak файл. Будет копия предыдущего сохранения, Autosave ее не затирает.
bak файл легко убирается галочкой юзерами. Да и в принципе не нужен в папке чертежа, это будет промежуточный мусор, нужный только для восстановления.

Поэтому хорошо бы стандартный механизм допилить. папка, с записью всех копий файла через 10 минут в течении дня-трех.

Все готово, осталось только SaveAs запустить внутри Autosave.

А про "ты опять вызываешь сохранение и так до бесконечности" спасибо! Скорее всего это и есть причина падения в SaveComplete.


Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #3 : 29-05-2015, 10:07:31 »
Если речь о бэкапах, то я когда-то написал такое решение (возможно будет интересно). Ключевой момент в моём варианте - юзер сам должен решать, когда ему создавать очередной вариант резервной копии.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #4 : 29-05-2015, 10:20:28 »
Хотя, согласно официальной документации, использовать undefine и redefine всё же не стоит:

Цитата: Autodesk ObjectARX for AutoCAD 2016 : Interoperability Guide > User Interface Considerations (Dialogs, Commands, Menus, and System Variables) >
Do Not Use UNDEFINE and REDEFINE Commands
 
Level
Requirement

Applies to
ObjectARX and .NET applications

You cannot use the UNDEFINE and REDEFINE AutoCAD commands. Using these commands can confuse users and can conflict with other applications. Particularly troublesome is the situation when QUIT, END, SAVE, OPEN, and NEW are redefined by more than one application. ObjectARX provides a variety of mechanisms for applications to receive control at these key events. (Refer to the Notification chapter in the ObjectARX Developer's Guide for a discussion of reactors.)

Оффлайн Doublefish

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: autosave
« Ответ #5 : 29-05-2015, 10:23:58 »
Я пользую команду movebak из express tools для создания bak файлов в заданной папке.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #6 : 29-05-2015, 10:31:36 »
Я пользую команду movebak из express tools для создания bak файлов в заданной папке.
я не вижу пользы в ней, т.к. она не даёт возможности откатиться к нужной версии чертежа. Каждое сохранение по прежнему переписывает этот единственный BACK. То, где лежит BACK-файл: рядом с DWG или в подкаталоге - это особой роли не играет (имхо). Ключевой момент - иметь возможность откатиться к нужной версии чертежа. BACK может оказаться повреждённым, как и оригинал, в виду того, что повреждённое состояние было сохранено.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #7 : 29-05-2015, 10:33:51 »
Если речь о бэкапах, то я когда-то написал такое решение (возможно будет интересно).

Близко к тому, что нужно, но логика нужна другая.
1. случаи аварийные, т.е. рядом с файлом не надо. Когда надо тогда и залезли в папку автосохранения. Также идет работа в сетевых папках.
2. механизм автосейва использовать удобнее, поставил 10 минут и забыл. не вызывая доп команды. Настраивается юзером, как угодно.
3. бэкап - постоянный спам, подлежащий удалению через 1-3 дня, т.е это локальная, очищаемая папка.

SaveComplete + Singleton + запирающий флаг, чтоб избежать зацикливания, скорее всего то, что нужно. Опробую.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #8 : 29-05-2015, 10:43:48 »
1. случаи аварийные, т.е. рядом с файлом не надо. Когда надо тогда и залезли в папку автосохранения. Также идет работа в сетевых папках.
Мои пользователи в основном так же работают с файлами, расположенными в сети. Каталоги сохранения настраиваются посредством конфиг-файла, имеющего формат xml (он там, кстати, показан). При помощи конфига можно указывать как абсолютный, так и относительный путь к каталогу резервных копий (как правило, он там же - на сервере).

2. механизм автосейва использовать удобнее, поставил 10 минут и забыл. не вызывая доп команды.
Я отказался от этого, т.к. подобный подход способствует быстрому раздуванию каталогов с контрольными точками сохранения и по факту будет содержать огромное количество ненужных файлов, не соответствующих самой идее контрольных точек восстановления. Отдаю предпочтение осмысленному нажатию на кнопке создания контрольной точки сохранения, т.к. именно пользователь, а не автосэйв, имеет чёткое представление о том, когда целесообразней эту точку создать. Такие точки обозначают очередной пройденный этап проектирования, либо один из возможных вариантов решения (т.е. своего рода ветвление). В дальнейшем от какой-то ветки можно будет легко отказаться (в случае необходимости).

3. бэкап - постоянный спам, подлежащий удалению через 1-3 дня, т.е это локальная, очищаемая папка.
Я делаю отличие бэкапа от контрольной точки восстановления, созданной пользователем. Это разные понятия. Мой код создаёт именно контрольные точки, а не бэкапы.

SaveComplete + Singleton + запирающий флаг, чтоб избежать зацикливания, скорее всего то, что нужно.
Этой фразы я не понял. Польза обозначенного паттерна в данной ситуации мне так же не очевидна. Синглтон гарантирует, что объект некоторого класса всегда будет присутствовать в единственном экземпляре. Какое это отношение имеет к автосохранению и как может помочь - я не представляю.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #9 : 29-05-2015, 11:01:32 »
Мои пользователи так же работают с файлами, расположенными в сети. Каталоги сохранения настраиваются посредством конфиг-файла, имеющего формат xml (он там, кстати, показан). При помощи конфига можно указывать как абсолютный, так и относительный путь к каталогу резервных копий.
Это не спорю, можно.

способствует быстрому раздуванию каталогов.  т.к. именно пользователь имеет чёткое представление о том, когда целесообразней эту точку создать.
Каталог "сам почищу" до старта команды при старте, по дате файлов...это детали
имеет чёткое представление...спорить на эту тему не будем, у меня свои юзеры, у вас свои ;-)


Я различаю бэкап от контрольной точки восстановления
А мне не нужно нового термина - точка восстановления. это именно бэкап через заданный промежуток времени. Это именно то, что ожидают мои пользователи от Autosave. Наверное тоже не стоит спорить.

Этой фразы я не понял. Польза обозначенного паттерна в данной ситуации мне так же не очевидна.
Ок, какие еще варианты?)))

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #10 : 29-05-2015, 11:23:19 »
Ок, какие еще варианты?)))

Например такой:
Код - C# [Выбрать]
  1.   public sealed class ExtensionApplication : IExtensionApplication {
  2.     public void Initialize() {
  3.       Document doc = cad.DocumentManager.MdiActiveDocument;
  4.       if (null == doc)
  5.         return;
  6.       Database db = doc.Database;
  7.       Editor ed = doc.Editor;
  8.       using (doc.LockDocument()) {
  9.         using (Transaction tr = db.TransactionManager.StartTransaction()) {
  10.           ed.WriteMessage("\nThe \"{0}\" assembly successfully loaded.\n",
  11.             this.GetType().Assembly.Location);
  12.           db.SaveComplete += db_SaveComplete;
  13.           tr.Commit();
  14.         }
  15.       }
  16.     }
  17.  
  18.     private Boolean savingMarker = true;
  19.  
  20.     private void db_SaveComplete(object sender, DatabaseIOEventArgs e) {
  21.       if (savingMarker = !savingMarker)
  22.         return;
  23.       Database db = sender as Database;
  24.       if (null == db) {
  25.         return;
  26.       }
  27.       Document doc = cad.DocumentManager.MdiActiveDocument;
  28.       Editor ed = doc.Editor;
  29.      
  30.       using (doc.LockDocument()) {
  31.         try {
  32.           String path = Path.GetDirectoryName(doc.Name);
  33.           String fileName = Path.GetFileNameWithoutExtension(doc.Name);
  34.           StringBuilder sb = new StringBuilder();
  35.           sb.Append(Path.Combine(path, fileName));
  36.           DateTime time = DateTime.Now;
  37.           sb.AppendFormat("_{0}-{1}-{2}_{3}-{4}-{5}.bak", time.Year,
  38.             time.Month.ToString("D2"), time.Day.ToString("D2"),
  39.             time.Hour.ToString("D2"), time.Minute.ToString("D2"),
  40.             time.Second.ToString("D2"));
  41.           String fullName = sb.ToString();
  42.           db.SaveAs(fullName, DwgVersion.Current);
  43.           ed.WriteMessage("\nFile saved as '{0}'.", sb.ToString());
  44.         }
  45.         catch (System.Exception ex) {
  46.           ed.WriteMessage("Exception: '{0}'.", ex.Message);
  47.         }
  48.       }
  49.     }
  50.  
  51.     public void Terminate() {
  52.     }
  53.   }

В приведённом примере резервные копии сохраняются в том же каталоге, где хранится оригинал.

Цитата: AutoCAD Output
Command: NETLOAD

The "C:\public\Debug\DWG_save_sandbox\DWG_save_sandbox.R20.1.dll" assembly successfully loaded.

Command:
Command:
Command: _qsave
File saved as 'C:\public\data\test_2015-05-29_11-36-45.bak'.
Command:
Command:
Command: _qsave
File saved as 'C:\public\data\test_2015-05-29_11-36-46.bak'.
Command:
Command:
Command: _qsave
File saved as 'C:\public\data\test_2015-05-29_11-36-49.bak'.
Command:
Command:
Command: _qsave
File saved as 'C:\public\data\test_2015-05-29_11-36-51.bak'.
Command:
Command:
Command: _qsave
File saved as 'C:\public\data\test_2015-05-29_11-36-52.bak'.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #11 : 29-05-2015, 11:34:27 »
Подправил код: изменил формат суффикса в имени сохранённой копии файла, а так же в консоль акада вывел имя этой копии.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #12 : 29-05-2015, 11:41:27 »
Например такой:
я тоже самое и написал, только словами))

SaveComplete - db.SaveComplete += db_SaveComplete;

запирающий флаг - private Boolean savingMarker = true;

Singleton - единственный экземпляр
(savingMarker и db_SaveComplete&SaveAs)

и тоже самое по сути у меня в коде ;-)

Кстати по поводу Singleton.
Если 2 раза вызвать netload выполняемой при загрузке библиотеки, не создаст ли она 2 события db.SaveComplete += db_SaveComplete;???

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #13 : 29-05-2015, 11:45:54 »
я тоже самое и написал...
и тоже самое по сути у меня в коде ;-)
Тогда я не понял причины наличия этого топика, ведь обозначенный мною выше код работает (без всяких "синглтонов"). Если у тебя такой же, то должен был работать и твой...

Singleton - единственный экземпляр
(savingMarker и db_SaveComplete&SaveAs)
Этой фразы я не понимаю, ну да ладно...

Цитировать
Кстати по поводу Singleton.
Если 2 раза вызвать netload выполняемой при загрузке библиотеки, не создаст ли она 2 события db.SaveComplete += db_SaveComplete;???
Опять не понимаю, при чём тут Singleton. Дважды в один и тот же AppDomain загрузить одну и ту же Assembly невозможно. Соответственно и регистрация событий будет выполнена лишь единожды, при первой (и ей же последней) загрузке управляемой сборки.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: autosave
« Ответ #14 : 29-05-2015, 11:57:04 »
Off-Topic: показать
У меня почему-то подозрение, что автору нужна система контроля версий.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #15 : 29-05-2015, 11:59:52 »
У меня почему-то подозрение, что автору нужна система контроля версий.
у меня такого подозрения нет.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: autosave
« Ответ #16 : 29-05-2015, 12:00:28 »
У тебя уверенность? :)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #17 : 29-05-2015, 12:02:43 »
У тебя уверенность?
абсолютная. в том, что ему это не нужно :)
Цитата: Привалов Дмитрий
А мне не нужно нового термина - точка восстановления. это именно бэкап через заданный промежуток времени. Это именно то, что ожидают мои пользователи от Autosave. Наверное тоже не стоит спорить.
git посложнее моего варианта будет ;)

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #18 : 29-05-2015, 12:26:13 »
Тогда я не понял причины наличия этого топика, ведь обозначенный мною выше код работает (без всяких "синглтонов"). Если у тебя такой же, то должен был работать и твой...

Вот теперь Андрей я тебя не понимаю.
Топик был создан т.к. у меня не работал SaveAs при SaveComplete. И ты навел меня на мою ошибку, что SaveAs  тоже вызывает событие SaveComplete.
Твой код появился в этой теме, после поиска проблемы. Мой код был доработан в это же время.
Сейчас он работает.
Так что топик создан правильно. И привел к решению.
Не стоит связывать причину создания топика с появившимся позже, внутри топика - "Синглтон" ;-)

Этой фразы я не понимаю, ну да ладно...
Обсуждение паттернов в разрезе кто, что и как написал, и насколько понятно/непонятно, предлагаю тут не вести. Это темы других форумов.

Дважды в один и тот же AppDomain загрузить одну и ту же Assembly невозможно. Соответственно и регистрация событий будет выполнена лишь единожды, при первой (и ей же последней) загрузке управляемой сборки.
Вот это по теме. AppDomain и Assembly я плохо знаю механизмы, загрузки/выгрузки, поэтому и спросил. Спасибо буду теперь знать)

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #19 : 29-05-2015, 12:41:00 »
У меня почему-то подозрение, что автору нужна система контроля версий.
Нет. Нужно резервирование их работы в течении дня-трех.
Тут можно долго спорить о том, как должно работать автосохранение/либо резервное копирование.

Если уж так интересно, могу описать проблемы.
На всех компах настроен автосейв, все пользователи обучены его настраивать.  70% знают где посмотреть папку для автосохранения.  Изобретать кнопку или команду для точек восстановления или управление версиями не требуется.

Нужно именно быстро восстановить файл в случае сбоя. А сбои пока частые.(((

Сначала победим сохранение, потом перейдем к причинам:
это разные версии автокадов, proxy, object enabler и другие причины.
RemoveAllProxy частичное решение проблемы, иногда нужно создавать новый файл и переносить объекты.
В одном месте файл тупит при сохранении обычных размеров.

Файлы и автокады от всех этих штук глючат в разные моменты времени. Инфа периодически теряется.

Это все было до меня, архив уже наводнен такими прелестными чертежами, нужно наводить порядок)


Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: autosave
« Ответ #20 : 29-05-2015, 12:43:10 »
А сбои пока частые.
Я бы разбирался с причинами частых "вылетов". Восстановление в данном случае, думаю,- это лечение симптомов, а не болезни.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #21 : 29-05-2015, 12:43:14 »
Цитата: Привалов Дмитрий
Твой код появился в этой теме, после поиска проблемы. Мой код был доработан в это же время.
теперь понял. я сначала подумал, что это решение и так было тобой найдено ранее, но чем-то тебя не устроило и ты создал тему.

Цитата: Привалов Дмитрий
Обсуждение паттернов в разрезе кто, что и как написал, и насколько понятно/непонятно, предлагаю тут не вести.
Тогда предлагаю их тут и не упоминать, тем самым внося некоторые неясности.

Дважды в один и тот же AppDomain загрузить одну и ту же Assembly невозможно. Соответственно и регистрация событий будет выполнена лишь единожды, при первой (и ей же последней) загрузке управляемой сборки.
Кстати, здесь есть одно НО... Дело в том, что CLR реализована в виде COM сервера. Если мне не изменяет память, то начиная с .NET 4.5 неуправляемое приложение может использовать в своей работе сразу несколько таких COM серверов - по одному для каждой поддерживаемой приложением версии CLR. Это позволяет успешно загружать в исходное неуправляемое приложение написанные для него управляемые плагины, скомпилированные под разные версии .NET: 3.5, 4.0, 4.5, 4.5.1. Каждый плагин грузится в соответствующий ему COM сервер (CLR).

Т.е. если новые версии AutoCAD будут пользоваться такой возможностью, то AutoCAD в разные CLR сможет загрузить две идентичные сборки, отличающиеся лишь тем, что они откомпилированы под разные версии .NET.

В этом случае может получится что у одного и того же (по сути) кода на одно и то же событие происходит регистрация несколько раз (по разу в каждой CLR).

Ещё один момент: один и тот же код может быть скомпилирован под разные версии .NET, использующие одну и ту же версию CLR. Что произойдёт, если юзер попытается загрузить в акад обе сборки? Это опасный случай... Давай посмотрим его на примере этого кода. Во вложении zip файл с результатом пакетной компиляции одного и того же исходного кода под разные версии акадов. В качестве примера буду использовать AutoCAD 2016.

В обозначенную версию AutoCAD можно успешно загрузить как DWG_save_sandbox.R20.0.dll, так и DWG_save_sandbox.R20.1.dll. Первую я откомпилировал как .NET 4.5, а вторую как .NET 4.5.1. Каждая из них работает корректно. НО... После загрузки DWG_save_sandbox.R20.1.dll ты можешь загрузить и DWG_save_sandbox.R20.0.dll (именно в этом порядке). Поскольку фактически это две разные сборки, то ты можешь загрузить и вторую из них... Вот тут и начинается бардак... В консоли автокада ты увидишь сообщение об успешной загрузке (т.е. сборка была успешно загружена, метод Initialize найден и успешно выполнен). Следующим сообщением является сообщение об ошибке.

А вот теперь... Если ты нажмёшь Ctrl + S, то автокад впадёт в тот самый бесконечный цикл о котором я писал ранее и зависнет. В проводнике ты будешь видеть, как массово появляются очередные бэкапы...

Так что на самом деле не всё так гладко в данном вопросе, как хотелось бы...
« Последнее редактирование: 29-05-2015, 13:25:06 от Андрей Бушман »

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #22 : 29-05-2015, 12:46:55 »
70% знают где посмотреть папку для автосохранения.
Общая папка автосохранения - зло, которое может вылезти боком в самый неподходящий момент. Такая папка должна быть для каждого проекта своя, т.к. юзеры могут работать над разными версиями одного и того же проекта, в результате чего некоторые файлы могут иметь одинаковые имена. В этом случае в общем каталоге автосохранения будет файл того, кто последним выполнил автосохранение. Впрочем это не моя головная боль - решай сам (я лишь предупредил о мине замедленного действия).

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: autosave
« Ответ #23 : 29-05-2015, 12:47:25 »
Андрей Бушман, зачем транзакция в Initialize?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #24 : 29-05-2015, 12:49:28 »
Андрей Бушман, зачем транзакция в Initialize?
Это код моего общего шаблона в Visual Studio. Я лишь заменил
Код - C# [Выбрать]
  1. // TODO: your code is here...
на конкретный код:
Код - C# [Выбрать]
  1. db.SaveComplete += db_SaveComplete;
Транзакцию убирать не стал, хотя она там и не нужна.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #25 : 29-05-2015, 13:04:50 »
А сбои пока частые.
Я бы разбирался с причинами частых "вылетов". Восстановление в данном случае, думаю,- это лечение симптомов, а не болезни.
Все верно, что тут добавишь.

Наверное только то, что каждый день создаются "грязные" чертежи с proxy, берутся и кладутся в архив бесконтрольно.
Архив большой, автоматом пройтись и почистить Proxy - путь к потере инфы, т.к. все это не 100%.
Proxy пользуются, нужно объяснять что нужно разбивать для смежников и класть в архив.
Объяснять можно долго, но 20-30% увы и ах не будут этого делать.  Автоматической проверки и блокировки данного действия на данный момент нет.
Некоторые проблемы не связаны с Proxy, а объектами автокада с неправильной геометрией, стилями, а также Entity without graphics representation, битыми BD чертежей.

Что остается сделать?
правильно уменьшить текущие потери и медленно, поэтапно начинать создавать систему, и именно систему, которая будет уменьшать количество "текущих ошибок" очищая архив и работу)

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: autosave
« Ответ #26 : 29-05-2015, 13:10:09 »
Транзакцию убирать не стал, хотя она там и не нужна.
Скорее вредна,о чем мы с тобой недавно говорили.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #27 : 29-05-2015, 13:10:55 »
Общая папка автосохранения....
Я не имел ввиду общей папки на сервере. Это локальная папка для каждого юзера, куда автоматически спамяться версии файлов. В случае глюков залезли и восстановили.
Т.е. все то же самое, что и при автосейве, только версии файлов не затираются при "успешном сохранении" и храняться 1-3 дня.

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: autosave
« Ответ #28 : 29-05-2015, 13:18:11 »
Я вот только не понял зачем нужно дополнительно вызвать db.SaveAs в db_SaveComplete если операция сохранения уже выполнена. Теперь просто сохранённый файл нужно скопировать/переименовать в нужное место средствами .NET без использования AutoCAD .NET API
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #29 : 29-05-2015, 13:24:30 »
Я вот только не понял зачем нужно дополнительно вызвать db.SaveAs в db_SaveComplete если операция сохранения уже выполнена. Теперь просто сохранённый файл нужно скопировать/переименовать в нужное место средствами .NET без использования AutoCAD .NET API
Хорошая мысль, а как гарантированно получить имя сохраненного резервного файла?
Как вариант можно взять последний изменяемый файл, но это может быть не он.
Также нужно проверить создался ли резервный файл или удалился. Т.к. при вызове "_qsave" сохраняется оригинал, а резервный наоборот удаляется.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #30 : 29-05-2015, 13:30:58 »
а как гарантированно получить имя сохраненного резервного файла?

удали из кода это:
Код - C# [Выбрать]
  1. private Boolean savingMarker = true;
и это:
Код - C# [Выбрать]
  1. if (savingMarker = !savingMarker)
  2.         return;
Затем замени это:
Код - C# [Выбрать]
  1. db.SaveAs(fullName, DwgVersion.Current);
на это:
Код - C# [Выбрать]
  1. File.Copy(doc.Name, sb.ToString()); // второй параметр как раз и содержит имя, о котором спрашиваешь.

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: autosave
« Ответ #31 : 29-05-2015, 13:46:03 »
Вообще-то имя сохранённого файла будет e.FileName. В случае AutoSave оно будет отличаться от doc.Name
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #32 : 29-05-2015, 13:54:19 »
File.Copy(doc.Name, sb.ToString()); // второй параметр как раз и содержит имя, о котором спрашиваешь.

не понял, зачем копировать текущий файл чертежа?

Допишу тогда про автосейв и его логику работы:
Есть файл чертежа, с которым работают например:
test.dwg
Когда срабатывает автосохранение, оно создает другой файл в папке автосохранений:
test_1_1_1191.sv$
При этом test.dwg не обновляется весь день.(100% юзеров не заставить нажимать сохранить, это читсто их желание, с которым даже не стоит бороться)

Через заданные промежутки времени автосейв заменяет файл test_1_1_1191.sv$.

Если автокад глюкнет, то test.dwg останется такой-же, как во время запуска и восстановление пойдет из test_1_1_1191.sv$. на момент последнего автосейва

Если нажать сохранить файл, то обновиться test.dwg и удалиться test_1_1_1191.sv$.

Если в конце дня пользователь не нажал "_qsave" и вышел, отказавшись от сохранения, то test.dwg будет неизменным как при запуске, а файл test_1_1_1191.sv$ будет удален, т.е. информация полностью потеряется!.

Если сработало автосохранение, после которого пользователь нажал "_qsave", то файл test_1_1_1191.sv$ удалиться, а test.dwg обновиться. Но при этом если до следующего автосейва произойдет глюк с test.dwg и автокадом, то мы потеряем и test_1_1_1191.sv$ и test.dwg

Т.е. нужно именно в момент сохранения. (Тут не важно, юзер или автосейв сохранил), сделать копию, ничего не затирая.


Оффлайн Doublefish

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: autosave
« Ответ #33 : 29-05-2015, 14:01:04 »
Я вот подумал, почему мне не понадобилось так делать bak файлы на 2-3 дня - потому что  файлы за предыдущие дни можно восстановить из ночного бекапа, а если документы в системе электронного документооборота, то и за несколько месяцев можно восстановить + определенная папка с баками на локальных компах. Как показала практика обычно файлы восставливась из папки баков номально если была нажата кнопка сохранить в автокаде. Но были пользователи которые  целый день работали и ни разу не нажали сохранить - максимум что можно потерять это один день в этом случае, но это уже совсем единичные случаи были (1 раз в несколько лет всречалось).

У вас прямо онлайн проектирование идет что ли с необходимостью не потерять и 10 минут?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #34 : 29-05-2015, 14:04:44 »
У вас прямо онлайн проектирование идет что ли с необходимостью не потерять и 10 минут?
Бэкап делается один раз ночью. Если под конец рабочего дня у юзера повреждается файл, то у твоего пользователя работа целого дня идёт насмарку. Именно в виду этой проблемы (прежде всего) я и написал своё решение.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #35 : 29-05-2015, 14:10:30 »
Вообще-то имя сохранённого файла будет e.FileName. В случае AutoSave оно будет отличаться от doc.Name
Я показывал вариант, когда очередное сохранение не затирает предыдущие. Для этого генерировал новое имя на основе даты и времени.

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: autosave
« Ответ #36 : 29-05-2015, 14:13:33 »
Я показывал вариант, когда очередное сохранение не затирает предыдущие. Для этого генерировал новое имя на основе даты и времени.
Я не об этом, а о том в какое имя файла произошло сохранение. В случае автосохранения e.Filename содержит что-то типа "test_1_1_1191.sv$" (если мне не изменяет память). И именно этот файл, а не doc.Name нужно копировать (файл doc.Name не изменился если e.Filename != doc.Name)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #37 : 29-05-2015, 14:19:18 »
максимум что можно потерять это один день в этом случае, но это уже совсем единичные случаи были (1 раз в несколько лет всречалось)
1 день это непозволительная роскошь, когда счет сдачи проекта идет на часы и нет времени на исправления!
Цена 1 дня может быть судебные издержки, потеря заказчика, задержка выплат и т.д.
Для ИТ это жалоба бабушки директору, на то, то автокад неправильно настроен! То что в конце рабочего дня утомленной бабушкой не нажата клавиша и автокад сам удалил файл автосохранения, это никого не волнует. Можно долго спорить кто виноват, но скорее всего была и есть возможность сделать систему стабильнее и менее зависимой от человеческого фактора, и этим нужно воспользоваться.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: autosave
« Ответ #38 : 29-05-2015, 14:34:07 »
isavepercent установить в 0 или 100, а не в 50 - не то?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: autosave
« Ответ #39 : 29-05-2015, 14:37:58 »
isavepercent установить в 0 или 100, а не в 50 - и всех делов.
Это необходимое, но недостаточное условие для того, чтобы не потерять файл. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: autosave
« Ответ #40 : 29-05-2015, 14:38:55 »
У меня ощущение, что установка этой переменной снимет не меньше половины головной боли "ай-яй-яй, ничего не сохранилось, восстанавливайте как хотите" ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Doublefish

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: autosave
« Ответ #41 : 29-05-2015, 14:49:31 »
Кстате у нас ISAVEPERCENT у всех стоит = 0 и я не смог вспомнить ни одного случая за последние 5 лет чтобы из bak файла не удалось восстановить файл.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #42 : 29-05-2015, 14:51:56 »
чтобы из bak файла не удалось восстановить файл
Не охота включать создание bak файлов. Это сильно упрощает задачу восстановления, но ведет к дублированию информации на рабочих компьютерах и сетевых хранилищах.

Оффлайн Doublefish

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: autosave
« Ответ #43 : 29-05-2015, 14:55:15 »
Эээ, в смысле у вас у всех пользователей снята галочка Создавать резервные копии ?

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #44 : 29-05-2015, 14:59:20 »
чка Создавать резервные копии ?
У кого как. Пользователи ее сами могут убрать, т.к. некоторых бесит создание левых файлов. А в случае восстановления бегут к нам.
Смешивать рабочую информацию с резервной, которая мешает все время при проектировании, поиске файлов, операциях копирования и т.д. и нужна только в исключительных случаях, более чем странное решение Autodesk.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: autosave
« Ответ #45 : 29-05-2015, 15:06:39 »
Вообще-то *.bak для того и существуют, чтобы при необходимости восстановить результаты работы. ИМХО решение сводится к установке isavepercent в 0 и savebak в 1. Принудительной автоматической установке.
Откровенно говоря, у меня крепнет подозрение, что надо не программу писать, а технологию проектирования чинить.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Doublefish

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: autosave
« Ответ #46 : 29-05-2015, 15:11:22 »
Откровенно говоря, у меня крепнет подозрение, что надо не программу писать, а технологию проектирования чинить.
+1
bak файлы пишутся в заданную папку и файлы не мешаются и не путаются, в эту папку заходят очень редко и только по необходимость восстановить определённый bak файл и кстате уже давно не бегают и не обращаются потому что давно написано и уже знают что восстанавливать именно там.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #47 : 29-05-2015, 15:15:44 »
Вообще-то *.bak для того и существуют, чтобы при необходимости восстановить результаты работы. ИМХО решение сводится к установке isavepercent в 0 и savebak в 1. Принудительной автоматической установке.
Откровенно говоря, у меня крепнет подозрение, что надо не программу писать, а технологию проектирования чинить.

Технология проектирования и логика бэкапов Автодеска, это 2 совершенно различные вещи.
Вы хотели бы, чтобы точки восстановления Windows маячили во всех папках файлов? Это то-же самое.
Бэкап должен идти не мешая процессу проектирования не попадаясь на глаза до того момента, когда потребуется что-то восстановить.
Рабочая папка и папка бэкапов, это 2 различные папки в разных местах.
Другой логики я не наблюдаю.
Если это сделано в целях удобства пользователей, типа глюк, а вот и резервная копия, то я скорее вижу что Автодеск признает, что проблемы с сохранением файлов слишком частые, для этого и вывели в одну папку.

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #48 : 29-05-2015, 15:18:04 »
bak файлы пишутся в заданную папку
Хм, тогда вопрос, где настроить, чтобы bak файл попадал в указанную папку, а не папку с чертежом.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 950
  • Карма: 155
Re: autosave
« Ответ #49 : 29-05-2015, 15:21:47 »
Технология проектирования и логика бэкапов Автодеска, это 2 совершенно различные вещи.
Но связанные.
Вы хотели бы, чтобы точки восстановления Windows маячили во всех папках файлов? Это то-же самое.
Не то же самое.
Бэкап должен идти не мешая процессу проектирования не попадаясь на глаза до того момента, когда потребуется что-то восстановить.
При открытии через AutoCAD файла dwg он и не виден.
абочая папка и папка бэкапов, это 2 различные папки в разных местах.
Кто сказал? Лично я, например, против команды _movebak (причины Андрей Бушман уже описывал). В каталоге лежит два файла: test.dwg - рабочий и test.bak - страховая копия.
Если это сделано в целях удобства пользователей, типа глюк, а вот и резервная копия,
В MS Excel / MS Word тоже можно настроить создание резервных копий файлов в разных вариантах. У MS тоже глюк?
проблемы с сохранением файлов слишком частые
С загаженными файлами - вполне вероятно. В нормально организованных файлах подобное обычно не наблюдается.

Сугубо ИМХО: написание программы в текущих условиях и без их изменения - всего лишь откладывание коллапса. Когда сработает эффект удержания, станет совсем грустно.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Doublefish

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Re: autosave
« Ответ #50 : 29-05-2015, 15:22:24 »
Хм, тогда вопрос, где настроить, чтобы bak файл попадал в указанную папку, а не папку с чертежом.

Написано же на первой странице - movebak

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: autosave
« Ответ #51 : 29-05-2015, 15:27:15 »
Написано же на первой странице - movebak
Можно создать свой аналог этой команды, расширив её возможности. Например, создавая в каталоге с чертежом подкаталог BAK, в который будут попадать bak-файлы, а при необходимости и файлы автосохранения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #52 : 29-05-2015, 15:34:02 »
Написано же на первой странице - movebak
При активации создания bak файлов есть 2 типа файлов, одни в папке автосохранения, актуальны через заданные промежутки времени, и одна копия в текущей папке, которая не реагирует на автосохранение, только на нажатие сохранить, что полностью зависит от пользователя.

В принципе Вы подсказали еще одно решение. Включить bak. Но отлавливать сохранение и удалять bak в основной папке. Тогда места хранения не будут зарастать дубликатами. А в папке автосохранений будут дубликаты bak. Их autosave не удаляет.)

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: autosave
« Ответ #53 : 29-05-2015, 17:25:45 »
Откровенно говоря, у меня крепнет подозрение, что надо не программу писать, а технологию проектирования чинить.
+1. Я что-то подобное опубликовывал здесь и вот ещё дополнительно.

2 Привалов Дмитрий,

Что касается имён аля "test_1_1_1191.sv$", то они не информативны. Как определишь, какой из них относится к тому DWG, который хочешь восстановить, если каталог содержит *.sv$ всех файлов проекта?

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

  • ADN Club
  • *****
  • Сообщений: 579
  • Карма: 138
    • ПГСу Бложик
Re: autosave
« Ответ #54 : 30-05-2015, 17:48:51 »
Скорее вредна,о чем мы с тобой недавно говорили.
А можно и остальным узнать, чем вредна?

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

  • Administrator
  • *****
  • Сообщений: 13175
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: autosave
« Ответ #55 : 30-05-2015, 19:36:59 »
А можно и остальным узнать, чем вредна?
Вредно работать с базой (Database) в методе Initialize, т.к. он может быть вызван еще до того, как база полностью сконструирована (в случае если загрузка сборки прописана в реестре) и к ней можно будет обращаться не опасаясь Fatal Error.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов ДмитрийАвтор темы

  • ADN Club
  • ****
  • Сообщений: 490
  • Карма: 107
Re: autosave
« Ответ #56 : 01-06-2015, 07:23:05 »
Что касается имён аля "test_1_1_1191.sv$", то они не информативны. Как определишь, какой из них относится к тому DWG, который хочешь восстановить, если каталог содержит *.sv$ всех файлов проекта?
Предполагаю что это не проблема, т.к. это архив за 1-3 дня. Более поздние файлы будут автоматически удаляться. За это время проектировщики успеют поработать только с десятком файлов.