Schöck
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VB.NET сохранение файла при закрытии крестом.

VB.NET сохранение файла при закрытии крестом.

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 18.01.2018, 14:54 #1
VB.NET сохранение файла при закрытии крестом.
gizmo_zx
 
Проектировщик ЭО,ЭМ, ЭОС
 
Нижний Новгород
Регистрация: 18.07.2007
Сообщений: 209
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™

gizmo_zx вне форума Вставить имя

Бодрого дня.
Может у кого есть готовое решение?
Если файл был открыт более 30 мин, при закрытии его крестом (выбран без сохранения) сохранить копию по месту расположения файла с расширением ".bak+"
Просмотров: 2475
 
Непрочитано 18.01.2018, 15:02
1 | #2
trir


 
Регистрация: 18.12.2010
Сообщений: 2,909


https://sites.google.com/site/bushma...ocument-events
trir вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 18.01.2018, 15:12
#3
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 209
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


Поправлюсь тогда, вроде как можно даже на VBA.

С моментом закрытия понял.
Код:
[Выделить все]
     Private Sub AcadDocument_BeginDocClose(Cancel As Boolean)
         ' Эта процедура обрабатывает событие BeginDocClose объекта Document.
      
         If MsgBox("The document is about to be closed." & _
                   vbLf & "Do you want to continue?", vbYesNo, _
                   "Close Document") = vbNo Then
      
                ' Запрещаем закрывать документ
                Cancel = True
        End If
    End Sub
А как отследить как долго открыт документ? ( на VBA)
Гонять свой таймер?
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.01.2018, 15:46
#4
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 1,774


Подпишитесь на события открытия, закрытия и сохранения файла, при открытии запоминайте имя и время, обновляйте время при сохранении и проверяйте прошло ли 30 минут при закрытии.
В чем сложность то?
__________________
_бложиг
Boxa на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.01.2018, 15:50
#5
trir


 
Регистрация: 18.12.2010
Сообщений: 2,909


когда открываешь файл, создаются два файла с расширениями dwl и dwl2 - время их создания = время открытия
trir вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 18.01.2018, 15:57
#6
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 209
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


А как это будет на VBA?
AcadDocument_Activate ? это вроде активация окна документа, а не открытие...
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.01.2018, 16:03
1 | #7
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 1,774


1. Причем тут VBA?
2. Вам ссылку на перевод документации дали, там все есть. Вы её смотрели?
__________________
_бложиг
Boxa на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 18.01.2018, 16:25
#8
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 209
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


1. По ссылке https://sites.google.com/site/bushma...ocument-events
есть кусок кода на VBA. На VBA мне было бы проще. Или я чего-то не понял !?
2. Ссылку смотрел, но не нашел события открытия документа
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.01.2018, 16:40
1 | #9
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 1,774


Хреново документацию листали...
Вот ссылка: https://sites.google.com/site/bushma...lection-events
Вот события:
DocumentCreated Срабатывает при создании окна документа. Возникает после создания нового рисунка или открытия существующего.
DocumentCreateStarted Срабатывает перед тем как окно документа будет создано. Возникает перед созданием нового рисунка или открытием существующего.
__________________
_бложиг
Boxa на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 19.01.2018, 07:52
#10
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 209
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


Offtop: Балбес. Согласен.
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 23.01.2018, 12:39
#11
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 209
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


Итого:
Файл "acad.dvd" загружается автоматом.
Сохраняю текущее время в USERS1 по AcadStartup (работаю SDI, равном 1)
При закрытии файла ( в AcadDocument_BeginDocClose ) смотрю разницу по времени (больше 30 минут) сохраняю в папку "e:\temp\"
Вроде все работает.
Отдельное спасибо Boxa

в секции module1
Код:
[Выделить все]
Public Sub AcadStartup()

    Dim sysVarTime_open As String
    Call ThisDrawing.SetVariable("USERS1", Str(Time))
