ОПИСАНИЕ

 

 

 

 

.Область применения

Данный проект предназначен для моделирования, графического представления и мониторинга работы различных реальных  систем (например: телекоммуникационной, транспортной, market-системы).  На сегодняшний день имеет возможности:

Визуальное, векторное представление объектов моделей(в виде топографической карты), которое реализует:

• легкое управление отображение модели. Позволяет плавно перемещаться, плавно менять масштаб и поворот изображения;

• простое редактирование (drag and drop), добавление, удаление изображений. Возможность изменения масштаба и ориентирования объектов и целых регионов карты;

• синхронизация отображений всех клиентов системы, т.е. изменения, сделанные одним клиентом одновременно отображаются у других;

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

• возможность удаленного доступа через модем;

 

Представление объектов в виде панелей свойств, т.е. окна отображающего основные параметры объекта. Ее основные возможности:

• синхронизация панелей свойств, т.е. изменения свойств объекта, произошедшие на любом клиенте, одновременно обновляют панели свойств других клиентов;

• возможность custom-изации панели свойств для любого конкретного объекта, т.е. возможность изменения конфигурации панели свойств под конкретный объект (элементов управления их положение и размер);

 

Практически неограниченное число объектов модели (ограничено лишь возможностями сервера и SQL сервера хранения информации системы);

 

В настоящее время проект используется для автоматизации работы узла электросвязи(г. Арзамас ~ 118 тыс. жителей), где служит для:

• хранения ресурсов линейного хозяйства ГТС: магистралей, распределений, распределительных шкафов, колодцев и т.д.(паспортная группа);

• хранения станционных ресурсов ГТС: станционного оборудования, абонентских комплектов, монтированной емкости и т.д.(КРОСС);

• ведения абонентской картотеки (электронный аналог абонентской карточки ТФ2/2) (КРОСС);

• регистрации и устранения станционных и линейных повреждений (бюро ремонта 05, КРОСС);

• автоматизации установки телефонов и выделения других ресурсов узла (абонентский отдел);

• статистической обработки информации о занятых, свободных и поврежденных ресурсах;

 

 

 

 

.Базовая информация разработки

 

При разработке проекта за основу принимались следующие основные понятия:

Developer Level                    .

Представление - информация об объекте доступная и понятная клиенту(разработчику, пользователю). По ней клиент может понять, что представляет собой объект (примеры: панель свойств есть визуальное представление свойств объекта, Com- интерфейс служит представлением Com-объекта в памяти Win32-процесса, карта это 2D представление реальных объектов)

Функциональность - «InProcess» представление объекта. Т.е. представление объекта в памяти процесса системы

Абстрактная модель - некоторое множество представлений объектов + принципы и логика взаимодействия объектов через эти представления. (примеры: файловая система, схема интернет-соединения, расписание движения транспорта и т.д.)

DATA Storage Level             .

Объект - реальная сущность, находящаяся в носителях информации (например: файл, SQL таблица, Com-объект), видимая и доступная только через абстрактные модели (примеры: дом, улица, телефон, транспорт, яблоко и т.д.)

Client(User) Level                 .

Представитель модели - некоторая сущность,  реальная или виртуальная, предназначенная для отображения представления модели клиентам в понятной для них форме для анализа и изменения(примеры: Reflector(TReflector) отображает 2D-визуализацию объектов, память Win32-процесса содержит в себе интерфейсы Com-модели)

 

 

 

 

.Исходная функциональность объекта модели (корневой предок)

 Для представления объекта в Win32 процессе, служит «InProcess» функциональность, или просто – функциональность. Базовой(корневой) функциональностью процесса является класс TFunctionality(аналог Com-интерфейса IUnknown). TFunctionality служит для запроса другой функциональности объекта и для контроля времени жизни(описана в файле TypesDef\Functionality.pas). Ниже следует ее описание:

  TFunctionality = class

  private

    RefCount: integer;  //. Счетчик ссылок на экземпляр функциональность

  public

    Constructor Create;

 

    function AddRef: integer; virtual; Stdcall; //. увеличивает число ссылок

    function Release: integer; virtual; Stdcall; //. уменьшает число ссылок, если оно становится = 0, то удаляет объект

    function QueryFunctionality(RequiredFunctionalityClass: TFunctionalityClass; out F: TFunctionality):

