ОПИСАНИЕ

 

 

 

 

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

Данный проект предназначен для моделирования, графического представления и мониторинга работы различных реальных  систем (например: телекоммуникационной, транспортной, 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;

 

//.  id  типа компонента

    property idTObj: integer read getidTObj;

//.  система типа компонента

    property TypeSystem: TTypeSystem read getTypeSystem;

//.  имя компонента

    property Name: shortstring read getName write setName;

//.  подсказка компонента

    property Hint: shortstring read getHint;

//.  имя таблицы хранения

    property TableName: string read getTableName;

 

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

    property Space: TProxySpace read getSpace;

  end;

 

Компонентная функциональность объекта получается вызовом глобальной процедуры:

procedure TComponentFunctionality_Create(const idTObj,idObj: integer): TComponentFunctionality,

где idTObj: идентификатор типа компонента, idObj – идентификатор компонента.

 

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

Это модель плоского 2D пространства, основанная на компонентной модели, в которой каждый компонент может иметь визуальное представление - визуализацию. Модель визуализации храниться в файле, называемом как Файл пространства. Файл пространства 2D-визуализации является последовательностью объектов(TSpaceObj) и узлов их фигур-полигонов(TPoint) (определено в файле ServerSpace\GlobalSpaceDefines.pas):

Const

  nilPtr=-1; //. пустой указатель

 

type

  TPtr = Integer;

  TCrd = Real48;

 

{описание точки}

Type

  TPoint = packed record

    ptrNextObj: TPtr;

    X,Y: TCrd;

  end;

 

{описание фигуры}

Type

  TSpaceObjLineWidth = Real48;

 

Type

  TSpaceObj = packed record

    ptrNextObj: TPtr; //. не менять положение

 

    idTObj: integer;

    idObj: integer;

 

    ptrFirstPoint: TPtr;

    flagLoop: boolean;

    Color: TColor;

    Width: TSpaceObjLineWidth;

    flagFill: boolean;

    ColorFill: TColor;

 

    ptrListOwnerObj: TPtr;

  end;

 

Структура файла пространства показана ниже:

 

 

Функциональности модели 2D-визуализации следующие:

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

  TTBase2DVisualizationFunctionality = class(TTypeFunctionality)

  private

    function getReflector: TReflector; virtual; stdcall;

    procedure setReflector(Value: TReflector); virtual; stdcall;

  public

    function _CreateInstanceEx(pObjectVisualization: TObjectVisualization; ptrOwner: TPtr): integer; virtual; abstract;

    function CreateInstanceEx(pObjectVisualization: TObjectVisualization; ptrOwner: TPtr): integer;

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

 

    function CreateObj(pReflector: TReflector; pObjectVisualization: TObjectVisualization; const flAbsoluteCoords: boolean; const idTObj,idObj: integer; ptrOwner: TPtr): TPtr; stdcall;

    procedure DestroyObj(const ptrDestrObj: TPtr); stdcall;

 

    function StdObjectVisualization: TObjectVisualization; virtual; stdcall; abstract;

    property Reflector: TReflector read getReflector write setReflector;

  end;

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

  TBase2DVisualizationFunctionality = class(TComponentFunctionality)

  private

    FReflector: TReflector;

 

    function getReflector: TReflector; virtual; stdcall;

    procedure setReflector(Value: TReflector); virtual; stdcall;

    function getIdLay: integer; stdcall;

  public

    procedure CreateClone(const ptrObj: TPtr; const ptrCloneOwner: TPtr; var idClone: integer); stdcall;

//. отобразить визуализацию

    function Reflect(pFigure: TFigureWinRefl; pReflectionWindow: TReflectionWindow; pCanvas: TCanvas): boolean; virtual; stdcall; abstract;

 

//. уничтожить SQL-данные визуализации

    procedure DestroyData; virtual; stdcall; abstract;

//. клонировать данные визуализации

    procedure CloneData(var idClone: integer); virtual; stdcall; abstract;

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

    function Ptr: TPtr; stdcall;

//. получить информацию о слое

    procedure GetLayInfo(var Lay,SubLay: integer); stdcall;

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

    procedure DoOnChangeScale(const ChangeCoef: Extended); virtual; stdcall;

//. используемый рефлектор

    property Reflector: TReflector read getReflector write setReflector;

//. id слоя, в котором расположена визуализация

    property idLay: integer read getIdLay;

  end;

 

Представителем этой модели в проекте является Reflector(TReflector), который отображает на экране плоское пространство (описан в файле Reflector\unitReflector.pas). Внешний вид рефлектора показан ниже:  

Навигация по пространству осуществляется при удержании правой кнопки мыши.

 

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

Согласно ей полагается, что каждый компонент имеет экранное представление, именуемое как Панель свойств. Панель свойств это экранное визуальное представление данных компонента. Панели свойств собственных компонентов объекта располагаются внутри родительской панели. Ниже приведен пример панели свойств:

Панель свойств описана в файле ServerProxySpace\SpaceObjInterpretation.pas. Функциональности данной модели:

• Абстрактная панель свойств (описана в файле TypesDef\Functionality.pas):

  TAbstractSpaceObjPanelProps = class(TForm)

  public

    FflFreeOnClose: boolean;

 

    procedure Update; virtual; abstract;

    procedure Show;

    procedure SaveChanges; virtual; abstract;

    procedure Controls_ClearPropData; virtual; abstract;

 

    procedure setflFreeOnClose(Value: boolean); virtual;

    property flFreeOnClose: boolean read FflFreeOnClose write setflFreeOnClose;

  end;

 

 

 

 

.Вторичные модели проекта

  Вторичные модели базируются на моделях описанных выше и на текущий момент включают следующие:

Модель телекоммуникационного соединения (работа телефонной станции).

Транспортная модель (работа транспорта).

Товарная модель (предложение-заявка товаров).

 

Модель телекоммуникационного соединения Моделирует работу телефонной станции, ее устройств и т.д. Функциональности модели описаны в файлах TypesDef\TypesFunctionality.pas, TypesDef\TypesImpl\SpaceObjPanelsProps\unitConnector_Recource.pas.

Транспортная модель Моделирует работу транспорта. Функциональности модели(описаны в файлах TypesDef\TypesFunctionality.pas) :

Функциональность транспортного узла TTransportNodeFunctionality(унаследована от TComponentFunctionality).

Функциональность транспортного маршрута TTransportКщгеуFunctionality(унаследована от TComponentFunctionality).

Товарная модель Моделирует работу рынка (купля-продажа). Функциональности модели(описаны в файлах TypesDef\TypesFunctionality.pas) :

Функциональность товара TGoodsFunctionality(унаследована от TComponentFunctionality).

Функциональность товара предложения TOfferGoodsFunctionality(унаследована от TComponentFunctionality).

Функциональность товара заявки TDemandGoodsFunctionality(унаследована от TComponentFunctionality).

 

 

 

 

.Внутренняя структура проекта

  Проект выполнен по модели Client/Server при использовании технологии DCOM(Microsoft). Конструктивно состоит из следующих com-объектов:

 

coProxySpace(приложение ServerProxySpace.exe) – клиент. Состоит из прокси(кэш) копии файла пространства 2D-визуализации(TProxySpace) и системы типов компонент(TTypesSystem). Реализует рефлекторы(TReflector) и панели свойств(TSpaceObjPanelProps). Имеет следующие com-интерфейсы(описаны в ServerProxySpace.tlb):

IReflectorManager - менеджер рефлекторов.

IProxySpacePartitionManager менеджер разбиения пространства.

IProxySpaceManager - менеджер прокси пространства.

 

Семейство серверов. Служат для обработки запросов клиентов и поддержания действительного состояния данных системы. Включают в себя:

 

 coSpace (приложение ServerSpace.exe) – основной сервер-синхронизатор. Хранит в себе основной файл пространства 2D-визуализаций + кэши для этого файла(TGlobalSpace). Реализует синхронизацию данных (кэшей) всех зарегистрированных клиентов. Имеет следующие com-интерфейсы (описаны в ServerSpace.tlb):

IProxySpacesProvider – поставщик прокси пространств(TProxySpace).

ISpaceManager – менеджер основного пространства.

ISpaceConfigManager – менеджер конфигурации сервера ServerSpace.exe.

ISpaceReportsProvider – поставщик отчетов работы.

ISpaceAdministrator – администратор основного пространства.

ISpacePartitionManager – менеджер разбиения основного пространства.

IProxySpacesManager – менеджер прокси-пространств(клиентов).

ISpaceRemoteManager – удаленный менеджер основного пространства.

ISpaceCashDataProvider – поставщик кэш-данных основного пространства.

ISpaceNotifier – интерфейс извещения основного пространства.

 

SpaceObjProps (приложение SQLServerSpaceObjProps.exe)SQL stub для запросов клиентов. Посредник между MIDAS(Borland) и SQL сервером хранения данных. Принимает и транслирует sql-запросы от клиента. Имеет следующие com-интерфейсы (описаны в SQLServerObjProps.tlb):

IAppServer интерфейс Midas(Borland DELPHI6).

 

Функциональная структурная схема проекта:

Дерево каталогов проекта:

[MODEL] – каталог проекта

[ServerProxySpace] – каталог клиента (выполняемые файлы: ServerProxySpace.exe,Types091099.dll).

[ServerSpace] – каталог сервера синхронизатора(выполняемый файл: ServerSpace.exe).

[SQLServerSpace] – каталог SQLStub(выполняемый файл: SQLServerSpaceObjProps.exe).

 

 

 

 

.Описание вторичных моделей проекта

 

Модель телекоммуникационного соединения

Для учета линейных и станционных сооружений (пар, громполос, абонентских комплектов, телефонов) существует модель телефонного соединения. Модель определяет взаимосвязи между:  громполосами – парами, парами – кроссировками и т.д.; схематически это реализовано следующим образом:

Рассмотрим пример линейной трассы телефона 43315 ГТС г. Арзамаса.

Найдем этот телефон в Reflector-е:

1.      Находим оконечное устройство телефона (кнопка «ОУ»). Это коробка 34а (спаренная коробка 300-го распределения).

Для коробки появляется панель с ее свойствами (например: ее адрес, зона обслуживания (т.е. интервал обслуживаемых квартир), ресурсы): 

       2.  Нажимаем кнопку “Ресурсы”, т.е. входим внутрь этого соединителя.

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

3. Выбираем Л.Кн. мыши занятую пару (например: 49), нажимаем кнопку “->” и идем  “по шнуру” до следующего соединителя (в данном случае до шкафа).

Появляется картинка шкафа: на ней изображено, как данное распределение соединено с конкретной магистралью:

4. Выбираем магистральную пару и, аналогично п. 3 идем до следующего соединителя (до кросса).

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

5. Аналогично доходим до динамического соединителя – станции.

Пройденный путь показывает линейную трассу телефона 43315.