::: UniChrom BEL RUS DEU ENG
Главная страница / Продукция / < Назад 

Написание собственного файлового конвертера для системы UniChrom

Пакет UniChrom-DDK предоставляет набор примеров и заголовочных файлов для создания собственного формата аналитических данных. Эта инструкция может помочь в следующих случаях:

Этот пример представляет собой самый быстрый способ написания файлвого конвертера с использованием OO библиотеки и языка ObjectPascal (FPC или Delphi) Windows или Linux - не имеет значения.

unit expmain;

interface
uses
  baseconv, // базовый класс конвертера
    cnvtypes, // константы конвертера CNV_OK, CNV_FAIL, FLAG_WRITE ... 
  ucintf; // Интерфейс к UniChrom

type
  TExpFormat=class(TBaseConv)
  public
    class function FormatName:utf8string;override;
    class function FormatFlags:integer;override;
    function Imp(hSp:hSPEC;const Fname:PChar):integer;override;
    function Exp(hSp:hSPEC;const Fname:PChar):integer;override;
  end;

implementation
uses 
   SysUtils,Classes,
   ucimp; // модуль, содержащий структуру с интерфейсом UniChrom (guc)  

{ TExpFormat }

function TExpFormat.Imp(hSp: hSPEC; const Fname: PChar): integer;
begin
  Result:=CNV_FAIL; // Мы разрабатываем экспортёр, а не импортёр
end;


function TExpFormat.Exp(hSp: hSPEC; const Fname: PChar): integer;
var
  fs:TStream;
  vv:variant;
  zSp:HSPEC; // хендл спектра
  i,j,lays,size,vt:integer;
  dt:double;
  bs:string;
begin
  Result:=CNV_FAIL;
  try
    try
      fs:=TFileStream.Create(FName,fmCreate);
      
      // Список поддерживаемых свойств может быть исследован записью любого файла как .UWX или .XML
            // Мы собираемся экспортировать все масс-спектрометрические данные, присоединённые к слою #1
			
            // Это слой содержит вложенный спектр?
      if gUc.GetPropValue(hSp,1,'zSpec',vv) then
      begin
        ptrUint(zSp):=ptrUint(vv);
      end else exit;

      if (zSp=HINVALID) then exit; // нет спектра, это просто хроматограмма

      // получим число слоёв - т.е. масс-сканов
      if not guc.GetPropValue(zSp,-1,'Layers',vv) then exit;
      lays:=vv;
      for i:=1 to lays do // через все сканы
      begin
        if not guc.GetPropValue(zSp,i,'Size',vv) then exit;
        size:=vv;
        if not guc.GetPropValue(zSp,i,'LastChanged',vv) then exit;
        dt:=vv;
        bs:=format('%g:',[dt]); // метка времени каждого слоя - момент сканирования
        for j:=1 to size do // вдоль каждого скана
        bs:=bs+format('(%g;%g);',[guc.GetXData(zSp,i,j), // X-data (m/z)
                            guc.GetData(zSp,i,j)]); // Y-data (интенсивность)

        bs:=bs+sLineBreak;
        fs.Write(bs[1],length(bs));

      end;

      Result:=CNV_OK; // Да, всё закончено успешно
    except
      on E:Exception do
        writeln(E.Message); // сообщить проблему в STDOUT
    end;
  finally
    fs.free;
  end;
end;

class function TExpFormat.FormatFlags: integer;
begin
  Result:=FLAG_WRITE; // Наш файловый фильтр только ЭКСПОРТИРУЕТ данные
end;

class function TExpFormat.FormatName: utf8string;
begin
  Result:='Export all spectra as Text (*.zzz)|*.zzz'; // Сделайте тип файла уникальным
end;


initialization
  CnvFact.Register(TExpFormat); // регистрируем конвертер с помощью фабрики во время инициализации DLL
end.