Семинар по ISO 10303. Обзор норм ISO 10303. Внедрение языка EXPRESS. Преобразование ISO 10303-22, страница 8

SCHEMA Graphics; , TYPE Colours = ENUMERATION OF (red, green, blue, white, black);

END TYPE;

ENTITY GraphicalObject ABSTRACT SUPERTYPE;

colour: Colours;

END ENTITY; — QraphicalObject ENTITY Point;

x: REAL;

у: REAL;

z: OPTIONAL REAL;

. WHERE

is_referenced:

SIZEOF (USEDIN (SELF, •GRAFICS.LINE.STARTP')) + SIZEOF (USEDIN (SELF, 'GRAFICS.LINE.ENDP' )) + SIZEOF (USEDIN (SELF, •GRAF1CS.CIRCLE.MIDP'))

>=1;

END_ENTITY; — Point

ENTITY Line SUBTYPE OF (GraphicalObject);

startp: Point;

endp : Point;

DERIVE

length : REAL := distance (startp, endp);

WHERE

different_points: startp о endp;

END_ENTITY; — Line ENTITY Circle SUBTYPE OF (GraphlcalObJect);

midp : Point;

radius: REAL;

DERIVE

area : REAL := PI * radius " radius;

WHERE

positive: radius >0;

END_ENTITY; — Circle ENTITY Drawing;

name : STRING;

elements: SET OF GraphicalObject;

UNIQUE

identifier: name;

END_ENTITY; — Drawing END_SCHEMA;

Правило UNIQUE

В качестве следующего шага схема расширяется таким образом, что становится возможным отражать другие различные чертежи. Чтобы отличать чертежи друг от друга, каждому чертежу дается имя. Это имя должно быть однозначным, то есть оно нс может быть дано двум или более чертежам. Условие однозначности определяется в EXPRESS с помощью спецификации UNIQUE. Это правило однозначности состоит из необязательного имени и перечисления одного или нескольких атрибутов.

Функция нулевого значения

<.3десь может быть несколько упрощена функция задания расстояния distance, в которой применена новая стандартная функция языка EXPRESS. Эта новая функция называется NVL или Null Value Function.

NVL (a, b : GENERIC): GENERIC;

Эта функция получает два параметра любого типа (специальный       тип GENERIC используется для формального параметра и заменяет любой другой тип). Определение этой функции может выглядеть следующим образом:

FUNCTION NVL (a. b : GENERIC): GENERIC;

IF EXISTS (a) THEN RETURN (a);

ELSE

RETURN (b);

END IF;

END_FUNCTION;

Первый параметр проверяется на существование значения.      Если этот параметр имеет значение, то он возвращается функцией. В противном случае возвращается второй параметр. С

использованием этой функции distance может выглядеть следующим   образом:

FUNCTION distance (p1, p2 : Point): REAL;

LOCAL

length : REAL := 0.0;

vector: Point := Point (0.0, 0.0, 0.0);

ENDJ.OCAL;

vector.x := p2.x - p1 .x;

vector.y := p2.y- p1 .у;

vector.z := NVL (p2.z, 0.0) - NVL (p1.z, 0.0);

length := SQRT(

vector.x« vector-x +   vector.y« vector.y +   vector.z « vector.z

);

RETURN (length);

END_FUNCTION; — distance

В заключение должно быть упрощенно правило is_referenced для точки. Предположим, что схема должна быть еще дополнена, чтобы кроме линий и окружностей могли отображаться свободно определяемые кривые. Тогда кривая будет описана двумя точками и отношениями между этими точками. Но это бы означало, что точки опять будут выполнять особенные роли. Эти роли должны быть явно добавлены в локальные правила entity Point. Так как это, конечно, не самое элегантное и надежное решение, то применяется стандартная функция ROLESOF.

FUNCTION ROLESOF (a : GENERIC): SET OF STRING;

Эта функция получает в качестве параметра экземпляр любого entity и возвращает для этого экземпляра множество всех имен ролей, которые играет этот экземпляр. Таким образом легко проверить, имеются ли ссылки на определенный экземпляр, то есть выполняется ли вообще роль. Следовательно, пример можно упростить следующим образом:

WHERE

•^.referenced : SIZEOF (ROLESOF (SELF)) >= 1:

Ниже еще раз полностью изображена схема. SCHEMA Graphics;

TYPE Colours = ENUMERATION OF (red, green, blue, white, black);

ENO_TYPE;

ENTITY GraphicalObject ABSTRACT SUPERTYPE;

colour: Colours;

END_ENTITY; — GraphicalObject

ENTITY Point;

x: REAL;

<• у : REAL;

Z : OPTIONAL REAL;

WHERE isJ-eferenced :     SIZEOF (ROLESOF (SELF)) >= 1;

END_ENT1TY; — Point

ENTITY Line SUBTYPE OF (GraphicalObject);

startp: Point;

endp : Point;

DERIVE

length : REAL := distance (startp, endp);

WHERE

(llfferent_points: startp <> end?;