--- 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); }