Files
kompas3d-mcp/docs/Kompas3D_SDK/guides/cursor.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

159 lines
6.0 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: "Cursor - Указать положение объекта или определить вариант действия"
type: guide
api: [api7]
tags: [guide, api7, cursor]
sources:
- cursor.html
---
*API экспортных функций > Функции работы с прикладной библиотекой  > Функции ввода параметров *
## Cursor - Указать положение объекта или определить вариант действия
Пример...
Аналог данной функции при использовании Automation - метод ksDocument2D::ksCursor.
Синтаксис:
```
int Cursor (RequestInfo *info, double *x, double *y, void * phantom);
Входные параметры:
Info - указатель на структуру параметров запроса к системе,
x,y - координаты введенной точки,
Phantom - указатель на структуру управления фантомом, определяющую тип движения курсора.
Возвращаемое значение:
1 - в случае удачного завершения,
0 - в случае неудачи.
```
Примечание:
Возможные варианты (команды) задаются в строке commands структуры info и разделяются восклицательными знаками или пробелами. Если вместо строки в качестве параметра передать идентификатор меню из файла ресурсов, то соответствующее меню будет выдано в окне приглашений. Если в качестве адреса _callBack передается NULL, то действие функции прекращается после первого шага.
## Cursor- Пример использования
#ifndef __LIBTOOL_H
#include <libtool.h>
#endif
int type, flag=0;
//функция обратной связи для выполнения цикла в Cursor
int far __export pascal CallBackC (int com, double *x, double *y, RequestInfo *info,
void *phantom, int/* dynamic */) {
Phantom *valueub = (Phantom *)phantom;
switch (com) {
case 1:
case 2:
type = com;
break;
case -1: //поставить в модель
MoveObj(rub->type1.gr, *x, *y);
StoryTmpGroup(rub->type1.gr); //поставить временную группу в вид
ClearGroup(rub->type1.gr);
break;
}
//группа для фантома должна быть временная и обновляться при изменении вида
//отрисовки
if (rub->type1.gr)
DeleteObj(rub->type1.gr);
rub->type1.gr = NewGroup(1); // временная группа
if((flag==1 && com==1)||(flag==2 && com==2))
type = 3;
//обновляется не только изображение но и меню для запроса
switch (type ) {
case 1:
Circle (0, 0, 20, 1);
info->commands = !Квадрат !Треугольник ;
flag = 1;
break;
case 2:
LineSeg(-10, 0, 10, 0, 1);
LineSeg(10, 0, 0, 20, 1);
LineSeg(0, 20, -10, 0, 1);
info->commands = !Окружность !Квадрат;
flag = 2;
break;
case 3:
LineSeg(-10, 0, 10, 0, 1);
LineSeg(10, 0, 10, 20, 1);
LineSeg(10, 20, -10, 20, 1);
LineSeg(-10, 20, -10, 0, 1);
info->commands = !Окружность !Треугольник;
flag = 0;
break;
}
EndGroup();
return 1;
}
void Cursor_Example (void) {
type = 1;
int j = 1;
struct Phantom rub;
rub.type1.xBase = 0;
rub.type1.yBase = 0;
rub.type1.scale = 1;
rub.phType = 1;
rub.type1.ang = 0;
double x, y;
rub.type1.gr = NewGroup(1); // временная группа
Circle (0, 0, 20, 1);
EndGroup();
RequestInfo info;
memset(&info, 0, sizeof(info));
info.commands = "!Квадрат !Треугольник";
info.callBack = CallBackС;//указываем адрес функции обратной связи для Cursor,
Cursor(&info, &x, &y, &rub);
}; /* Cursor*/
struct RequestInfo info;
memset(&info,0,sizeof(RequestInfo)); //Структура информации
info.prompt="Укажите начальную точку";
Cursor(&info,&xBase,&yBase,0);//Начальная точка
struct Phantom f;
memset(&f,0,sizeof(Phantom)); //Фантом
f.type2.xBase = xBase;
f.type2.yBase = yBase;
info.prompt="Укажите точку на окружности";
f.phType=7; // тип "резиновой" нити - окружность
double x,y;
//если был запущен другой процесс то не запускается второй Cursor
if (!ksIsActiveProcessRunnig () && Cursor(&info,&x,&y,&f))
Circle(xBase, yBase, DistancePntPnt (xBase, yBase, x,y),1);
else
Message("Запущен другой процесс");
//Функция обратной связи Cursor для построения пользовательского фантома (в данном случае "резиновый" отрезок)
int far __export pascal CallBackEskLinsvzLin(int com ,double *x,double *y,RequestInfo*,void *phantom,int dynamic) {
Phantom *valueub = (Phantom *)phantom;
if (!dynamic) { //Фиксация точки
if (com == -1) {
StoreTmpGroup(rub->type6.gr);
ClearGroup(rub->type6.gr);
}
DeleteObj(rub->type6.gr);
return 0;
}
else {
if (fabs(xBase -*x) > 0.001 || fabs(yBase -*y) > 0.001) {
DeleteObj(rub->type6.gr);
rub->type6.gr = NewGroup(1);
LineSeg(xBase, yBase, *x, *y, 1);
EndGroup();
}
return 1;
}
}
struct RequestInfo info;
memset(&info,0,sizeof(RequestInfo)); //Структура информации
info.prompt="Укажите начальную точку";
Cursor(&info,&xBase,&yBase,0); //Начальная точка
info.dynamic=1;
info.callBack=CallBackEskLinsvzLin;
struct Phantom f;
memset(&f,0,sizeof(Phantom)); //Фантом
f.type2.xBase = xBase;
f.type2.yBase = yBase;
f.phType=6; //пользовательский фантом
info.prompt="Укажите точку на линии";
f.type6.gr = NewGroup(1);
LineSeg(xBase, yBase, xBase+0.1, yBase,1);
EndGroup();
double x,y;
Cursor(&info,&x,&y,&f);