End Sub

     Private Sub AcadDocument_BeginDocClose(Cancel As Boolean)
             Dim i, i2, i3, i4, ig, igt, igr As Integer
             Dim sysVarTime_open, sysVarTime_open2, filename As String

            sysVarTime_open = ThisDrawing.GetVariable("USERS1")

            i = Val(Mid(sysVarTime_open, 1, 1))
            i2 = Val(Mid(sysVarTime_open, 2, 1))
            i3 = Val(Mid(sysVarTime_open, 4, 1))
            i4 = Val(Mid(sysVarTime_open, 5, 1))
            ig = i * 1000 + i2 * 100 + i3 * 10 + i4
            sysVarTime_open2 = Str(Time)
            
            i = Val(Mid(sysVarTime_open2, 1, 1))
            i2 = Val(Mid(sysVarTime_open2, 2, 1))
            i3 = Val(Mid(sysVarTime_open2, 4, 1))
            i4 = Val(Mid(sysVarTime_open2, 5, 1))
            igt = i * 1000 + i2 * 100 + i3 * 10 + i4
            
            igr = igt - ig
            If igr > 30 Or igr < 0 Then

            filename = ThisDrawing.Application.ActiveDocument.Name
            ThisDrawing.SaveAs "e:\temp\" & filename
            End If
    End Sub
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.01.2018, 14:37
#12
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 5,238


а зачем в User1 сохранить? Не проще время последнего сохранения файла посмотреть?

----- добавлено через ~4 мин. -----
и тогда уж сохранять как версии файлов %Имя файла%_%Дата и время бекапа%. Прошло то время давно, когда винчи было по 40мб)
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.01.2018, 15:55
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 5,238


Замечания к реализиции:
1. Уверены - что переменная Users1 не будет использована в каком нибудь стороннем лиспе, порушив работу автоматизации?
2. Много лишнего кода, дублирующего функционал самого VBA
Код:
[Выделить все]
ThisDrawing.SetVariable("USERS1", Str(Time))
заменяем на
ThisDrawing.SetVariable("USERS1", Time$())
а простыню
Код:
[Выделить все]
sysVarTime_open = ThisDrawing.GetVariable("USERS1")

i = Val(Mid(sysVarTime_open, 1, 1))
i2 = Val(Mid(sysVarTime_open, 2, 1))
i3 = Val(Mid(sysVarTime_open, 4, 1))
i4 = Val(Mid(sysVarTime_open, 5, 1))
ig = i * 1000 + i2 * 100 + i3 * 10 + i4
sysVarTime_open2 = Str(Time)
i = Val(Mid(sysVarTime_open2, 1, 1))
i2 = Val(Mid(sysVarTime_open2, 2, 1))
i3 = Val(Mid(sysVarTime_open2, 4, 1))
i4 = Val(Mid(sysVarTime_open2, 5, 1))
igt = i * 1000 + i2 * 100 + i3 * 10 + i4
igr = igt - ig
If igr > 30 Or igr < 0 Then
заменяем на
Код:
[Выделить все]
if(DateDiff("n", TimeValue(ThisDrawing.GetVariable("USERS1")), Time())>30)then
3. Если файл открыт только для чтения - зачем его сохранять? (см. ThisDrawing.ReadOnly)

4. Если в файле нет изменений - аналогично? (см. ThisDrawing.Saved)

5. Я бы все таки делал бекап не на VBA, и реализовывал бы сохранение каждые n минут в формате %Имя файла%_%Дата и время% (т.е. замена стандартному автосохранению с осмысленными именами).
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 24.01.2018, 16:46
#14
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 209
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


Спасибо за критику.
По Users1 не смог найти другого варианта, как сохранить переменную в текущем сеансе акада.
Вариант с (ThisDrawing.Saved) вероятно будет лучше.
А вообще это все задумалось после случайного закрытия файла и отказа от сохранения (ошибочно)
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.01.2018, 18:15
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 5,238


