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

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


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

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




  • Сообщения

    • maxx2000
      @fenics555, я никогда не задавался таким вопросом, а можно ли отключить авторегенрацию компонентов или заморозить? Если прям опции нет, может через Тулкит или Апи?
    • fenics555
      штифты разрезные- понятно, что примонтаже изменяют размер по отверстию.  Резиновое кольцо уплотнительное- оно меняет не только диаметр наружный и внутренний, но и толщину. именно долго открываются сборки, содержащие эти изделия.  можно конечно и без нее обходиться, но мы уже привыкли. Только грузятся сборки очень долго, но это врятли из-за гибкости.
    • Viktor2004
    • UkulyAlex
      Добрый день. Работаю в t-flex 16. Имеется приспособление в котором более 150 позиций деталей, спецификация сделана по структуре изделия. Возникла необходимость изменения конструкции, некоторые детали из середины списка пришлось удалить. После обновления отчёта позиции сдвигаются, как сделать чтобы оставались на месте, т.е. был пропуск позиций в середине раздела "Детали"? 
    • статист
      Спасибо за цитату, полезная для меня   Я знал до этого способ использовать атрибуты LATT для задания направления, но они применялись только к построенным линиям. Если например рассматривать созданный элемент E, 1, 2, где для задания применяются только два узла, то тут уже никак не поменяешь положение третьего узла, так как его нет. Нужно тогда создавать отдельно направляющий узел  и задавать его через EMODIF,EID, 3, NID.   Но получается без создания узла, задать направление нельзя. В настране по крайней мере так можно. А в ансисе нужно плодить лишние узлы. Грустно)
    • FROST_R6
      Есть монорельса размером 12м. Хочу проверить перемещение при нагрузке на середину в 2 тонны. Саму монорельсу фиксировать не нужно, поэтому я поставил ее на 2 призмы и зафиксировал их. Расчет не получается провести - сначала программа пишет, что "деформация в данном исследовании слишком значительная и нереалистичная, хотите остановить программу и перезапустить исследование с меньшими нагрузками или с более жесткой моделью?". Я выбираю "нет". После долгого процесса расчета появляется сообщение о том, что "Состояние равновесия не было достигнута" и "Анализ больших смещений был остановлен до сохранения результата", появляется надпись о сбое расчета. 
    • maxx2000
      подгружаются при повторном открытии сборки или при первой вставке? Ну и гибкость сначала вызвала вопрос, но я не заметил существенной задержки при выборе способа вставки с ней или без неё.
    • Ветерок
      Я не понял зачем в этих деталях задана гибкость. При том, что новые значения размеров определяются не измерением, а вводом вручную.
    • BOJIOD9I
      Добрый день! Подскажите куда внести изменения на стойке fanuc 0i, чтобы когда вводишь коррекцию в графу износа она не отображалась на координатах. Пример: Резец точит размер 100 мм, по факту получается 101мм. В графе износ вносишь -1.0 мм. В итоге по координатам будет показано что резец точит 99мм, а по факту станет 100мм как нужно было.
    • ДОБРЯК
      Это есть в документации. Может быть эта информация будет полезна не только вам. https://www.mm.bme.hu/~gyebro/files/ans_help_v182/ans_elem/Hlp_E_BEAM188.html В этом разделе подробно написано Очень подробное описание этого элемента. Это элемент Тимошенко. Это надо учитывать используя этот элемент в расчетах. Остается только один вопрос зачем менять номер узла, если сразу можно задать нужный номер и менять его координаты?  
×
×
  • Создать...