ЗАДАНИЕ XIV

Тема: Методы расчета полей. Механизм сообщений.
Цель: Краткое знакомство с работой сообщений в среде Stratum.

Перед началом работы необходимо:

владение основными приемами работы в MS Windows;
владение основными приемами работы в Stratum 2000.

Основные сведения о сообщениях

    Сообщение посылается всем объектам с указанным именем или всем объектам указанного класса. Объект, отправляющий сообщение, называется источником сообщения, объекты, его получающие - приемниками сообщения.
    При этом происходит копирование указанных переменных объекта источника сообщения в объект приемник, затем обработка модели объекта и копирование переменных обратно в объект источник. Если объектов приемников сообщений несколько, данная процедура повторяется.

Отправка сообщения объекту или группе объектов осуществляется функцией:
SendMessage(STRING ObjectName,STRING ClassName, [STRING VarName1, FLOAT VarName2...])

ObjectName Задает имя объекта (объектов), получающего сообщение. Пустая строка, если данный параметр не специфицирован.
ClassName* Задает имя класса объекта (объектов), получающего сообщение. Пустая строка, если данный параметр не специфицирован.
VarName1 Имя связываемой переменной в объекте-отправителе сообщения.
VarName2 Имя связываемой переменной в объекте-получателе сообщения.

* Если заданно только имя класса, то посылается сообщение всем имиджам данного класса.

Задание 1

    Будем рассчитывать напряженность поля в заданных точках. Поле создается системой точечных зарядов. Напряженность поля в заданной точке рассчитывается по формуле:
lab014.gif (657 bytes), где
k    - коэффициент,
Qi    - величина i заряда,
Ri    - расстояние от заряда до точки.

    Создадим имиджи : заряда, точки и служебного имиджа, сбрасывающего сумму зарядов.

Имидж заряда имеет следующий текст:

FLOAT OrgX,OrgY,Q
SendMessage("","Item", "OrgX","_OrgX", "OrgY","_OrgY", "Q","_Q", "Q","flag")

    Функция SendMessage на каждом шаге рассылает всем имиджам с именем Item информацию о своих координатах (OrgX, OrgY) и заряде Q. Передача ненулевого заряда Q в служебную переменную flag говорит о том, что пришла информация от заряда. Необходимо задать начальное значение заряда, например 1.

Служебный имидж:

FLOAT Flag
Flag:=-1
SendMessage("","Item","Flag","flag")


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

Имидж точки поля с именем Item :

HANDLE hSpace
COLORREF Color ,oldColor
FLOAT _enable // имидж выключен и работает только при приходе сообщения

if(flag>=0)   // пришло сообщение от заряда
E := E + _Q/((OrgX-_OrgX)*(OrgX-_OrgX)+(OrgY-_OrgY)*(OrgY-_OrgY))

else // Визуализация
a:=min(~E*10000,1)
Color:=RGB(255*~a,0,(1-~a)*255) // Расчет цвета
E:=0 // Обнуления напряженности

if(not(HSpace))
hSpace := GetWindowSpace("Main Window")// Получение дескриптор окна
if(~hSpace)
HBrush := CreateBrush2d(~hSpace,0,0,~Color,#0,13)    // Создание кисти
HObject := CreatePolyLine2d(~hSpace,#0,~HBrush, OrgX,OrgY, OrgX+32,OrgY, OrgX+32,OrgY+32, OrgX,OrgY+32, OrgX,OrgY)// Создание прямоугольника (в одну строку)
endif
endif
// Устанавливаем новый цвет
if ((~Color!=oldColor) && SetBrushColor2d(~hSpace,~hBrush,~Color))
oldColor:=~Color
endif

endif


Созданный проект может иметь следующий вид:
lab014_1.gif (14392 bytes)