boolean; virtual; StdCall; //. запрашивает новую функциональность, по ее типу

  end;

Все типы функциональностей явно унаследованы от TFunctionality.

  

 

 

.Исходные модели проекта

  Первичными моделями, т.е. моделями на основе которых строятся другие (вторичные) модели в данной проекте являются следующие:

Идентификационная модель.

Компонентная модель.

Модель 2D-визуализации.

Модель панелей свойств.

Ниже дано описание реализаций этих моделей.

 

Идентификационная модель

Согласно этой модели, каждый объект имеет идентификатор(id), по которому находится именно этот объект. ID SQL хранимого объекта это:

TID = record

idTObj: integer; //. идентификатор типа объекта (ссылка на таблицу хранения объекта);

idObj: integer; //. идентификатор экземпляра (ссылка на строку таблицы).

end;

Функциональности данной модели следующие:

Функциональность типа(наследует TFunctionality, описана в файле TypesDef\Functionality.pas):

TTypeFunctionality = class (TFunctionality)

  private

    function getidType: integer;

    function getTableName: shortstring;

    function getSpace: TProxySpace;

    function getImageList_Index: integer; virtual; stdcall;

  public

    TypeSystem: TTypeSystem;

    FImage: TTypeImage;

 

    Constructor Create; virtual;

    Destructor Destroy; override;

    function _CreateInstance: integer; virtual; stdcall;

//. создает экземпляр типа

    function CreateInstance: integer; stdcall;

//. создает экземпляр типа, используя другой объект

    function CreateInstanceUsingObject(const idTUseObj,idUseObj: integer): integer; virtual; stdcall; 

    procedure _DestroyInstance(const idObj: integer); virtual; stdcall;

//. уничтожает экземпляр типа

    procedure DestroyInstance(const idObj: integer); stdcall;

//. получает список экземпляров данного типа

 procedure GetInstanceList(var List: TList); virtual; stdcall;

//. создает компонентную функциональность(см. ниже) объекта с idComponent

    function TComponentFunctionality_Create(const idComponent: integer):

TComponentFunctionality; virtual; stdcall;

 

    function getName: shortstring; virtual; stdcall;

    function getImage: TTypeImage; virtual; stdcall;

 

//. операция синхронизации данных всей модели

    procedure DoOnComponentOperation(const idTObj,idObj: integer; const Operation:

TComponentOperation);

//. id  типа

    property idType: integer read getidType;

//. имя таблицы, в которой хранится данный тип

    property TableName: shortstring read getTableName;

//. пространства данных проекта

    property Space: TProxySpace read getSpace;

//. строковое имя типа

    property Name: shortstring read getName;

//. изображение типа

    property Image: TTypeImage read getImage;

//. индек изображения типа в таблице изображений типов

    property ImageList_Index: integer read getImageList_Index;

  end;

 

Компонентная модель

Согласно ей полагается, что каждый объект пространства является компонентом. Основные правила компонентной функциональности:

• Каждый компонент имеет собственника, которому он принадлежит. Если собственник компонента = nil, т.е. пустой, то это значит, что компонент принадлежит корневому(Root) компоненту – пространству

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

• Принадлежность компонента, означает, что он доступен и виден только через своего собственника, которому он принадлежит.

• Если собственник компонента = nil, т.е. пустой, то это значит, что компонент принадлежит корневому(Root) компоненту – пространству.

Функциональности данной модели следующие:

Функциональность типа (см. выше).

  Компонентная функциональность (наследует TFunctionality, реализует базовые свойства и методы компонента, описана в файле TypesDef\Functionality.pas):

  TComponentFunctionality = class (TFunctionality)

  private

    function getTypeSystem: TTypeSystem;

    function getTableName: string;

  public

    TypeFunctionality: TTypeFunctionality;

    idObj: integer; //. id компонента

 

    Constructor Create(pTypeFunctionality: TTypeFunctionality; const pidObj: integer); virtual;

    Destructor Destroy; override;

 

//. проверяет компонент на существование

    procedure Check; virtual; stdcall;

//. вставляет компонент

    procedure InsertComponent(const idTComponent,idComponent: integer;  var id: integer); virtual; stdcall;

