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

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


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 пользователей

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




  • Сообщения

    • Bot
      Peugeot Sport Aims for the Endurance Racing Finish Line with Simulation from Dassault Systèmes Просмотр полной статьи
    • gudstartup
      если нет Fтогда это состояние предупреждения а не ошибки которое говорит о том что вентилятор возможно замедлил свое вращение. если у вас современная система серий 31ib  0if 0ifplus тогда вы можете посмотреть скорости вращения ваших вентиляторов 1714 Speed of radiator cooling fan(FAN1) for Servo amplifier 1715 Speed of radiator cooling fan(FAN2) for Servo amplifier если нагрузка 54% то радиатор и не должен быть холодным вопрос в том до какой температуры он нагревается 
    • boomeeeer
      @Deunet @wega7777 И то и другое уже выкладывалось давно в этой теме Вот сеттинг тул https://disk.yandex.ru/d/QLGNRDa9yob2tg , пикчер тоже лежит если вверх по ветке пробежаться. Последняя версия, которую я выкладывал вроде 10.9 была, сейчас уже 11.1 есть, некогда пока скачивать
    • paull3
      Добрый день, спасибо за помощь, но вот как раз дискеты нет, если у Вас есть возможность и время - подскажите где можно её найти- приобрести
    • Koels
      А ой извиняюсь, в состоянии покоя "0" Там в стоке два вентилятора стоит, меняли на оригинал. Они крутятся, переставляли на другие привода с такими же вентеляторами, по ним ошибки не выскакивали. Моё изначальное предложение что перегревается сам сервопривод перегревается, но ошибки на индикации нету, и доп охлаждение уже поставили. Странная ситуация в общем.
    • gudstartup
      так у вас есть индикация F. на индикаторе привода или нет я так и не прочитал ответа? Если есть то почему не устраняете?
    • Rinum
      Здравствуйте! Наткнулся на данное оформление размерной цепи от общей базы. Однако, не нашел, как в компасе сделать также. Подскажите пожалуйста, в программе предусмотрено аналогичное оформление?
    • Anat2015
      Дискету FC (Final Config) попробуйте загрузить (вставить в дисковод и включить станок). Проверить батарейки сзади в шкафу ЧПУ.
    • wega7777
      Тоже бы не отказался ,если бы кто поделился.
    • ID_Hacker
      Нужно больше информации. Есть ли PCU50 или у вас Integrated HMI. Подключитесь компьютером к NCU в X127 разъём Ethernet и попробуйте VNC клиентом подключиться на эти адреса 192.168.215.1:5900, 192.168.214.1:5900, 192.168.214.241:5900. Возможно вы изменили настройки станочной сети, и теперь у вас TCU не соединяется либо с PCU50 либо с NCU
×
×
  • Создать...