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

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


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

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




  • Сообщения

    • Kelny
      Вероятно разблокировку делает патч с официального сайта, но не смотря на то что позиционируется для профкарт, вероятно делает описанное в видео и с другими картами:  
    • Alexey8107
      Их официальный номер пока еще работает . На нем сейчас пока еще стоит переадресация. В общем не знаю что за организация, завтра займусь наверное этим. На словах и сервисный инженер у них катается по стране. Что-то мне подсказывает сервисники остались теже . Вобщем в ближайшее время займусь, гляну по реквизитам что за организация.
    • Fedor
      "Какой эмпирико-нормативный опыт есть у человечества"  подробно этим занимались в зубчатых передачах. Но единой теории усталости не существует. Надо смотреть буквари по Деталям машин.   https://elima.ru/books/?id=3934   Вот хорошая книжка ... 
    • Борман
      При циклике вообще-то надо минимум и максимум знать. Есть ли вообще циклическая нагрузка ? В остальном Газпромовская нормативка копирует атомные нормы.   Запасы только свои, а не атомные.
    • gudstartup
      что наглухо вышел физически или ошибки в разделах? если логически то можно r-studio поковырять образ может параметры удастся  вытащить
    • gudstartup
      это как вы с ним свяжитесь? в россии представительство фанука закрыто - никакой поддержки нет и поставок тоже если покупать то через китайцев. значит руководство фанука в этот раз оказалось правым.
    • andrei_shevchenko
      Добрый день коллеги! Сделал имитационную модель в plant simulation, сейчас я ищу способы продемонстрировать модель в виртуальной реальности, и для этой цели мне было бы очень интересно, если бы я мог напрямую подключить omniverse к Siemens plant simulation. Я видел, что коннектор был представлен на одном из вебинаров nvidia, поэтому мне было интересно, может ли кто-нибудь рассказать мне о нем подробнее? И как его скачать? Ниже приведена ссылка на вебинар (начинается в 18:29, чтобы ознакомиться с частью, посвященной omniverse connector для моделирования установок и процессов). https://www.nvidia.com/en-us/on-demand/session/gtcfall21-a31571/   При создании своего сервера Nucleus, выходит ошибка  Error: [621cc28f-0997-4faf-beeb-cce360d80d81] Cannot prepare file for download, the server has returned HTTP403 for signed URL https://asset.launcher.omniverse.nvidia.com/nucleus-workstation/2023.2.3/windows-x86_64/package.zip?Expires=1717549893&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9hc3NldC5sYXVuY2hlci5vbW5pdmVyc2UubnZpZGlhLmNvbS9udWNsZXVzLXdvcmtzdGF0aW9uLzIwMjMuMi4zL3dpbmRvd3MteDg2XzY0L3BhY2thZ2UuemlwIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNzE3NTQ5ODkzfX19XX0_&Signature=I5XhGkOGlBif-bh82r~Iny5AWZ9fGxngRTZ0dSVlr4lsv-rbmDBlqHjCqtf~Z-TVrdIlLFCshOT4X7u-OekeVJiTnjJCWQLPuxR31Cf8npT3KUrgtSACPsv0XaA2IyW1XEmWTJbVbaPEYGdsqjhXnbvhGrOvLikeqfR0c767zIgY5nrPn2yrO3WTj-9DuWUlk5OnsKMQkvhYmc7xObOToQrmveOQltxHrgjZHoSP9RDtSXv07kwUJKnDFF56PkXLFTjb1c3l16nmJTAUkwcWiOLnAQGtsYvS7TTX35RgIsqq-rRx5bi51efYKfd75vodPKJe~ObTTMEsMyvwsaPfSQ__&Key-Pair-Id=K13PD0MHC2KFRP Так же видел возможность, когда на AnyLogic делали модель, через стороннее API подключали к Unreal Engine, может стоит попробовать реализовать эту задачу таким образом? Но информации о том, как это делали не нашёл. Вот статья об этом: https://stackoverflow.com/questions/73695807/co-simulation-anylogic-and-unreal-engine?newreg=aa00b11ef29c4eef952c09083c9bfb90  
    • Павлуха
      Публикатор конфигураций не пробовали?
    • malvi.dp
      Да, в эскизе можете эту линию жёстко зафиксировать нужными вам размерами. А при создании плоскости нужно выбрать ещё и вторую ссылку для позиционирования. Это может быть плоскость "спереди" с взаимосвязью перпендикулярности.  
    • noindex
      @malvi.dp спасибо, но я с SW пока "на вы" и этот пример для меня похож на урок по рисованию совы) Как я понял на перпендикулярной плоскости рисуется эскиз линия, потом Вставка, Справочная Геометрия, Плоскость и выбираем в качестве первой ссылки эту линию. У меня в этом случае плоскость пытается создаться, но не может, ругается на неверные входные данные...  https://s.mail.ru/BR5p/wbdSuVLzK
×
×
  • Создать...