| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

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

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

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

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


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


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

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для 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
Санкт-Петербург
Сообщений: 2,588


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


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


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

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


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

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


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

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для 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
Санкт-Петербург
Сообщений: 2,588


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

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


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

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для 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
Сообщений: 11,004


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

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


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


Замечания к реализиции:
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
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


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


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


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

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


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

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

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

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


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


Попробуйте временно
Код:
[Выделить все]
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
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для 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
Сообщений: 11,004


В общем, примерно так код должен выглядеть. Разбирайтесь - что непонятно, смотрите на сайте Бушмана Андрея по ссылке из поста №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
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Сергей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