e1337e4016
docs/Kompas3D_SDK/ становится каноническим источником справки КОМПАС SDK и включается в репозиторий (2491 файл, ~14 МБ). HTML-зеркало docs/KOMPAS_SDK_ru-RU/ (~1.4 ГБ, © АСКОН) и генератор tools/build_kompas3d_sdk.py больше не нужны — регенерация не предполагается. - .gitignore: MD-база разблокирована; зеркало остаётся проигнорированным (safety-net на случай повторной локальной выгрузки). - CLAUDE.md / SKILL.md: убраны упоминания регенерации и зеркала. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
90 lines
6.6 KiB
Markdown
90 lines
6.6 KiB
Markdown
---
|
||
title: "Пример использования функций работы с динамическими массивами"
|
||
type: guide
|
||
api: [api7]
|
||
tags: [guide, api7, dynamic]
|
||
sources:
|
||
- dynamic_massiv_func_example.html
|
||
---
|
||
|
||
|
||
## Пример использования функций работы с динамическими массивами
|
||
|
||
struct User_Data // определение структуры пользовательского массива
|
||
{
|
||
int I;
|
||
char *c;
|
||
float f;
|
||
};
|
||
//функция удаляет элемент User_Data пользовательского массива
|
||
void WINAPI DelUserFunc (void *val)
|
||
{
|
||
User_Data *tmp = (User_Data *)val;
|
||
Message(tmp->c);
|
||
delete [] tmp->c;
|
||
delete tmp;
|
||
}
|
||
//функция добавляет элемент User_Data в пользовательский массив
|
||
int CreateUserItem (reference arr, int i, char *c, float f)
|
||
{
|
||
User_Data* tmp = new User_Data;
|
||
tmp->i = I;
|
||
tmp->c = new char [strlen(c) +1];
|
||
strcpy (tmp->c, c);
|
||
tmp->f = f;
|
||
return AddArrayItem (arr, -1, tmp, 0);
|
||
}
|
||
//функция выдает содержимое элемента User_Data
|
||
void ShowUserItem (User_Data & tmp)
|
||
{
|
||
char buf[128];
|
||
sprintf (buf, " i=%d f=%f\n c=%s ", tmp.i, tmp.f, tmp.c);
|
||
Message (buf);
|
||
}
|
||
void Array_Example (void)
|
||
{
|
||
User_Data *tmp;
|
||
//создадим пользовательский массив неопределенной длины
|
||
reference userArr = CreateArray (USER_ARR, DelUserFunc);
|
||
if (!CreateUserItem (userArr, 1, "январь", 31.))
|
||
MessageBoxResult();
|
||
if (!CreateUserItem (userArr, 2, "февраль", 29.))
|
||
MessageBoxResult();
|
||
if (!CreateUserItem (userArr, 3, "март", 31.))
|
||
MessageBoxResult();
|
||
//просмотрим массив
|
||
for (int i=0; i< GetArrayCount(userArr); i++)
|
||
{
|
||
// получим указатель на элемент массива
|
||
GetUserArrayItem (userArr, i, &(void*)tmp);
|
||
ShowUserItem (*tmp);
|
||
}
|
||
ClearArray (userArr); //очистить массив
|
||
Message ("удаляем массив");
|
||
DeleteArray (userArr);
|
||
};
|
||
|
||
|
||
## Пример обработки динамического запроса при создании панели инструментов
|
||
|
||

|
||
|
||
В качестве примера используется процесс указания точки и угла Placement.
|
||
Процесс содержит системную панель, элементы управления которой позволяют задать два параметра - точку и угол. Можно выделить 3 состояния процесса:
|
||
•указание точки,
|
||
•указание угла,
|
||
•все задано.
|
||
Если процесс переходит в состояния все задано, то возможны два варианта.
|
||
Автоматически запускается создание объекта.
|
||
Процесс ожидает ручного нажатия кнопки Создать объект . При этом никакие функции CallBack не выполняются. В API за это отвечает свойство IProcessParam::AutoReduce,
|
||
Таким образом, создавая панель, содержащую кнопку Автосоздание объекта с возможностью управлять ее состоянием (нажата/отжата) через ButtonUpdate, необходимо в первый раз синхронизировать состояния кнопки и флага IProcessParam::AutoReduce.
|
||
Предположим, что процесс запускается с нажатой кнопкой автосоздания. Необходимо задать значение IProcessParam::AutoReduce, равное TRUE. Поля задания точки и угла на панели расфиксированы. Первый щелчок мыши в поле чертежа фиксирует точку, второй фиксирует угол и по флагу IProcessParam::AutoReduce запускается создание объекта. После этого поля задания точки и угла расфиксируются, то есть процесс переходит в начальное состояние (благодаря флагу IProcessParam::AutoReduce=TRUE).
|
||
В случае нажатия кнопки автосоздания в процессе, событие придет в библиотеку, и инвертирует флаг IProcessParam::AutoReduce в самом процессе автоматически.
|
||
Пользовательская панель может содержать только элементы управления, а не поля задания параметров. На построения они не влияют, так как таблица состояний статическая и описывается до запуска процесса. Таким образом, если процесс перешел в состояние все задано, то есть значения всех параметров установлены и на пользовательской панели можно только отрабатывать изменение состояния элементов управления, никакие CallBack - функции не выполняются.
|
||
У процесса указания точки Cursor аналогичная схема работы, но задаваемый параметр всего один и первый же щелчок мыши в поле чертежа переводит процесс в состояние все задано.
|
||
Для имитации работы процесса Cursor с постоянным присутствием вызовов CallBack'ов необходимо выполнить следующие действия:
|
||
1. На старте процесса задать значение IProcessParam::AutoReduce, равное TRUE.
|
||
2. В событии ButtonClick на нажатия кнопки автосоздания всегда возвращать FALSE, то есть не давать процессу инвертировать значение IProcessParam::AutoReduce.
|
||
3. Управлять состоянием кнопки в ButtonUpdate по собственному усмотрению.
|
||
4. Всю логику работы реализовать в функции обратной связи CallBack, то есть, если заданы не все значения параметров, то возвращать 1, а если все, то 0.
|