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

202 lines
6.6 KiB
Markdown

---
title: "Пример использования функций работы с базами данных"
type: guide
api: [api7]
tags: [guide, api7, func]
sources:
- func_rab_s_bases_example.html
---
## Пример использования функций работы с базами данных
//пример текстового файла 1.loa с тремя параметрами - шириной, высотой и типом линии прямоугольника
/*
10.0 100 1
15.0 80 2
20.0 120 1
*/
#ifndef __LIBTOOL_H
#include <libtool.h>
#endif
#ifndef __LIBDB_H
#include <libdb.h>
#endif
static void ReadFirstStatement(reference bd, reference r1, void *b) {
// вспомогательная функция чтения записей
char buf[40];
int i;
do { // считываем все записи выборки
i= ReadRecord(bd, r1, b);
if (i) {
sprintf(buf, "a=%4.1f b=%4.1f t= %d", b->a, b->b, b->t);
Message(buf);
}
} while(i);
Message("конец выборки");
} /* ReadFirstStatement */
void ExampleDB (void) {
int i;
char buf[40];
struct {
double a;
double b;
int t;
} b;
// создать блок заголовка базы данных
reference bd = CreateDB ("TXT_DB");
// связать с файлом базы данных 1.loa
ConnectDB(bd, "1.loa");
// задаем отношение из двух действительных и одного целого поля
reference r1 = Relation(bd);
RDouble ("a");
RDouble ("b");
RInt ("");
EndRelation();
// определяем запрос для считывания всех полей(колонок) записи
DoStatement(bd, r1, ""); // равносильно DoStatement(bd, r1, "1 2 3");
// cчитываем все записи
ReadFirstStatement(bd, r1, &b);
// выдать вторую запись
Condition(bd, r1, "Index1000 = 2");
ReadFirstStatement(bd, r1, &b);
// по условию выдать первую и третью запись(см. файл 1.loa)
Condition(bd, r1, "a=10 || b>100");
ReadFirstStatement(bd, r1, &b);
//задаем отношение для считывания только второго поля записи
reference r2 = Relation(bd);
RChar("b", 20, 0);
EndRelation();
// Освободить запрос базы данных
FreeStatement(bd, r1, «»);
DoStatement(bd, r2, "2");
do {
i= ReadRecord(bd, r2, buf);
if (i) {
Message(buf);
}
} while(i);
Message("конец выборки");
DisconnectDB(db);
// удаляем блок заголовка базы данных
DeleteDB(bd);
}; /* ExampleDB */
## Пример использования функций работы с фрагментами
void ReadFragment_Example (void) {
PlacementParam par;
par.xBase = 30; par.yBase = 40;
par.ang = 0; par.scale = 1 ;
ReadFragment("c:\\kompas5\\1.frw", 0, &par);
//Пример вставки фрагмента внешней ссылкой
//определим фрагмент для вставки
pDefFrg = FragmentDefinition("c:\\kompas5\\1.frw", "frw1", 1);
if(pDefFrg) {
PlacementParam par;
par.xBase = 80; par.yBase = 70;
par.ang = 45; par.scale = 2 ;
reference pInsFrg = InsertFragment(pDefFrg, 0, &par);
LightObj (pInsFrg, 1);
Message("вставка фрагмента внешней ссылкой");
LightObj (pInsFrg, 0);
}
// Пример вставки локального фрагмента
// определим фрагмент для вставки
reference pDefFrg = 0;
//определим локальный фрагмент
if(LocalFragmentDefinition("local")) {
LineSeg(0, 0, 10, 0, 1);
LineSeg(0, 0, 0, 10, 1);
ArcByPoint(0, 0, 10, 10, 0, 0,10, -1, 1);
pDefFrg = CloseLocalFragmentDefinition();
}
if(pDefFrg) {
PlacementParam par;
par.xBase = 100; par.yBase = 40;
par.ang = 45; par.scale = 1 ;
reference p = InsertFragment(pDefFrg, 0, &par);
LightObj (p, 1);
Message("вставка локального фрагмента");
LightObj (p, 0);
}
}; /* ReadFragment */
## Пример использования функций для редактирования допуска формы
// редактирование допуска формы
reference pObj;
RequestInfo info;
double x, y;
memset(&info, 0, sizeof(info));
info.prompt = "Укажите допуск формы";
int j = Cursor(&info, &x, &y, 0);
if (j) {
if(ExistObj(pObj = FindObj(x, y, MAXDOUBLE))){
//узнаем тип объекта
int type =GetObjParam( pObj,0,0,0); //указатель на графический
объект
if (type == TOLERANCE_OBJ) {
unsigned int numb;
char buf[128];
//открыть допуск формы для редактирования
ksOpenTolerance(pObj);
ToleranceParam par;
//параметры допуска формы
GetObjParam( pObj, //указатель на графический объект
&par, //указатель на структуру параметров
sizeof(ToleranceParam), //размер структуры
параметров
ALLPARAM); //тип считывания параметров
sprintf(buf, "базовая точка=%d стиль=%d расположение-%s\nx=%5.1f
y=%5.1f ",
par.tBase, par.style, par.type ?
"вертикальное":"горизонтальное", par.x, par.y);
Message(buf);
TextLineParam par1;
//в цикле будем брать все существующие ячейки
while (ksGetToleranceColumnText(&numb, &par1)!=0) {
sprintf(buf, "numb =%d ", numb);
Message(buf);
sprintf(buf, "style=%d ", par1.style);
Message(buf);
TextItemParam par3;
for (int j=0; j< GetArrayCount(par1.pTextItem); j) {
GetArrayItem(par1.pTextItem, j, &par3, sizeof(TextItemParam));
if (!par3.tip)
sprintf(buf, "компонента=%d h=%5.1f\ns=%s\n
fontName=%s\nбитвектор =%d ",j,par3.font.height,par3.s,
par3.font.fontName, par3.font.bitVector);
else
sprintf(buf, "компонента=%d тип = %d номер спецзнака=%d
",j,par3.tip,par3.iSNumb);
Message(buf);
}
DeleteArray(par1.pTextItem); //очистим массив компонент
}
//заменим параметры
par.x = 10;
par.y = 10;
SetObjParam( pObj, //указатель на графический объект
&par, //указатель на структуру параметров
sizeof(ToleranceParam ), //размер структуры
параметров
ALLPARAM); //тип считывания параметров
ColumnNumber(2);
TextLine (NEW_LINE ,0,0 ,"вторая ячейка");
ksDivideTableItem(3, 1, 2);
ColumnNumber(4);
TextLine (NEW_LINE ,0,0 ,"4");
// ksSetTableBorderStyle(1,2,1);
// ksClearTableColumnText(0);
EndObj();//закрыли объект "допуск формы"
}
else
Error("это не допуск формы");
}
else
Error("нет объекта");
}