По идее надо в событии перед закрытием файла скопировать текущее состояние чертежа во временный файл, при этом давая возможность пользователю дальше в штатном режиме получить запрос на сохранение файла и сделать выбор. В .Net это делается элементарно:
Код:
[Выделить все]
using (Database lCopyDb = lCurrentDb.Wblock())
{
    lCopyDb.SaveAs(%Имя файла резервной копии%, DwgVersion.Current);
}
а дальше просто проверять при открытии файла: если во временном хранилище файл более свежий, чем открываемый - сообщать об этом пользователю с предложением выбора. Только надо соблюдать определенные правила при работе с событиями. Естественно, в хранилище файл должен идентифицировать однозначно - а не только по собственному имени.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 25.01.2018, 10:52
#16
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 209
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™


Хелп ми. Я все сломал.
И образец запорол.

Перестал выполняться при загрузке.

Public Sub AcadStartup()
ThisDrawing.SetVariable "USERS1", Time$()
End Sub

В консоли пишет "*прервано"
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.01.2018, 11:11
#17
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 5,238


Попробуйте временно
Код:
[Выделить все]
Public Sub AcadStartup()
ThisDrawing.SetVariable "USERS1", Time$()
End Sub
заменить на
Код:
[Выделить все]
Public Sub AcadStartup()
  Dim lTime String
  lTime = Time$()
End Sub
проверить просто - работает ли функция Time$ (может чего то не успевает загрузиться к моменту ее вызова).

p.s. я бы не связывался с VBA в системе, работающей на событиях) Да и неправильная реализация получается у вас - человек хочет честно сохранить файл при закрытии, а прошло полчаса - и файл сохранен уже в другом месте. И при нажатии сохранить он будет обновлен в папке "e:\Temp", надо выбирать "сохранить как" и искать исходный файл.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 25.01.2018, 12:47
#18
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 209
Отправить сообщение для gizmo_zx с помощью ICQ Отправить сообщение для gizmo_zx с помощью Skype™



не работает даже вывод в консоль
ThisDrawing.Utility.Prompt "Acad Startup Scripts Completed. !USERS1" & vbCrLf

Видимо чертеж еще не успевает открыть ?
И ещё. Уже в открытом чертеже пишу в переменную в одном макросе
ThisDrawing.SetVariable "USERS1", Str(Time)

Читаю в другом
sysVarTime_open = ThisDrawing.GetVariable("USERS1")
Все ок! выдает время.

В консоли Autocad
"!USERS1" выдает nul
Я ожидал тоже получить время
gizmo_zx вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.01.2018, 14:29
#19
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 5,238


В общем, примерно так код должен выглядеть. Разбирайтесь - что непонятно, смотрите на сайте Бушмана Андрея по ссылке из поста №2 от trir. И это надо обкрутить автозагрузкой и событиями создания/удаления документа - сейчас это вручную делается командами "SetControlEventDoc" и "ResetControlEventDoc". Все есть на том же сайте. И не страдайте фигней в VBA - он сам по себе глючный, чтобы в нем еще с событиями извращаться. VBA - язык программирования для Office.

Код:
[Выделить все]
// Windows
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

// AutoCAD
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;

namespace AutosaveChangedDrawingDemo
{
    public class CommandClass
    {
        /// <summary>
        /// Путь к временным сохранениям файла
        /// </summary>
        private const string PathTempSaveFiles = @"d:\TSF";

        /// <summary>
        /// Флаг изменения чертежа
        /// </summary>
        private static bool _IsModifiedDoc = false;
        
        /// <summary>
        /// Команда установки отслеживания событий чертежа
        /// </summary>
        [CommandMethod("SetControlEventDoc")]
        public static void SetControlEventDoc()
        {
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            acDoc.CommandWillStart += 
                new CommandEventHandler(CommandWillStartEvent);
            acDoc.BeginDocumentClose += 
                new DocumentBeginCloseEventHandler(BeginDocumentCloseEvent);
        }

