Работа с атрибутами (макро)

Материал из GEOS_WIKI
Перейти к: навигация, поиск

Эта статья — о работе с атрибутами в макропрограммировании. Об атрибутах в интерфейсе К3-Мебель читайте здесь

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

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

Атрибуты в K3 бывают следующих типов:

  • Строковый;
  • Числовой;
  • Логической;
  • Текстовый.

Тип того или иного атрибута задается шаблоном атрибута и определяет возможные значения этого атрибута.

Команды работы с атрибутами можно условно разделить на два класса

  • Работа с шаблонами атрибутов
  • Работа со значениями атрибутов

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


Работа с шаблонами атрибутов

Команда attribute имеет несколько режимов работы, которые представлены ниже.

attribute create <Name> <Prompt> <Type> <N1> <N2> [enum [on|off]] [default <Value>] done

Команда создает шаблон атрибута с именем <Name>, подсказкой <Prompt>, типом <Type>. Возможные типы шаблонов атрибутов и параметров <N1> и <N2> представлены в таблице:

Типы атрибутов
Параметры
Тип атрибута <Type>


string
text
real
logical
<N1>
длина поля вывода
длина поля вывода
максимальное количество знаков в числе
текст для лжи
<N2>
длина строки
максимальная длина строки
число знаков после запятой
текст для истины

Дополнительные ключи задают перечисляемость атрибута (enum [on|off]) и значение по умолчанию (default <Value>).

Пример:

attribute create "Super" "Суперподсказка" string 10 20 
enum on default "Пустота" done;


attribute edit <Name> <Params> Команда редактирует шаблон атрибута с именем <Name>, позволяя изменять параметры шаблона атрибута <Params>. Возможные значения <Params> представлены в таблице:

Параметры атрибута для редактирования
<Params>
Описание
name <NewName>
Редактирование имени атрибута
text <NewText>
Редактирование подсказки атрибута
type <NewType>
Редактирование типа атрибута
size <NewN1> <NewN2>
Редактирование формата атрибута
enum on | off
Редактирование перечисляемости атрибута
default <NewValue>
Редактирование значения по умолчанию


attribute delete all | <Name>

Команда удаляет шаблон атрибута с именем <Name> или все пользовательские шаблоны атрибутов (all).



Примечание 1. Команды редактирования и удаления шаблонов атрибутов работают только с пользовательскими атрибутами. В системе K3 существует множество системных атрибутов, на которые действие описанных выше команд не распространяется.

Примечание 2. В командах работы с атрибутами может присутствовать ключ list (список), который позволяет работать с атрибутами посредством диалоговых окон. В макропрограммах удобнее работать с атрибутами из командной строки.



Создание атрибута из диалогового окна
Удаление атрибута из диалогового окна

Работа со значениями атрибутов

attrobj

Команда attrobj имеет несколько режимов работы, которые представлены ниже.


attrobj attach { all | <Name1>, <Name2>, …, <NameN> done | record } [partly|tree|wholly] <Obj> <Value1>, <Value2>, …, <ValueN>

Команда присваивает объекту <Obj> атрибуты с именами <Name1>, <Name1>, …, <NameN> и значениями <Value1>, <Value2>, …, <ValueN>. Ключ all позволяет присвоить все имеющиеся атрибуты. Ключ record позволяет получить список атрибутов для присвоения из рабочей записи. В качестве объекта <Obj> может выступать объект K3 (<Object>), несколько объектов (group <Objects>), рабочая запись (record), блок (block <Name>).

Также присвоение атрибутов объектам может осуществляться с перебором (question). В последнем случае перед присвоением очередному объекту атрибутов выдается запрос, нужно ли данному объекту атрибуты присваивать. При этом текущий объект выделяется. В макропрограммах данный режим работы неудобен.


attrobj edit [partly|tree|wholly] <Obj> all | <Name1>, <Name2>, …, <NameN> done <Value1>, <Value2>, …, <ValueN>

Команда редактирует у объекта <Obj> атрибуты с именами <Name1>, <Name1>, …, <NameN> и присваивает им новые значения <Value1>, <Value2>, …, <ValueN>. Ключ all позволяет отредактировать все имеющиеся атрибуты. В качестве объекта <Obj> может выступать объект K3 (<Object>), рабочая запись (record), блок (block <Name>).


