---
title: "ksCreateAttr - Создать атрибут объекта"
type: guide
api: [api7]
tags: [guide, api7, kscreateattr]
sources:
  - kscreateattr.html
---

*API экспортных функций > Функции работы с прикладной библиотекой  > Функции работы с атрибутами *


## ksCreateAttr - Создать атрибут объекта

Пример...
Аналог данной функции при использовании Automation - метод ksAttributeObject::ksCreateAttr.
Синтаксис:
```
reference ksCreateAttr (reference pObj,
ksAttribute * attr,
double attrID,
char *libname);
Входные параметры:
pObj    - указатель на объект (группа, вид, отдельный объект), атрибут которого создается. Если pObj = 0, то создается атрибут документа,
attr    - указатель на структуру параметров атрибута ksAttribute,
attrID    - уникальный номер типа атрибута,
libName    - имя библиотеки типов атрибутов, если libname = NULL, то тип атрибута берется из текущего документа.
Возвращаемое значение:
указатель на атрибут    - в случае удачного завершения,
0    - в случае неудачи.
```
Примечания:
1. Указатель на объект reference pObj может быть получен следующими способами:
– с помощью функций Итератора CreateIterator, MoveIterator.
– с помощью функций создания объектов, возвращающих указатель reference на созданный объект, например, reference LineSeg.
2. Уникальный номер типа атрибута attrID может быть получен с помощью поля typeid структуры параметров типа атрибута LibraryAttrTypeParam, которая может быть получена с помощью функции ksGetLibraryAttrTypesArray, или с помощью функции GetAttrKeysInfo. Тип атрибута должен быть предварительно создан, например, с помощью функции ksCreateAttrType.


## ksCreateAttr - Пример использования

//Создадим атрибут типа "таблица неопределенной длины",
//тип содержит три колонки: DOUBLE_ATTR_TYPE(double),
// STRING_ATTR_TYPE(строка),LINT_ATTR_TYPE(long int).
//Атрибут создадим для внутреннего макроэлемента.
//Макроэлемент на момент создания атрибута временный, т.е. не в модели чертежа.
//Отредактируем атрибут в диалоге редактирования атрибута - добавим строку, удалим.
ksAttribute attrPar;
memset(&attrPar, 0, sizeof(attrPar));
struct TypeStr {
double a;
char c [MAX_TEXT_LENGTH];
long b;
} ;
static TypeStr arrBuf [3] = { {187654321.0, "1 строка", 19999l},
{287654321.0, "2 строка", 29999l},
{387654321.0, "3 строка", 39999l} };
//массив, определяющий для каждой колонки видимость-невидимость
//(вторая колонка выключена)
unsigned char fV[3]= {1,0,1};
attrPar.key1 = 1; // рекоменд. как код разработчика
attrPar.key2 = 10; // рекоменд. как код атрибута
attrPar.key3 = 100; // рекоменд. как код разработчика
attrPar.key4 = 0; // системный код атрибута
// значения от 0 до 1000 зарезервированы
// за АО "АСКОН"
attrPar.flagVisible = fV; //массив, определяющий для каждой колонки
// атрибута видимость-невидимость
//0 -видимое поле 1- невидимое поле
attrPar.values = &arrBuf ; // массив значений ячеек таблицы атрибутов
// сначала все значения для 1-ой строки,
// затем все значения для 2-ой строки и т.д.
attrPar.valSize = sizeof(TypeStr)*3;
strcpy(attrPar.password,"111"); //пароль
reference pObj;
char nameFile[128];
if(!ChoiceFile("*.lat",NULL, nameFile, 128))
nameFile[0]='\0'; //будем искать в документе
//номер типа атрибута
//(тип создан ранее,
//если nameFile пустое - ищем тип атрибута в документе)
double numb;
int j = ReadDouble ("Ввести номер типа атрибута", 1000.,0, 1e12,&numb);
if(j) {
//временная группа
reference g = NewGroup(1);
//создадим пустой macro
Macro (0);
reference m = EndObj();
pObj = LineSeg(10, 10, 20, 20, 1);
//добавим отрезок в macro
ksAddObjectToMacro (m, //указатель на макроэлемент
pObj ); //указатель на добавляемый объект
//создадим для отрезка, который принадлежит macro атрибут
reference attr= ksCreateAttr(pObj, &attrPar, numb, nameFile);
if (!attr)
MessageBoxResult(); // неудачное завершение - выдадим результат работы нашей функции
else {
//вызываем диалог для редактирования атрибута
ViewEditAttr ( attr, 2, "111"); // пароль атрибута для просмотра 0
TypeStr arrBuf1 = { 222222222222.0, "новая строка", 4444444l} ;
//добавим в конец атрибута еще одну строку
ksAddAttrRow (attr, // указатель атрибута
-1, // номер строки, после которой вставлять, -1 -в конец
fV, // указатель на массив флагов видимости ячеек строки
&arrBuf1, // указатель на память пользователя, откуда копируются данные
sizeof(TypeStr), // размер выделенной памяти под value
"111"); // пароль атрибута
//удалим первую строку
ksDeleteAttrRow (attr, // указатель атрибута
0, "111"); // номер строки
//узнаем количество колонок и строк в атрибуте
unsigned int rowsCount, columnsCount;
GetAttrTabInfo (attr, // указатель атрибута
&rowsCount, // количество строк
&columnsCount);// количество столбцов
char buf[250];
sprintf(buf, "rowsCount = %d columnsCount = %d",rowsCount,columnsCount);
//выведем количество колонок и строк в атрибуте на экран
Message (buf);
}
//закроем временную группу
EndGroup();
//поставим все объекты временной группы в модель чертежа
StoreTmpGroup(g);
}
