Перейти к публикации

Задача сравнения файла при открытии со вторым


xenocephal

Рекомендованные сообщения

Здравствуйте, уважаемые жители форума.

 

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

Пытался решить ее посредством диспатча, но столкнулся с рядом проблем:

1. Отсутствие инициации действия при открытии файла.

2. Не понятно как описать действие поиска одноименного файла в той же папке.

3. Конвертация времени изменения файла в численный формат для сравнения. 

 

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

Изменено пользователем xenocephal
Ссылка на сообщение
Поделиться на других сайтах
  • 3 недели спустя...


В 18.04.2019 в 11:32, xenocephal сказал:

Здравствуйте, уважаемые жители форума.

 

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

Пытался решить ее посредством диспатча, но столкнулся с рядом проблем:

1. Отсутствие инициации действия при открытии файла.

2. Не понятно как описать действие поиска одноименного файла в той же папке.

3. Конвертация времени изменения файла в численный формат для сравнения. 

 

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

Думаю всё же эту задачу решить только в add-in, то есть писать приложение самому.

Алгоритм примерно такой:

- перехватываете событие. События описаны здесь http://help.solidworks.com/2015/english/api/epdmapi/EPDM.Interop.epdm~EPDM.Interop.epdm.EdmCmdType.html

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

- далее всё не сложно: у вас есть имя исходного файла, поиск такого же, но с другим расширением, сравнение дат модификации (опять же в последних версиях файлов или нет?). 

Проблема будет такая: подтягивать ли клиенту последние версии файлов принудительно или нет? Не всегда принудительное подтягивание последних версий идёт на пользу. ПДМ это не совсем Проводник, в нём свои законы и свойства файлов.

 

Ссылка на сообщение
Поделиться на других сайтах

Благодарю за ответ! Очень Вам признателен за предоставленную информацию, буду разбираться.

Вам всяческих успехов и доброго здравия!

Ссылка на сообщение
Поделиться на других сайтах
  • 3 недели спустя...

@tensh1 Трудность не в том, что столбец не устраивает, а в том, что если время изменения в Dispatch (%TimeFileModified%) и можно трансформировать в численный формат и задать соответствующую переменную для выделенного файла, то задать соответствующую переменную для файла с тем же именем но другим расширением в той же папке уже сложнее. 

Я попробовал получить эти переменные с помощью локальных переменных Dispatch задав путь и имя файла для задания глобальной переменной, но успеха это не принесло.3.jpg.115018edf5d12dd070d9b5106a1ff123.jpg1.jpg.dce8bfde0c0c9ea9a48038fd2a5c961e.jpg2.jpg.eb9b722544246e4fd9a6789280bf6ca0.jpg4.jpg.c18af7ca8bd89212f7c9f02ff79bd942.jpg

Кроме того до сих пор не ясно как инициировать действие при открытии файла. 

Хочу попробовать через API EdmCmd_PreGet

Ссылка на сообщение
Поделиться на других сайтах

@tensh1 Благодарю за ответ. Правильно ли я понимаю, что данный скрипт для всех выделенных файлов устанавливает значение переменной "Album" равное дате изменения файла?

Ссылка на сообщение
Поделиться на других сайтах

@xenocephal Да, все верно. Единственное, что забыл уточнить - для того, чтобы не дописывать алгоритм /разрегистрация файла - запись переменной - регистрация файла/, переменную необходимо сделать "Независимой от версии", соответственно, у человека, который запускает данную процедуру, должны быть права на редактирование переменных, независимых от версии.

Ссылка на сообщение
Поделиться на других сайтах

@tensh1 Благодарю за пояснение.

Это, конечно, здорово. Правда, пока не могу понять как применить в своей задаче.

Ведь полностью она звучит так: когда пользователь PDM открывает некий файл чертежа PDF, автоматически должно происходить сравнение дат изменения данного файла с одноименным файлом в формате DWG. Если файл DWG был изменен позже файла PDF, то должно выскакивать сообщение о том, что исходный чертеж был изменен. 

Но, похоже, я уже примерно представляю как реализовать это с помощью API.

Ссылка на сообщение
Поделиться на других сайтах
  • 1 месяц спустя...

Наконец-то разобрался с задачей и написал работающий код. У себя сделал в виде приложения 

Если кому нужно, то вот:

 

Показать  

using System;
using System.IO;
using System.Runtime.InteropServices;
using EdmLib;

