Files
kompas3d-mcp/docs/Kompas3D_SDK/guides/dynamic.md
T
mikhail e1337e4016 feat(sdk-docs): MD-база знаний SDK — в репозиторий; генератор и зеркало убраны
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>
2026-05-26 20:00:05 +03:00

90 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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);
};
## Пример обработки динамического запроса при создании панели инструментов
![st_reduc](../resources/images_st_reduc.jpg)
В качестве примера используется процесс указания точки и угла 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.