Читаем данные из открытой части файлов КОМПАС-3D для интеграции с Pilot-ICE

    Файлы КОМПАС-3D содержат информацию о документе: наименование и обозначение чертежа, фамилию разработчика, проверяющего и утверждающего, вид документа, формат, количество листов. Когда на предприятии используется система для автоматизации документооборота, проектировщику очень часто приходится вводить эту информацию вручную.

    image
    Добавление документа в систему документооборота (Карточка документа)

    Данные, которые нужно ввести в карточку, уже могут быть в исходном файле, и поэтому процесс ввода можно автоматизировать.


    Библиотека для получения данных из КОМПАС-3D



    Начиная с 16-ой версии в формате данных КОМПАС-3D произошли серьёзные изменения. Во-первых, он стал более открытым, во-вторых, уменьшился размер файлов. Формат файлов КОМПАС-3D версии 16 и выше — это zip-архив, который содержит метаданные в формате XML с информацией об атрибутах и объектах данного документа. Для чтения файлов КОМПАС-3D я разработал .NET библиотеку KompasFileReader, которая опубликована под лицензией MIT [1].

    Интеграция с системой документооборота


    В качестве системы документооборота используем Pilot-ICE. Алгоритм работы пользователя в системе очень простой. Все исходные файлы при проектировании находятся на виртуальном диске Pilot-Storage, на наподобие Dropbox. Если требуется опубликовать электронный документ и выполнить его согласование, используется виртуальный принтер Pilot-XPS, в результате печати формируется электронный документ. Пользователь выбирает папку в электронном архиве и заполняет карточку документов, затем сохраняет документ в архив и выполняет его согласование (если это требуется). Но если мы работаем в системе КОМПАС-3D, грамотно и аккуратно оформляем документы и как следствие, заполняем основную надпись чертежа, то данные из основной надписи мы можем автоматически передать в карточку документа Pilot-ICE. О том, как создать подобный плагин, будет написано ниже.

    Система Pilot-ICE поддерживает возможность разработки плагинов, SDK можно скачать по ссылке в центре загрузок [3].

    Вы можете создать новый проект согласно инструкции из SDK (Documentation.html).

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

    Плагин должен использовать интерфейсы IAutoImportHandler и IObjectCardHandler. Для анализа исходного файла нужно реализовать метод Handle интерфейса IAutoImportHandler, а также для заполнения карточки — метод с точно таким же названием интерфейса IObjectCardHandler.
    Фрагмент плагина:
    namespace Ascon.Pilot.SDK.KompasAttrAutoImport
    {
        [Export(typeof(IAutoimportHandler))]
        [Export(typeof(IObjectCardHandler))]
        public class KompasAttrAutoImport : IAutoimportHandler, IObjectCardHandler, ...
        {
            ...
    		public bool Handle(string filePath, string sourceFilePath, AutoimportSource autoimportSource)
    		{
    			...
    		}
    		
    		public bool Handle(IAttributeModifier modifier, ObjectCardContext context)
            {
    			...
    		}
        }
    }
    


    Получение и анализ исходного файла


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

    public bool Handle(string filePath, string sourceFilePath, AutoimportSource autoimportSource)
    {
    	// проверка на наличая пути к исходному файлу
        if (string.IsNullOrWhiteSpace(sourceFilePath)) return false;
        // если исходный файл компас. Проверяем расширения.
        if (!IsFileExtension(sourceFilePath, CDW_EXT) 
    		return false;
        using (var inputStream = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read))
        {
    	var ms = new MemoryStream();
            inputStream.Seek(0, SeekOrigin.Begin);
            inputStream.CopyTo(ms);
            ms.Position = 0;
            if (IsFileExtension(sourceFilePath, SPW_EXT))
            {
    	    var taskOpenSpwFile = new Task<SpwAnalyzer>(() => new SpwAnalyzer(ms));
                taskOpenSpwFile.Start();
                taskOpenSpwFile.Wait();
                if (taskOpenSpwFile.Result.IsCompleted)
                {
    		var spc = taskOpenSpwFile.Result.GetSpecification;
                    spc.FileName = sourceFilePath;
                    _doc = spc;
                }
                ...
            }
            ...
        }
        return false;
    }
    


    Заполнение карточки документа


    Сразу же после печати открывается карточка документа, перехватываем её поля и заполняем на основании данных, полученных выше.
    public bool Handle(IAttributeModifier modifier, ObjectCardContext context)
    {
        var isObjectModification = context.EditiedObject != null;
        if (isObjectModification || context.IsReadOnly)
    	return false;
        if (_doc == null)
    	return false;
        var docProp = _doc.GetProps();
        foreach (var pairPilotKompasAttr in _pairPilotKompasAttrs)
        {
    	var val = docProp.FirstOrDefault(x => x.Name == pairPilotKompasAttr.NamePropKompas)?.Value;
            if (val != null)
    		modifier.SetValue(pairPilotKompasAttr.NameAttrPilot, ValueTextClear(val));
        }
        return true;
    }
    


    где _pairPilotKompasAttrs — пара значений названий атрибута в системе Pilot ICE и КОМПАС- 3D.
    * Листинги приведены в упрощённом виде, более подробно можете посмотреть на странице проекта [1].

    Демонстрация работы


    В качестве примера берём любой чертёж, который находится на Pilot-Storage.

    image
    У чертежа должна быть заполнена основная надпись

    image
    Выполняем печать на виртуальный принтер

    image
    Прекрасно! Карточка документа заполняется автоматически!

    Настройка плагина


    Для адаптации плагина под конфигурацию вашего предприятия предусмотрим возможность настройки соответствия между атрибутами КОМПАС-3D и атрибутами системы документооборота.
    Для этого можно использовать формат JSON и хранить эти данные в общих настройках системы.

    Пример настроек:
    [{
    		"NameAttrPilot": "name",
    		"NamePropKompas": "Наименование"
    	}, {
    		"NameAttrPilot": "mark",
    		"NamePropKompas": "Обозначение"
    	}
    ]
    


    где NameAttrPilot — название атрибута в системе Pilot-ICE, можно посмотреть в Pilot-myAdmin,
    NamePropKompas — название атрибута в системе КОМПАС-3D, можно узнать, открыв файл КОМПАС-3D как zip-архив и изучив файл MetaInfo.

    Ссылки:



    1. Плагин для интеграции системы Pilot-ICE с КОМПАС-3D – github.com/kozintsev/Pilot.CADReader.
    2. Pilot-ICE — система для управления проектной организацией – pilotems.com.
    3. Центр загрузок системы Pilot – pilot.ascon.ru.


    Олег Козинцев

    АСКОН

    69,47

    Крупнейший российский разработчик инженерного ПО

    Поделиться публикацией
    Комментарии 3
      0

      "грамотно и аккуратно оформляем документы, и как следствие, заполняем основную надпись чертежа, то данные из основной надписи мы можем автоматически передать в карточку документа Pilot-ICE"


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

      Но если при первой публикации еще можно придумать почему надо обязательно показать пользователю диалог, то при повторной публикации он точно не нужен. Итак понятно, что нужно новую версию ранее добавленного документа создать, надо только найти его в базе по известным атрибутам.

        +1
        Да, согласен. Хорошее предложение, добавлю в планы развития плагина.
        Ещё следует сказать о том, что, так как известно, кто разработал, проверил и утвердил чертёж, то можно сразу же понять, кто подписывает данный документ ЭЦП, получив фамилию из основной надписи и более детальную информацию из организационной структуры. Только что делать, если в организации работают однофамилицы? Не такой уж и редкий кейс.
        Создание запросов на подпись ЭЦП на основе фамилии и инициалов из основной надписи тоже в планах.
          0
          «Только что делать, если в организации работают однофамилицы?»
          >
          Для начала я бы рассмотрел жлезобетонный вариант — при публикации новой версии ранее созданного и согласованного чертежа посмотреть маршрут согласования предыдущей версии и автоматически запустить точно такое же согласование для новой.

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

      Самое читаемое