unit PlugCommon;

interface

uses Windows;

type
  TDoubleArray = array[0..1024*1024] of double;
  PDoubleArray = ^TDoubleArray;
  
const
  PLGENUM_OK          =1;
  PLGENUM_CANCEL      =0;
  
type
  pIPlugIn = ^IPlugIn;
  IPlugIn = object
    // Строка меню
    function MenuName:PChar;virtual;stdcall;abstract;
    // Дееспособность
    function CanDo:LongBool;virtual;stdcall;abstract;
    // Основная функция
    function PluginMain:PChar;virtual;stdcall;abstract;
  end;

type
  // Функция обратного вызова для перечисления
  TEnumPlugInsProc    = function(PlugIn:pIPlugIn):integer;stdcall;
  // Перечислитель
  TPlugInsEnumerate   = function(EnumProc:TEnumPlugInsProc):integer;stdcall;

type
  // Состояние данных
  TDataState =
  (
    dsUndeterminate,
    dsValid
  );
  // Метод поиска экстремума
  TMethodType =
  (
    mtScan,
    mtRandom,
    mtHaussZeidel
  );
  // Запросы серверу математики на совершение действий. Сами действия 
  // оформлены как вызовы соответствующих методов.
  TPlanAction=
  (
    // Файл
    acNew,
    acOpen,
    acSave,
    acSaveAs,
    acClose,
    acCreateReport,
    // Импорт
    acImportAll,
    acImportCode,
    acImportNatural,
    acImportML,
    acImportDF,
    acImportY,
    // Экспорт
    acExportAll,
    acExportCode,
    acExportNatural,
    acExportML,
    acExportDF,
    acExportY,
    acExportReport,
    // Эксперимент
    acKNames,
    acCreateY,
    acCheckPoint,
    acAverageY,
    acFullAnalisys,
    acCohrenAnalisys,
    acRegenerateCode,
    // Модель
    acStudentAnalisys,
    acFisherAnalisys,
    acExtremum,
    acTranslate,
    // Меню "Диаграмма"
    acNewGraph,
    acNewSurface,
    acExportGraph,
    acExportSurface,
    acImportGraph,
    acImportSurface,
    // Меню "Окно"
    acShowCode,
    acShowNatural,
    acShowML,
    acShowDF,
    acShowY,
    acShowReport,
    acShowDiagram,
    acHideCode,
    acHideNatural,
    acHideML,
    acHideDF,
    acHideY,
    acHideReport,
    acHideDiagram,
    acMinimizeForms,
    acShowForms,
    acArrangeForms
  );
  // Запросы серверу графики на совершение действий. Сами действия 
  // оформлены как вызовы соответствующих методов.
  TGraphAction=(
    acBeginGraph,
    acBeginSurface,
    acEndGraph,
    acEndSurface,
    acSetNames,
    acAddVertex,
    acImport,
    acReset,
    acShow,
    acHide,
    acArrange
  );
// Структура, через которую передаются имена для графика.
type
  PSourceNames=^TSourceNames;
  TSourceNames=packed record
    FirstName,
    SecondName,
    ResponseName : PChar;
  end;

// =======================================================================
// * * *                    СЕРВЕР   ГРАФИКИ                         * * *
// =======================================================================