attrobj copy [partly|tree|wholly] <Obj1> all | <Name1>, <Name2>, …, <NameN> done <Obj2>

Команда копирует у объекта <Obj1> атрибуты с именами <Name1>, <Name1>, …, <NameN> и присваивает их объекту <Obj2>. Ключ all позволяет копировать все имеющиеся атрибуты. В качестве объектов <Obj1> и/или <Obj2> может выступать объект K3 (<Object>), рабочая запись (record), блок (block <Name>).

Дерево объектов

Также копирование атрибутов объектам может осуществляться с перебором (question). В последнем случае перед присвоением очередному объекту атрибутов выдается запрос, нужно ли данному объекту атрибуты присваивать. При этом текущий объект выделяется. В макропрограммах данный режим работы неудобен.


attrobj delete [partly|tree|wholly] <Obj> all | <Name1>, <Name2>, …, <NameN> done

Команда удаляет у объекта <Obj> атрибуты с именами <Name1>, <Name1>, …, <NameN>. Ключ all позволяет удалить все имеющиеся атрибуты. В качестве объекта <Obj> может выступать объект K3 (<Object>), рабочая запись (record), блок (block <Name>).

Также копирование атрибутов объектам может осуществляться с перебором (question). В последнем случае перед присвоением очередному объекту атрибутов выдается запрос, нужно ли данному объекту атрибуты присваивать. При этом текущий объект выделяется. В макропрограммах данный режим работы неудобен.


attrobj infotree <Object>

Команда отображает значения атрибутов объекта по дереву (с использованием диалогового окна, см. рисунок). Поскольку данная команда использует диалоговое окно, применять эту команду в макропрограммах не рекомендуется.


attrobj edittree <Object>

Команда позволяет редактировать значения атрибутов объекта по дереву (с использованием диалогового окна). Поскольку данная команда использует диалоговое окно, применять эту команду в макропрограммах не рекомендуется.

attrinfo

Просмотр значений атрибутов

attrinfo info [partly|tree|wholly] <Obj>

Команда отображает в диалоговом окне значения атрибутов объекта <Obj>. В качестве объекта <Obj> может выступать объект K3 (<Object>), рабочая запись (record), блок (block <Name>). Поскольку данная команда использует диалоговое окно, применять эту команду в макропрограммах не рекомендуется.




Функции работы с атрибутами объектов

За работу с атрибутами объектов отвечают функции: AttrType, IsAttrDef, IsAssign, IsValue, GetAttr, GetAttrText, TextByStr, attrdelete, attrcopy, AttrNmScan.

AttrType

INT AttrType(STRING <Name>)

Функция возвращает тип атрибута c именем <Name>:

1 — Строка текста;
2 — Числовой;
3 — Логический;
4 — Многострочный текст;
0 — Атрибут не определен

IsAttrDef

LOGICAL IsAttrDef(STRING <Name>)

Функция проверяет, определен ли в данный момент атрибут с именем <Name>.

Функция возвращает

1 — атрибут определен,
0 — атрибут не определен.

IsAssign

LOGICAL IsAssign(STRING <Name> [,VARIANT <Holder>])

Проверяет, присвоен ли владельцу <Holder> атрибут с именем <Name>.

Необязательный параметр <Holder> может быть одним из следующих типов:

  • OBJECT — владелец - указанный объект;
  • STRING — владелец - блок с именем заданным строкой <Holder>;
  • INT — владелец - рабочая запись.

Без указания владельца <Holder>, может использоваться сценариями группового выбора в выражении, задающем условие выбора по атрибутам.

Пример:

select attribute “IsAssign(\”posit\”)”

IsValue

LOGICAL IsValue(STRING <Name> [,VARIANT <Holder>])

Функция проверяет, имеет ли значение атрибут с именем <Name> у владельца <Holder>. То есть, атрибут может быть присвоен объекту, а значение ему не присвоено.

Необязательный параметр <Holder> может быть одним из следующих типов:

  • OBJECT - владелец - указанный объект;
  • STRING - владелец - блок с именем заданным строкой <Holder></code>;
  • INT - владелец - рабочая запись.