namespace Program
{
    // Формируется через Tools - Create GUID
    [Guid("34024507-0883-43A1-9AE4-284B8B0D1103")]
    [ComVisible(true)]
    
    public class Class1 : IEdmAddIn5
    {
        // Описательный блок
        public void GetAddInInfo(ref EdmAddInInfo poInfo, IEdmVault5 poVault, IEdmCmdMgr5 poCmdMgr)
        {
            // Информация о приложении
            poInfo.mbsAddInName = "Add-in Name";
            poInfo.mbsCompany = "Company";
            poInfo.mbsDescription = "";
            poInfo.mlAddInVersion = 1;
            
            // Допустимые версии PDM
            poInfo.mlRequiredVersionMajor = 15;
            poInfo.mlRequiredVersionMinor = 1;          
           
            // Триггер события ПОСЛЕ получения файла из хранилища
            poCmdMgr.AddHook(EdmCmdType.EdmCmd_PostGet);
        }
        
        // Исполнительный блок при активации триггера
        public void OnCmd(ref EdmCmd poCmd, ref Array ppoData)
        {
            // Описание хранилища
            IEdmVault5 vault = (IEdmVault5)poCmd.mpoVault;
            
            // Описание папки
            IEdmFolder5 ParentFolder;
            
            // Описание файла
            IEdmFile5 file;
            string name = "";                             

            // Выбор действия при разных типах meCmdType перехватываемых команд poCmd
            if (poCmd.meCmdType == EdmCmdType.EdmCmd_PostGet)
            {
                name = "";

                foreach (EdmCmdData AffectedFile in ppoData)
                {
                    // Получение данных выделенного файла из хранилища 
                    file = vault.GetFileFromPath(AffectedFile.mbsStrData1, out ParentFolder);
                    
                    // Получение пути файла
                    string filepath = file.GetLocalPath(ParentFolder.ID);

                    // Получение расширения файла из пути
                    string ext = filepath.Substring(filepath.Length - 4);

                    // Если полученный файл имеет расширение PDF, то файл DWG 
                    // получается из хранилища, а так же считываются даты изменения обоих файлов,
                    // сравниваются и если DWG был изменен позже чем PDF, то создается сообщение
                    if (ext == ".pdf")
                    {
                        try
                        {
                            // Создание пути для DWG и описание файла как FileInfo
                            string pathDWG = filepath.Replace(".pdf", ".dwg");

                            // Описание файла в виде объекта FileInfo для получения свойств
                            FileInfo localfile = new FileInfo(filepath);
                            FileInfo localDWG = new FileInfo(pathDWG);
                            
                            // Получение файла DWG
                            IEdmFile5 fileDWG = vault.GetFileFromPath(pathDWG, out IEdmFolder5 PFolder);
                            fileDWG.GetFileCopy(0, 0);
                            
                            // Получение дат изменения локальных файлов
                            DateTime date1 = localfile.LastWriteTime;
                            DateTime date2 = localDWG.LastWriteTime;
                            
                            // Сравнение дат изменения файлов и активация действия
                            if (date1 < date2)
                            {
                                // Сообщение для вывода
                                name += string.Format("Файл {1} был отредактирован. Необходимо актуализировать файл {0}.", file.Name, fileDWG.Name); 


                                // Вывод сообщения
                                vault.MsgBox(poCmd.mlParentWnd, name, EdmMBoxType.EdmMbt_Icon_Warning, "ВНИМАНИЕ!");
                            }                               

                        }
                        catch (Exception)
                        {

                        }
                    }
                }                   
            }            
        }
    }
}
 

Hide  
Ссылка на сообщение
Поделиться на других сайтах

Чем не устраивает поток работы с утверждением? Если файл чертежа был изменён это значит, что у него новая редакция и новое состояние. Можно опросить файл чертежа на предмет изменения состояния.

Ссылка на сообщение
Поделиться на других сайтах

@Maze не уверен, что понял Ваш подход в решении, вы имеете ввиду сравнивать дату изменения открываемого файла с датой перевода файла чертежа в соответствующее состояние?

Ссылка на сообщение
Поделиться на других сайтах

Состояние.

Если файл изменили, то его перевели в другое состояние (доработка к примеру). Таким образом файл пдф утратил актуальность. Что делать с таким файлом выберите сами.

 Можно после утверждения заново автоматом сгенерить пдф инструментом пдм

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...