type
  pIGraphServer = ^IGraphServer;
  IGraphServer = object
  public
    procedure    Vertex2D(x, y: double);virtual;stdcall;abstract;
    procedure    Vertex3D(x, y, z: double);virtual;stdcall;abstract;
    procedure    BeginGraph(Count,Reserved:longint);virtual;stdcall;abstract;
    procedure    BeginSurface(SizeX,SizeY:longint);virtual;stdcall;abstract;
    procedure    SetNames(GNames,SNames:PSourceNames);virtual;stdcall;abstract;
    procedure    EndGraph(Count,Reserved:longint);virtual;stdcall;abstract;
    procedure    EndSurface(SizeX,SizeY:longint);virtual;stdcall;abstract;
    procedure    Show(ShowWindow:Boolean);virtual;stdcall;abstract;
    procedure    Arrange;virtual;stdcall;abstract;
    procedure    Reset;virtual;stdcall;abstract;
    procedure    SetupChanged;virtual;stdcall;abstract;
    function     CanDo(Action:TGraphAction):Boolean;virtual;stdcall;abstract;
    procedure    DisplayChange(cx,cy,bpp:integer);virtual;stdcall;abstract;
    //           5.08.99
    procedure    BeginPoints2D(Count:longint);virtual;stdcall;abstract;
    procedure    BeginPoints3D(Count:longint);virtual;stdcall;abstract;
    procedure    EndPoints2D(Count:longint);virtual;stdcall;abstract;
    procedure    EndPoints3D(Count:longint);virtual;stdcall;abstract;
  end;
  
// =======================================================================
// * * *                    СЕРВЕР МАТЕМАТИКИ                        * * *
// =======================================================================