Без указания владельца <Holder>, может использоваться сценариями группового выбора в выражении, задающем условие выбора по атрибутам.

Пример:

select attribute “IsValue(\”posit\”)”

GetAttr

VARIANT GetAttr(VARIANT <Holder>, STRING <Name>, VARIANT <Defvalue>)

Функция возвращает значение атрибута с именем <Name> у владельца <Holder>. Если атрибут не определен или не присвоен, возвращает значение, заданное параметром <Defvalue>.

Необязательный параметр <Holder> может быть одним из следующих типов:

  • OBJECT - владелец — указанный объект;
  • STRING - владелец — блок с именем, заданным строкой <Holder>;
  • INT - владелец — рабочая запись.

GetAttrText

INT GetAttrText(VARIANT <Holder>, STRING <Name>, {STRING ARRAY <S> | STRING <ArrayName> })

Если атрибут с именем <Name> имеет тип «многострочный текст», функция заполняет массив <S> строками этого текста. Если количество элементов в массиве <S> меньше количества строк, заполняется весь массив.

Функция возвращает количество заполненных элементов массива.

Для атрибутов других типов возвращает ноль.

  • OBJECT - владелец — указанный объект;
  • STRING - владелец — блок с именем заданным строкой <Holder>;
  • INT - владелец — рабочая запись.

Если вместо имени массива <S> указана строковая переменная <ArrayName>, то создается массив с таким именем и заполняется строками текстового атрибута. Размерность массива в этом случае равна количеству строк в текстовом атрибуте.

TextByStr

INT TextByStr(VARIANT <Holder>, STRING <Textname>, INT <Num>, STRING ARRAY <Arr>)

Функция формирует текстовый атрибут с именем <Textname> у владельца <Holder> по первым <Num> элементам строкового массива <Arr>. Шаблон указанного атрибута уже должен существовать.

Функция возвращает количество заполненных строк в текстовом атрибуте.

attrdelete

INTEGER attrdelete(STRING <AttrName1>[, STRING <AttrName2>[, ...]])

Функция удаляет у всех объектов всех уровней атрибуты <AttrName1>, <AttrName2> и т.д. и возвращает количество обработанных объектов или -1, если произошла ошибка. Если атрибута с заданным именем не существует, функция игнорирует этот атрибут.

attrcopy

INTEGER attrcopy(STRING <AttrNameSrc>, STRING <AttrNameDst>)

Функция копирует значение атрибута <AttrNameSrc> в атрибут <AttrNameDst> у всех объектов всех уровней и возвращает количество обработанных объектов или -1, если произошла ошибка.



Примечание: Функция реализована пока только для числовых атрибутов.



AttrNmScan

INT AttrNmScan(VARIANT <ArrayName>[, OBJECT <Object>])

Функция заполняет массив <ArrayName> именами атрибутов. Если <ArrayName> имеет тип STRING, то функция задает имя создаваемого массива, в который будут занесены имена атрибутов. Если <ArrayName> имеет тип ARRAY, то в него будут занесены имена атрибутов.

Если задан параметр <Object>, то в <ArrayName> будут занесены имена атрибутов, назначенные этому объекту. Если второй параметр не задан, то в <ArrayName> будут занесены имена все определенных в системе шаблонов атрибутов.

Функция возвращает количество заполненных элементов в массиве <ArrayName>.

Если размерности массива <ArrayName> не достаточно, то функция вернет количество заполненных элементов в массиве <ArrayName> со знаком "минус".

Функции работы с атрибутами в группе

Int SetAttrValG(object <Obj>, string <Name>, variant <Value>)

Функция SetAttrValG присваивает атрибуту с именем <Name> у объекта <Obj>, входящего в состав группы значение <Value>. Функция возвращает:

1 - Значение присвоено;
2 - У данного объекта <Obj> нет атрибута с именем <Name>;
3 - Несоответствие типов. Тип атрибута с именем <Name> отличается от типа <Value>;
0 - Прочие виды ошибок


Int DelAttrValG(object <Obj>, string <Name>)

Функция DelAttrValG удаляет атрибут с именем <Name> у объекта <Obj>. Функция возвращает:

1 - Удаление прошло успешно;
2 - У данного объекта <Obj> нет атрибута с именем <Name>;
0 - Прочие виды ошибок


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