//. удаляет компонент

    procedure RemoveComponent(const idTComponent,idComponent: integer); virtual; stdcall;

 

    procedure _ToClone(var idClone: integer); virtual; stdcall;

//. клонирует компонент

    procedure ToClone(var idClone: integer); virtual; stdcall;

//. клонирует компонент, используя другой

    procedure ToCloneUsingObject(const idTUseObj,idUseObj: integer; var idClone: integer); virtual; stdcall;

    function CanDestroy(var Reason: shortstring): boolean; virtual; stdcall;

//. извещает компонент об операции над другим компонентом

    procedure Notify(const NotifyType: TComponentNotifyType;  const pidTObj,pidObj: integer); virtual; stdcall;

//. получает собственник компонента

    function GetOwner(var idTOwner,idOwner: integer): boolean; virtual; stdcall;

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

    function SetComponentsUsingObject(const idTUseObj,idUseObj: integer): boolean; virtual; stdcall;

//. уничтожает собственные компоненты

    procedure DestroyComponents; virtual; stdcall;

//. удаляет себя как компонент в составе другого, без уничтожения

    procedure RemoveSelfAsComponent; stdcall;

//. получает список собственных компонент

    procedure GetComponentsList(var ComponentsList: TComponentsList); virtual; stdcall;

//. запрашивает список собственных компонент по классу функциональности

    function QueryComponents(FunctionalityClass: TFunctionalityClass; out ComponentsList: TComponentsList): boolean; overload; virtual; stdcall;

//. запрашивает список собственных компонент по типу

    function QueryComponents(const idTNeededType: integer; out ComponentsList: TComponentsList): boolean; overload; virtual; stdcall;

//. запрашивает единичный компонент по типу

    function QueryComponent(const idTNeededType: integer; out idTComponent,idComponent: integer): boolean; virtual; stdcall;

//. запрашивает функциональность по типу

    function QueryComponentFunctionality(NeededFunctionalityClass: TFunctionalityClass; out Functionality: TFunctionality): boolean; virtual; stdcall;

//.  число собственных компонент

    function ComponentsCount: integer; virtual; stdcall;

//.  получает корневого собственника(т.е. у которого Owner = nil)

    function GetRootOwner(var idTOwner,idOwner: integer): boolean; virtual; stdcall;

 

//.  создает обновитель представлений компонента

    function TPresentUpdater_Create(pUpdateProc: TProc; pOffProc: TProc): TComponentPresentUpdater;

 

   

//.  свойства и методы панели свойств(модель см. ниже)

    procedure CreateNewPanelProps;

    procedure DestroyPanelProps;

    function IsPanelPropsExist: boolean;

    function GetPanelPropsLeftTop(var PanelProps_Left,PanelProps_Top: integer): boolean; virtual; stdcall;

    function GetPanelPropsWidthHeight(var PanelProps_Width,PanelProps_Height: integer): boolean; virtual; stdcall;

    procedure SetPanelPropsLeftTop(const PanelProps_OfsX,PanelProps_OfsY: integer); virtual; stdcall;

    procedure SetPanelPropsWidthHeight(const PanelProps_Width,PanelProps_Height: integer); virtual; stdcall;

    //. CustomPanelProps routines

    function IsCustomPanelPropsExist: boolean;

    function idCustomPanelProps: integer;

    function CustomPanelProps: TClientBlobStream;

    procedure SetCustomPanelProps(Stream: TStream; const flNewValue: boolean{если = true, то заменяет панелью с новым ID});

    procedure SetCustomPanelPropsByID(const idPanelProps: integer);

    procedure ReleaseCustomPanelProps;

//.  создает новую панель свойств

    function TPanelProps_Create(pflReadOnly: boolean; pidOwnerObjectProp: integer;pOwnerPanelsProps: TAbstractSpaceObjPanelsProps; const pProxyObject: TObjectDescr): TAbstractSpaceObjPanelProps; virtual; stdcall;

 

    function getName: shortstring; virtual; stdcall;

    procedure setName(Value: shortstring); virtual; stdcall;

    function getHint: shortstring; virtual; stdcall;

 

    function getidTObj: integer; stdcall;

    function getSpace: TProxySpace;

 

//. операция синхронизации данных всей модели на Update компонента

    procedure DoOnComponentUpdate;