type
  IMathPlan = class(TObject)
  // Функция возврата состояния - возможна ли указанная операция
    function        CanDo(Action:TPlanAction):Boolean;virtual;stdcall;abstract;
  // ---------------------------------------------------------------------
  // Операции.
  // ---------------------------------------------------------------------
  // Меню "Файл"
    function        New:Boolean;virtual;stdcall;abstract;
    function        Open(szFile:PChar):Boolean;virtual;stdcall;abstract;
    function        SaveAs:Boolean;virtual;stdcall;abstract;
    function        Save:Boolean;virtual;stdcall;abstract;
    function        CreateReport:Boolean;virtual;stdcall;abstract;
    function        Close:Boolean;virtual;stdcall;abstract;
  // ---------------------------------------------------------------------
  // Меню "Экспорт"
    function        ExportAll:Boolean;virtual;stdcall;abstract;
    function        ExportMainMatrix:Boolean;virtual;stdcall;abstract;
    function        ExportNaturalMatrix:Boolean;virtual;stdcall;abstract;
    function        ExportMLVector:Boolean;virtual;stdcall;abstract;
    function        ExportDFVector:Boolean;virtual;stdcall;abstract;
    function        ExportYMatrix:Boolean;virtual;stdcall;abstract;
    function        ExportReport:Boolean;virtual;stdcall;abstract;
  // ---------------------------------------------------------------------
  // Меню "Импорт"
    function        ImportMainMatrix:Boolean;virtual;stdcall;abstract;
    function        ImportMLVector:Boolean;virtual;stdcall;abstract;
    function        ImportDFVector:Boolean;virtual;stdcall;abstract;
    function        ImportYMatrix:Boolean;virtual;stdcall;abstract;
    function        ImportAll:Boolean;virtual;stdcall;abstract;
  // ---------------------------------------------------------------------
  // Меню "Эксперимент"
    function        SetKNames:Boolean;virtual;stdcall;abstract;
    function        NewData:Boolean;virtual;stdcall;abstract;
    function        CheckPoint:Boolean;virtual;stdcall;abstract;
    function        ShowAverageData:Boolean;virtual;stdcall;abstract;
  // Расчет средних, дисперсий, стандартных отклонений и критерия Кохрена
    function        CohrenAnalisys:Boolean;virtual;stdcall;abstract;
  // Регенерация кодовой матрицы
    function        RegenerateCode:Boolean;virtual;stdcall;abstract;
  // ---------------------------------------------------------------------
  // Меню "Анализ"
    function        FullAnalisys:Boolean;virtual;stdcall;abstract;
  // Расчет  критерия Стьюдента; отсев коэффициентов, корректировка расши-
  // ренной матрицы плана и пересчет коэффициентов.
    function        StudentAnalisys:Boolean;virtual;stdcall;abstract;
  // Расчет невязок, дисперсии адекватности и критерия Фишера.
    function        FisherAnalisys:Boolean;virtual;stdcall;abstract;
    function        FindExtremum:Boolean;virtual;stdcall;abstract;
    function        Translate:Boolean;virtual;stdcall;abstract;
  // ---------------------------------------------------------------------
  // Меню "Диаграммы"
    function        NewGraph:Boolean;virtual;stdcall;abstract;
    function        NewSurface:Boolean;virtual;stdcall;abstract;
    function        ExportGraph:Boolean;virtual;stdcall;abstract;
    function        ExportSurface:Boolean;virtual;stdcall;abstract;
  // ---------------------------------------------------------------------
  // Меню "Окно"
    function        ShowMainMatrix:Boolean;virtual;stdcall;abstract;
    function        ShowNaturalMatrix:Boolean;virtual;stdcall;abstract;
    function        ShowMLVector:Boolean;virtual;stdcall;abstract;
    function        ShowDFVector:Boolean;virtual;stdcall;abstract;
    function        ShowYMatrix:Boolean;virtual;stdcall;abstract;
    function        ShowReport:Boolean;virtual;stdcall;abstract;
    function        HideMainMatrix:Boolean;virtual;stdcall;abstract;
    function        HideNaturalMatrix:Boolean;virtual;stdcall;abstract;
    function        HideMLVector:Boolean;virtual;stdcall;abstract;
    function        HideDFVector:Boolean;virtual;stdcall;abstract;
    function        HideYMatrix:Boolean;virtual;stdcall;abstract;
    function        HideReport:Boolean;virtual;stdcall;abstract;
    function        MinimizeForms:Boolean;virtual;stdcall;abstract;
    function        ShowForms:Boolean;virtual;stdcall;abstract;
    function        ArrangeForms(var Rc:TRect):Boolean;virtual;stdcall;abstract;
  // ---------------------------------------------------------------------
  // Были ли изменения
    function        Modified:Boolean;virtual;stdcall;abstract;
  // Синхронизация матриц
    procedure       SynchronizeMatrices(Sender:TObject);virtual;stdcall;abstract;
  // Использование новых установок
    procedure       OnChangeSetup;virtual;stdcall;abstract;
  // Возврат статуса (для статусной строки)
    function        GetStateString:PChar;virtual;stdcall;abstract;
    procedure       ClearStatus;virtual;stdcall;abstract;
  // Текущее имя файла (для заголовка)
    function        FileName:PChar;virtual;stdcall;abstract;
    function        GetGServer:pIGraphServer;virtual;stdcall;abstract;
  // Скрытие / показ форм (при изменении стиля главного окна)
    procedure       TemporaryClose(var c,n,m,d,y,r,g:Boolean);virtual;stdcall;abstract;
    procedure       RestoreVisibleForms(c,n,m,d,y,r,g:Boolean);virtual;stdcall;abstract;
  // Параметры плана
    procedure       GetKNR(K,N,R:pdword);virtual;stdcall;abstract;
  // Пересчет координат точек
    procedure       NaturalToCode(Dst,Src:PDoubleArray);virtual;stdcall;abstract;
    procedure       CodeToNatural(Dst,Src:PDoubleArray);virtual;stdcall;abstract;
  // Вычисление значения в точке кодового пространства
    procedure       GetY(Pt:PDoubleArray;Res:pdouble);virtual;stdcall;abstract;
  // Возврат главной формы
    function        GetMainForm : pointer;virtual;stdcall;abstract;
  end;

procedure SetMainServer(MainServer:IMathPlan);stdcall;
function GetMainServer:IMathPlan;stdcall;

exports
  SetMainServer,
  GetMainServer;
  
implementation

var
  __MainServer : IMathPlan;

procedure SetMainServer;
begin
  __MainServer:=MainServer;
end;

function GetMainServer;
begin
  Result:=__MainServer;
end;

begin
  __MainServer := nil;
end.