        /// <summary>
        /// Команда отмены отслеживания событий чертежа
        /// </summary>
        [CommandMethod("ResetControlEventDoc")]
        public static void ResetControlEventDoc()
        {
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            acDoc.CommandWillStart -= 
                new CommandEventHandler(CommandWillStartEvent);
            acDoc.BeginDocumentClose -=
                new DocumentBeginCloseEventHandler(BeginDocumentCloseEvent);
        }

        /// <summary>
        /// Обработчик события начала команды
        /// </summary>
        /// <param name="sender">Документ, вызвавший событие</param>
        /// <param name="e">Дополнительные аргументы</param>
        private static void CommandWillStartEvent(object sender, CommandEventArgs e)
        {
            _IsModifiedDoc = !((sender as Document).IsReadOnly || 
                (System.Convert.ToInt16(Application.GetSystemVariable("DBMOD")) == 0));
        }

        /// <summary>
        /// Обработчик начала закрытия документа
        /// </summary>
        /// <param name="sender">Документ, вызвавший событие</param>
        /// <param name="e">Дополнительные аргументы</param>
        private static void BeginDocumentCloseEvent(object sender, 
            DocumentBeginCloseEventArgs e)
        {
            // Если документ был изменен
            if (_IsModifiedDoc)
            {
                // Получаем документ и его БД
                Document acDoc = (Document)sender;
                Database acDb = acDoc.Database;
                // Формируем имя временного файла
                string lNameTempFile = Path.Combine(PathTempSaveFiles,
                    Path.GetFileName(acDb.Filename));
                // Подготовка к созданию теневой копии
                try
                {
                    // Создаем папку для временных файлов в случае ее отсутствия
                    if (!Directory.Exists(PathTempSaveFiles))
                        Directory.CreateDirectory(PathTempSaveFiles);
                    // Если файл существует - удаляем его
                    if (File.Exists(lNameTempFile)) File.Delete(lNameTempFile);
                }
                catch (System.Exception ex)
                {
                    Application.ShowAlertDialog(String.Format(
                        "\nОшибка [{0}] при создании теневой копии!", ex.Message));
                    return;
                }
                // Ну и собственно сохраняем текущее состояние файла в теневой копии
                try
                {
                    using (Database lTempDb = acDb.Wblock())
                    {
                        lTempDb.SaveAs(lNameTempFile, DwgVersion.Current);
                    }
                }
                catch (Autodesk.AutoCAD.Runtime.Exception ex)
                {
                    Application.ShowAlertDialog(String.Format(
                         "\nОшибка [{0}] при создании теневой копии!", ex.Message));
                }
            }
        }
    }
}

Последний раз редактировалось Сергей812, 25.01.2018 в 15:36.
Сергей812 вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.01.2018, 14:41
#20
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 1,774


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
И это надо обкрутить автозагрузкой и событиями создания/удаления документа - сейчас это вручную делается командами "SetControlEventDoc" и "ResetControlEventDoc"
Тут есть шаблончик: ссылка
__________________
_бложиг
Boxa на форуме вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VB.NET сохранение файла при закрытии крестом.

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос имени редактировавшего при закрытии dwg файла Raznouh AutoCAD 16 02.11.2015 05:02
Проблемный файл, не работает буфер обмена и сохранение файла KOT404 AutoCAD 26 13.01.2014 07:58
Помогите отключить принудительное сохранение при закрытии файла! Gizmo2k AutoCAD 7 27.07.2011 10:45
Как отключить автосохранение при закрытии файла? fenix72 AutoCAD 2 25.10.2010 11:24
Как отключить создание каждый раз нового файла .bak при нажатии на кнопку "Сохранить" или при закрытии любого файла .dwg в Автокад 2008? gve2005 AutoCAD 4 30.10.2009 10:30

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||