void GetXRYR12(int x1, int y1, int r1, int x2, int y2, int r2, int *xr1, int *yr1, int *xr2, int *yr2) – решает систему вида:
(x-x1)^2 +(y-y1)^2=r1^2,
(x-x2)^2 +(y-y2)^2=r2^2;
Возвращает 2 возможных координаты центра в виде (xr1;yr1) и (xr2;yr2).
void GetXPYP2(float k, int b0, int x2, int y2, int r, int *xr1, int *yr1, int *xr2, int *yr2) – решает систему вида:
y=kx+b0,
(x-x2)^2 +(y-y2)^2=r^2;
Возвращает 2 возможных координаты точек пересечения в виде (xr1;yr1) и (xr2;yr2).
void GetYP2(float x, float xr, float yr, float r, float *y1, float *y2) – функция ищет координаты точек пересечения вертикальной прямой и окружности. Решает систему вида:
x=n,
(x-x2)^2 +(y-y2)^2=r^2;
Возвращает 2 возможных координаты точек пересечения в виде y1 и y2.
void GetKB(float x1, float y1, float x2, float y2, float *k, float *b) – функция ищет коэффициенты k и b прямой y=kx+b по координатам двух точек, принадлежащих данной прямой
void GetXYl(float x11,float y11,float x12,float y12, float x21,float y21,float x22,float y22, float *xr,float *yr) – функция ищет координаты точки пересечения 2 прямых. Прямые задаются 2 точками, лежащими на них. Решает систему вида:
y=k1x+b1,
y=k2x+b2;
Возвращает координату точки пересечения в виде (xr;yr)
int fromAtoB(int a, int b) – вычисляет длину дуги в градусах от угла a до угла b против часовой стрелки.
int NumLength(int i) – вычисляет количество символов в числе i.
void IntToStr(int i, char *str) – преобразует переменную i типа int в строку символов на которую указывает str.
Функции отвечающие за отрисовку данных и генерирование управляющей программы для УЧПУ
Все функции, начинающиеся с «draw_» предназначены для рисования элементов контура заготовки и генерирование управляющей программы. Для всех этих функций есть дополнительные функции со схожими именами к которым дописано «_close». Такие функции закрывают активное окно (в котором пользователь вводил данные) после своего выполнения.
Все функции, начинающиеся с «Use» предназначены для изменения глобальных переменных, используемых при выборе способа построения. Также эти функции изменяют текст в TextBox’е, чтобы пользователь заранее имел графическое представление о том, как будет происходить построение.
void Draw_line(void *data) – рисует линию используя 2 координаты
void Draw_Xline_close(void *data) – рисует линию используя угол наклона к оси 0X и конечную координату по X и закрывает окно
void Draw_Yline_close(void *data) – рисует линию используя угол наклона к оси 0X и конечную координату по Y и закрывает окно
void Draw_arc(void *data) – рисует дугу
void Draw_arc_close_spin_modify(void *data) – модификация void Draw_arc(void *data), для случаев по и против часовой стрелки
void draw_sopr(void *data) – сопрягает последнюю точку графика с заданной одним из 4 способов
void Draw_sopr_line(void *data) – рисует дугу, сопрягающую последнюю точку со следующей прямой
void Draw_line_arc_close(void *data) – чертит линию по заданному углу наклона и сопрягает её с окружностью
void draw_sopr_arc_line(void *data) – сопрягает последнюю начерченную прямую с следующей (у новой прямой задаётся точка и угол)
Текст модулей программы
Текст модуля TMlist:
#include "cgui/mem.h"
#include "cgui.h"
/*константы (точка, линия, дуга, сопряжение)*/
#define T_POINT 1
#define T_LINE 2
#define T_ARC 3
#define T_SOP 4
#define T_Zarotov_Cilindr 1
/*структура сопряжения линии и окружности*/
typedef struct TZagotov_cilindr{
void *length;
void *diametr;
}TZagotov_cilindr;
/*структура номера инструмента и номера коррекции инструмента*/
typedef struct TInstrument{
int t;
int d;
}TInstrument;
/*структура сопряжения линии и окружности*/
typedef struct TCline_sopr{
void *line;
void *sopr;
int tsk;
}TCline_sopr;
/*структура сопряжения*/
typedef struct TCsopr{
float x1;//начальная точка
float y1;// прямой
float x2;//конечная точка
float y2;// прямой
float x3;// координаты
float y3;// точки
float xr;// центр
float yr;// окружности
float rad;// радиус окружности
int sopr;
int spin;
}TCsopr;
/*структура дуги*/
typedef struct TCarc{
float xr;// центр
float yr;// окружности
float r;// радиус окружности
int ang1;// начальный угол
int ang2;// конечный угол
int spin;// направление вращения 0-против часовой 1- по часовой
}TCarc;
/*структура цикла точения (G180) STX=_ STZ=_ STP=_ TWD=_ PRP=_ OBR=_ FRF=_ FTF=_ FAP=_ FPF=_*/
typedef struct TCyclet{
int TYP; //
float STX; //
float STZ; //
float STP; //
float TWD; //
float PRP; //
int OBR; //
float FRF; //
float FTF; //
float FAP; //
float FPF; //
}TCyclet;
/*структура цикла копирования (G181) STX=_ STZ=_ STP=_ TWD=_ PRP=_ OBR=_ FRF=_ FTF=_ FAP=_ FPF=_*/
typedef struct TCyclec{
int TYP; //
float STX; //
float STP; //
float PRP; //
int OBR; //
float FRF; //
float FTF; //
}TCyclec;
/*структура цикла резьбонарезания (G182) */
//TYP=_ STX=_ STZ=_ SBX=_ SBZ=_ STP=_ PRP=_ NPR=_ OBR=_
//FRF=_ ANG=_ STC=_ FTF=_ NB=_
typedef struct TCycler{
int TYP; //
float STX; //
float STZ; //
float SBX; //
float SBZ; //
float STP; //
float PRP; //
int NPR; //
int OBR; //
float FRF; //
float ANG; //
float STC; //
float FTF; //
int NB; //
}TCycler;
/*структура точки*/
typedef struct TCpoint{
float x1;// координаты
float y1;// точки
int t; //0-точка;1-быстрое перемещение; 2-стартовая точка цикла;
}TCpoint;
/*структура линии */
typedef struct TCline{
float x1;//начальная точка
float y1;// прямой
float x2;//конечная точка
float y2;// прямой
}TCline;
typedef struct mlist{
unsigned char type;
struct mlist *prev;
struct mlist *next;
void *data;
}mlist;
typedef struct TOList{
int count;
struct mlist *itemend;
struct mlist *items;
}TOList;
TOList *CMList;
void CreateList()
{
CMList=GetMem0(TOList, 1);
}
//выделяет память под елемент элемент
mlist *CMList_CreateItem()
{
return GetMem0(mlist, 1);
}
//берет элемент index
mlist *CMList_getitem(unsigned short index)
{
mlist *ml;
unsigned short i=0;
if(index>=CMList->count) return NULL;
for(ml=CMList->items; ml!=NULL; ml=ml->next)
{
if(index==i) return ml;
i++;
}
return NULL;
}
//добавляет элемент ftype = T_POINT или T_LINE или T_ARC или T_SOP;*fdata - указатель на тип TC***
CMList_add(unsigned char ftype, void *fdata)
{
mlist *ml;
ml=CMList_CreateItem;
if(CMList->count==0)
{
CMList->items=ml;
CMList->itemend=ml;
} else
{
CMList->itemend->next=ml;
}
ml->type=ftype;
ml->data=fdata;
ml->prev=CMList->itemend;
CMList->itemend=ml;
CMList->count++;
}
//удаляет элемент index
int CMList_del(unsigned short index)
{
mlist *ml;
unsigned short i=0;
if(index>=CMList->count) return -1;
if((index==0)&(CMList->count==1))
{
Release(CMList->items);
CMList->itemend=NULL;
CMList->items=NULL;
CMList->count=0;
return 0;
}
if((index==0)&(CMList->count>1))
{
ml=CMList_getitem(1);
Release(CMList->items);
CMList->items=ml;
CMList->items->prev=CMList->items->prev;
CMList->count--;
return 0;
}
if(index==CMList->count-1)
{
Release(CMList->items);
CMList->itemend=CMList->itemend->prev;
Release(CMList->itemend->next);
CMList->itemend->next=NULL;
CMList->count--;
return index;
}
ml=CMList_getitem(index);
ml->prev->next=ml->next;
Release(ml);
return index;
}
Текст модуля zzc3:
#include <allegro.h>
#include <string.h>
#include <math.h>
#include "cgui.h"
#include "cgui/mem.h"
#include <stdio.h>
#include "tmlist.c"
#define POINT 0
#define FILL 1
#define LINE 2
#define RECTANGLE 3
#define NR_COLORS 10
const
MYCOLOR = 65535;//цвет контура заготовки
LMP=148;//максимальное количество символов в управляющей программе
double pi = 3.1415926535;
int List_id; //указатель на ListBox в котором хранится управляющая программа
int nkol=0; //количество строк отображаемых ListBox'ом
float b_x=0, b_y=0; //хранит координаты последней точки контура
int GLspin=0;//прохождение дуги по (1) или против (0) часовой стрелки
int arcid;//указатель на окно Draw Arc
char *ProgList[32];//хранилище строк ListBox'а
int Type_Zagotov; //тип заготовки
int TEXT_XZ, mmw;
int Sopr=1; //тип сопряжения: первый или второй центр дуги
int soprid; //указатель на окно Sopr way
int soprlineid; //указатель на окно Line + ARC
int myangle=1; //тип сопряжения: по максимальной или по минимальной дуге
int nearpoint=1; //с ближней или дальней точкой окружности сопрягать прямую
int nearpointa=1; //при задании длины дуги координатой по Х определяет верхнюю или нижнюю точку конца дуги
int cycletype=0; //тип цикла
typedef struct t_mybmp //структура предназначена для хранения данных и указателя на элемент Canvas
{
int id;//указатель на Canvas
BITMAP *mybmp; /* the canvas' bitmap см пример DJGPP.zip\DJGPP\cgui\examples\21canvas.c строка 31 */
} t_mybmp;
t_mybmp *mcanv,*maincanv;
void asc_pict_form(void *data);
void asc_line_form(void *data);
void asc_circle_form(void *data);
void asc_start_point(int t);
void UseMax(int txt_name);
void UseMin(int txt_name);
void UseDownSopr(int txt_name);
void UseUpSopr(int txt_name);
void Proc_setpoint(void *data);
void make_a_canvas_window(void *data);
int NumLength(int i);
static void *index_creater(void *listdata, int i) //функция необходимая для корректной работы ListBox
//см пример DJGPP.zip\DJGPP\cgui\examples\10lists.c строка 47
{
char **strings = listdata;
return strings[i];
}
void SaveProg(void *data)
{
FILE *mfile;
char *file_name = "Prog.txt";
mfile = fopen(file_name, "wt");
int i;
for(i=0; i<=nkol; i++)
{
fputs(ProgList[i], mfile);
fputs("\n", mfile);
}
fclose(mfile);
}
void UpdateXZ(void)
//обновляет значения текущей конечной точки на экране
{
char *str;
str=malloc(100);
sprintf(str, "X=%.4f Z=%.4f", b_x, b_y);
UpdateTextBoxText(TEXT_XZ, str);
Refresh(TEXT_XZ);
}
void GetXRYR12(float x1, float y1, float r1, float x2, float y2, float r2, float *xr1, float *yr1, float *xr2, float *yr2)
//функция ищет координаты точек пересечения 2 окружностей
//где x1,y1,r1,x2,y2,r2 - коэффициенты системы уравнений состоящей из 2 окружностей
// (x-x1)^2 +(y-y1)^2=r1^2,
// (x-x2)^2 +(y-y2)^2=r2^2;
{
float c, k, p, q, vx1, vx2, vy1, vy2, dx; //c, k, p, q, dx - промежуточные переменные используемые в решении
c=(float)((x1*x1)-(x2*x2)+(y1*y1)-(y2*y2)+(r2*r2)-(r1*r1))/(float)(2*x1-2*x2);
k=((float)(y1)-(float)(y2))/((float)(x1)-(float)(x2));
p=(float)(2*k*x2-2*y2-2*c*k)/(float)(1+k*k);
q=(float)((y2*y2)+(x2*x2)+(c*c)-(r2*r2)-2*c*x2)/(float)(1.0+k*k);
vy1=sqrt((float)(p/2)*(p/2)-q)-(float)(p/2);
vy2=(-1)*sqrt((float)(p/2)*(p/2)-q)-(float)(p/2);
vx1=c-k*vy1;
vx2=c-k*vy2;
if (x1==x2) {vy1=(float)((y1+y2)/2); vy2=vy1;
dx=(float)(sqrt(r2*r2 - (float)((y2-y1)/2)*(float)((y2-y1)/2)));
vx1=x1+dx;
vx2=x1-dx;};
/**xr1=(int)(floor(vx1));
*xr2=(int)(floor(vx2));
*yr1=(int)(floor(vy1));
*yr2=(int)(floor(vy2));*/
*xr1= vx1;
*xr2= vx2;
*yr1= vy1;
*yr2= vy2;
}
void GetXPYP2(float k, float b0, float x1, float y1, float r, float *xr1, float *yr1, float *xr2, float *yr2)
//функция ищет координаты точек пересечения прямой и окружности
//где k,b0,x1,y1,r - коэффициенты системы уравнений состоящей из прямой и окружности
// y=kx+b0,
// (x-x2)^2 +(y-y2)^2=r^2;
{
float y2,a,b,c,D,vx1,vx2,vy1,vy2;
y2=(float)(b0-y1);
a=(float)(k*k+1);
b=(float)(2*k*y2-2*x1);
c=(float)(x1*x1+y2*y2-r*r);
D=sqrt(b*b-4*a*c);
vx1=((-1)*b+D)/(2*a);
vx2=((-1)*b-D)/(2*a);
vy1=k*vx1+b0;
vy2=k*vx2+b0;
/**xr1=(int)(floor(vx1));
*xr2=(int)(floor(vx2));
*yr1=(int)(floor(vy1));
*yr2=(int)(floor(vy2));*/
*xr1=vx1;
*xr2=vx2;
*yr1=vy1;
*yr2=vy2;
}
void GetYP2(float x, float xr, float yr, float r, float *y1, float *y2)
//функция ищет координаты точек пересечения вертикальной прямой и окружности
{float p,D,vy1,vy2;
p=(yr*yr)+(x-xr)*(x-xr)-(r*r);
D=sqrt(4*yr*yr-4*p);
vy1=(2*yr+D)/(2);
vy2=(2*yr-D)/(2);
/**y1=(int)(floor(vy1));
*y2=(int)(floor(vy2));*/
*y1=vy1;
*y2=vy2;
}
void GetKB(float x1, float y1, float x2, float y2, float *k, float *b)
//функция ищет коэффициенты k и b прямой y=kx+b по координатам двух точек
{
if (x1!=x2) {*k=(y1-y2)/(x1-x2); *b=y1-(*k)*x1;};
}
void GetXYl(float x11,float y11,float x12,float y12, float x21,float y21,float x22,float y22, float *xr,float *yr)
//функция ищет координаты точки пересечения 2 прямых. Прямые задаются 2 точками, лежащими на них
{float k1,b1,k2,b2;
if ((x11!=x12)&&(x21!=x22))
{
GetKB(x11,y11,x12,y12,&k1,&b1);
GetKB(x21,y21,x22,y22,&k2,&b2);
*xr=(b2-b1)/(k1-k2);
*yr=(*xr)*k1+b1;}
;
if ((x11==x12)&&(x21!=x22))
{
GetKB(x21,y21,x22,y22,&k2,&b2);
*xr=x11;
*yr=k2*x11+b2;
};
if ((x11!=x12)&&(x21==x22))
{
GetKB(x11,y11,x12,y12,&k1,&b1);
*xr=x21;
*yr=k1*x21+b1;
};
}
int fromAtoB(int a,int b) //вычисляет длину дуги в градусах от угла a до угла b против часовой стрелки
{
int c,m;
int p=0;
c=a;m=b;
p=0;
while (c!=m) {p++;c++; if (c>180) {c=-180; p--;}; };
return p;
}
int NumLength(int i) //вычисляет количество символов в числе i
{int len=0;
int r;
r=i;
while(abs(r)>0) {len++;r=r/10;};
if (i<0) {len++;};
return len;
}
void IntToStr(int i, char *str) //преобразует переменную i типа int в строку символов на которую указывает str
{int len=0;
int p=NumLength(i);
int r;
char d;
r=i;
while(abs(r)>0) {
p--;
d=r%10;
d=d+48;
str[p]=d;
r=r/10;};
if (p!=0) {p--;str[p]="-";};
}
static void canvas_event_handler(BITMAP *bmp, int x, int y, void *data)//функция необходимая для корректной работы Canvas
//см пример DJGPP.zip\DJGPP\cgui\examples\21canvas.c строка 113
{
t_mybmp *mc = data;
int w, h;
if (y < 0) {
mc->mybmp = bmp;
clear_bitmap(mc->mybmp);
}
}
void stop_program(void *data) //завершает программу. В качестве параметра передаётся NULL
{
(void)data;
exit(0);
}
void close_window(void *data) //закрывает окно. Данные могут быть указателем на окно которое требуется закрыть
//Если указатель NULL-закроет активное окно
{
(void)data;
/* This terminates the top level of event proscessing */
StopProcessEvents();
CloseWin(NULL);
}
void Draw_line(void *data) //рисует линию и генерирует УП для УЧПУ
{
TCline *mcl2= data;
char *str, *str2, *strX1, *strY1;
str=malloc(120);
sprintf(str,"G01 X%.4f Z%.4f",mcl2->x2,mcl2->y2);
ProgList[nkol]=str;
nkol++;
Refresh(List_id);
mcl2->x1=b_x;
mcl2->y1=b_y;
b_x=mcl2->x2;
b_y=mcl2->y2;
line(mcanv->mybmp, mcl2->x1, mcl2->y1, mcl2->x2, mcl2->y2, MYCOLOR);
Refresh(mcanv->id);
line(maincanv->mybmp, mcl2->x1, mcl2->y1, mcl2->x2, mcl2->y2, MYCOLOR);
Refresh(maincanv->id);
CMList_add(T_LINE, mcl2);
UpdateXZ();
}
void Draw_line_close(void *data)
{ Draw_line(data);
close_window(NULL);
}
void Draw_arc(void *data)//рисует дугу и генерирует УП для УЧПУ
{ int gam;
TCarc *mca2 = data;
mca2->spin=GLspin;
arc(mcanv->mybmp,mca2->xr,mca2->yr,ftofix((mca2->ang1*256)/360),ftofix((mca2->ang2*256)/360),mca2->r, MYCOLOR);
Refresh(mcanv->id);
arc(maincanv->mybmp,mca2->xr,mca2->yr,ftofix((mca2->ang1*256)/360),ftofix((mca2->ang2*256)/360),mca2->r, MYCOLOR);
Refresh(maincanv->id);
CMList_add(T_ARC, data);
if (GLspin==0)
{
b_x=(mca2->xr+(double)mca2->r*cos((mca2->ang2*pi)/180));
b_y=(mca2->yr-(double)mca2->r*sin((mca2->ang2*pi)/180));
};
if (GLspin==1)
{
b_x=(mca2->xr+(double)mca2->r*cos((mca2->ang1*pi)/180));
b_y=(mca2->yr-(double)mca2->r*sin((mca2->ang1*pi)/180));
};
char *str;
str=malloc(100);
if (mca2->spin==0)
{
if(fromAtoB(mca2->ang1, mca2->ang2)>180)
sprintf(str,"G03 X%.4f Z%.4f R-%.4f",mca2->xr,mca2->yr,mca2->r);
else
sprintf(str,"G03 X%.4f Z%.4f R%.4f",mca2->xr,mca2->yr,mca2->r);
};
if (mca2->spin==1)
{
if(fromAtoB(mca2->ang1, mca2->ang2)>180)
sprintf(str,"G02 X%.4f Z%.4f R-%.4f",mca2->xr,mca2->yr,mca2->r);
else
sprintf(str,"G02 X%.4f Z%.4f R%.4f",mca2->xr,mca2->yr,mca2->r);
};
// sprintf(str,"G02 X%.4f Z%.4f R%4f",mca2->xr,mca2->yr,mca2->r);
ProgList[nkol]=str;
nkol++;
Refresh(List_id);
UpdateXZ();
}
void Draw_arc_close(void *data)
{ Draw_arc(data);
close_window(NULL);
}
void Draw_sopr_line(void *data) //рисует дугу и сопрягает её с прямой.Генерирует УП для УЧПУ
//также используется для сопряжения дугой между двумя точками
{
TCsopr *mca2 = data;
int xr1,yr1,xr2,yr2;
int xr,yr;
float gam,alf,bet,alf1,bet1,alf2,bet2;
mca2->spin=GLspin;
if((mca2->x3!=0)&&(mca2->y3!=0))
{mca2->x1=mca2->x3;
mca2->y1=mca2->y3;
mca2->x2=mca2->x3;
mca2->y2=mca2->y3;};
GetXRYR12(b_x, b_y, mca2->rad, mca2->x1, mca2->y1, mca2->rad, &xr1, &yr1, &xr2, &yr2);
/////////////////////////////////////////////////////////////////////////////
//вычисляются углы относительно оси 0Х с точкой при пересечении прямой и окружности(построенной в 1 центре), а так же с конечной точкой дуги
xr=xr1;yr=yr1;
alf1=90;
if (xr!=mca2->x1)
{
gam=180*(float)atan((float)abs(yr-mca2->y1)/(float)abs(xr-mca2->x1))/pi;
alf1=gam;
if (mca2->x1<xr) alf1=180-gam;
};
if (yr<mca2->y1) alf1=(-1)*alf1;
bet1=90;
if (xr!=b_x)
{
gam=180*(float)atan((float)abs(yr-b_y)/(float)abs(xr-b_x))/pi;
bet1=gam;
if (b_x<xr) bet1=180-gam;
};
if (yr<b_y) bet1=(-1)*bet1;
/////////////////////////////////////////////////////////////////////////////
//вычисляются углы относительно оси 0Х с точкой при пересечении прямой и окружности(построенной во 2 центре), а так же с конечной точкой дуги
xr=xr2;yr=yr2;
alf2=90;
if (xr!=mca2->x1)
{
gam=180*(float)atan((float)abs(yr-mca2->y1)/(float)abs(xr-mca2->x1))/pi;
alf2=gam;
if (mca2->x1<xr) alf2=180-gam;
};
if (yr<mca2->y1) alf2=(-1)*alf2;
bet2=90;
if (xr!=b_x)
{
gam=180*(float)atan((float)abs(yr-b_y)/(float)abs(xr-b_x))/pi;
bet2=gam;
if (b_x<xr) bet2=180-gam;
};
if (yr<b_y) bet2=(-1)*bet2;
/////////////////////////////////////////////////////////////////////////////
if(mca2->sopr==1) {xr=xr1;yr=yr1;alf=alf1;bet=bet1;
if (myangle==2)
{if (fromAtoB(alf1,bet1)<180)
{alf=bet1;
bet=alf1;};
};
if (myangle==1)
{if (fromAtoB(alf1,bet1)>180)
{alf=bet1; bet=alf1;};
};
};
if(mca2->sopr==2) {xr=xr2;yr=yr2; alf=alf2;bet=bet2;
if (myangle==2)
{if (fromAtoB(alf2,bet2)<180)
{alf=bet2;
bet=alf2;};
};
if (myangle==1)
{if (fromAtoB(alf2,bet2)>180)
{alf=bet2; bet=alf2;};
};
};
arc(mcanv->mybmp,xr,yr,ftofix((alf*256)/360),ftofix((bet*256)/360),mca2->rad, MYCOLOR);
CMList_add(T_SOP, mca2);
char *str;
str=malloc(255);
/*
str3=malloc(100);
str2=malloc(30);
strX1=malloc(30);
strY1=malloc(30);
strR1=malloc(30);
strcpy(str, "N1 G17 ");
if (mca2->spin==0) {strcpy(str2, "G02 X");};
if (mca2->spin==1) {strcpy(str2, "G03 X");};
strcat(str,str2);
strcpy(str2, " Y");
IntToStr(mca2->x1,strX1);
IntToStr(mca2->y1,strY1);
strcat(str,strX1);
strcat(str2,strY1);
strcat(str,str2);
strcpy(str2," R");
if (myangle==2) strcat(str2,"-");
IntToStr(mca2->rad,strR1);
strcat(str2,strR1);
strcat(str,str2);
strcpy(str3, str);
*/
if (mca2->spin==0) {sprintf(str,"G02 X%.f4 Z%.f4 R%.f4",mca2->x1,mca2->y1,mca2->rad);};
if (mca2->spin==1) {sprintf(str,"G03 X%.f4 Z%.f4 R%.f4",mca2->x1,mca2->y1,mca2->rad);};
ProgList[nkol]=str;
nkol++;
line(mcanv->mybmp,mca2->x1,mca2->y1,mca2->x2,mca2->y2,MYCOLOR);
if((mca2->x3==0)&&(mca2->y3==0))
{
TCline *mcl2 = GetMem0(TCline, 1);
mcl2->x1=mca2->x1;
mcl2->x2=mca2->x2;
mcl2->y1=mca2->y1;
mcl2->y2=mca2->y2;
strcpy(str, "");
/*
strcpy(str2, "");
strcpy(strX1, "");
strcpy(strY1, "");
strcpy(str, "G01 X");
strcpy(str2, " Y");
IntToStr(mcl2->x2,strX1);
IntToStr(mcl2->y2,strY1);
strcat(str,strX1);
strcat(str2,strY1);
strcat(str,str2);
*/
sprintf(str,"G01 X%.4f Z%.4f",mcl2->x2,mcl2->y2);
ProgList[nkol]=str;
nkol++;
CMList_add(T_LINE, mcl2);
}
b_x=mca2->x2;
b_y=mca2->y2;
UpdateXZ();
Refresh(List_id);
Refresh(mcanv->id);
}
void Draw_sopr_line_close(void *data)
{ Draw_sopr_line(data);
close_window(NULL);
}
static int row_text_creater(void *rowdata, char *s)//функция необходимая для корректной работы ListBox
//см пример DJGPP.zip\DJGPP\cgui\examples\10lists.c строка 53
{
strcpy(s, rowdata);
return 0;
}
void asc_start_point(int t)//окно отвечает за ввод начальных координат
//(использует функцию Proc_setpoint для отображения введенных координат)
{
UpdateXZ();
int p_x=0, p_y =0;
TCpoint *mcp;
mcp= GetMem0(TCpoint, 1);
mcp->t=t;
MkDialogue(ADAPTIVE, "Start coord", 0);
AddTextBox(RIGHT, "Choose start position:", 200, 0, 0);
AddEditBox(DOWNLEFT,70,"~X Coord",FFLOAT,0,&mcp->x1);
AddEditBox(RIGHT,70,"~Y Coord",FFLOAT,0,&mcp->y1);
AddButton(DOWNLEFT,"~Ok",Proc_setpoint,mcp);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void Draw_line_arc_close(void *data) //чертит линию по заданному углу наклона и сопрягает её с окружностью
{
TCline_sopr *ls=data;
TCarc *mca;
TCline *mcl;
TCsopr *mcs;
mca= GetMem0(TCarc, 1);
mcl=ls->line;
mcs=ls->sopr;
float k,b;
float xp1, xp2, yp1, yp2;
mcl->y2=(-1)*mcl->y2;
k=tan((float)((pi*mcl->y2)/180));
b=((float)((float)b_y-(float)k*b_x));
GetXPYP2(k, b, mcs->xr, mcs->yr, mcs->rad, &xp1, &yp1, &xp2, &yp2);
float s1, s2;
s1=sqrt(((xp1-b_x)*(xp1-b_x))+((yp1-b_y)*(yp1-b_y)));
s2=sqrt(((xp2-b_x)*(xp2-b_x))+((yp2-b_y)*(yp2-b_y)));
ls->tsk=nearpoint;
if(ls->tsk==1)
{
if(s1<s2)
{
mcl->x2=xp1;
mcl->y2=yp1;
}else
{
mcl->x2=xp2;
mcl->y2=yp2; }
}
if(ls->tsk==2)
{
if(s1<s2)
{
mcl->x2=xp2;
mcl->y2=yp2;
}else
{
mcl->x2=xp1;
mcl->y2=yp1; }
}
Draw_line(mcl);
float ya1, ya2;
GetYP2(mcs->x3, mcs->xr, mcs->yr, mcs->rad, &ya1, &ya2);
if(nearpointa==1)
{
if (ya1<ya2) mcs->y3=ya1; else mcs->y3=ya2;
};
if(nearpointa==2)
{
if (ya1>ya2) mcs->y3=ya1; else mcs->y3=ya2;
};
float xr,yr;
xr=mcs->xr;yr=mcs->yr;
float gam,alf,bet,alf1,bet1;
alf1=90;
if (xr!=mcs->x3)
{
gam=180*(float)atan((float)abs(yr-mcs->y3)/(float)abs(xr-mcs->x3))/pi;
alf1=gam;
if (mcs->x3<xr) alf1=180-gam;
};
if (yr<mcs->y3) alf1=(-1)*alf1;
bet1=90;
if (xr!=mcl->x2)
{
gam=180*(float)atan((float)abs(yr-mcl->y2)/(float)abs(xr-mcl->x2))/pi;
bet1=gam;
if (mcl->x2<xr) bet1=180-gam;
};
if (yr<mcl->y2) bet1=(-1)*bet1;
alf=alf1; bet=bet1;
if (GLspin==0)
{
alf=bet1; bet=alf1;
};
mca->xr=mcs->xr;
mca->yr=mcs->yr;
mca->r=mcs->rad;
mca->ang1=alf;
mca->ang2=bet;
mca->spin=GLspin;
Draw_arc(mca);
close_window(NULL);
UpdateXZ();
}
/*void Draw_arc_arc_close(void *data) //сопрягает две дуги окружности
{
TCline_sopr *ls=data;
TCarc *mca1,*mca2;
float gam,alf,bet,alf1,bet1;
int xr,yr;
mca1= GetMem0(TCarc, 1);
mca2= GetMem0(TCarc, 1);
mca1=ls->line;
mca2=ls->sopr;
float k;
int b, xp1, xp2, yp1, yp2;
GetXRYR12(mca1->xr,mca1->yr, mca1->r, mca2->xr, mca2->yr, mca2->r, &xp1, &yp1, &xp2, &yp2);
int s1, s2;
if (nearpoint==2)
{
xp1=xp2;
yp1=yp2;
}
xr=mca1->xr;yr=mca1->yr;
alf1=90;
if (xr!=mcs->x3)
{
gam=180*(float)atan((float)abs(yr-mcs->y3)/(float)abs(xr-mcs->x3))/pi;
alf1=gam;
if (mcs->x3<xr) alf1=180-gam;
};
if (yr<mcs->y3) alf1=(-1)*alf1;
bet1=90;
if (xr!=mcl->x2)
{
gam=180*(float)atan((float)abs(yr-mcl->y2)/(float)abs(xr-mcl->x2))/pi;
bet1=gam;
if (mcl->x2<xr) bet1=180-gam;
};
if (yr<mcl->y2) bet1=(-1)*bet1;
alf=alf1; bet=bet1;
if (GLspin==0)
{
alf=bet1; bet=alf1;
};
Draw_line(mcl);
int ya1, ya2;
GetYP2(mcs->x3, mcs->xr, mcs->yr, mcs->rad, &ya1, &ya2);
if(nearpointa==1)
{
if (ya1<ya1) mcs->y3=ya1; else mcs->y3=ya2;
};
if(nearpointa==2)
{
if (ya1>ya1) mcs->y3=ya1; else mcs->y3=ya2;
};
xr=mcs->xr;yr=mcs->yr;
alf1=90;
if (xr!=mcs->x3)
{
gam=180*(float)atan((float)abs(yr-mcs->y3)/(float)abs(xr-mcs->x3))/pi;
alf1=gam;
if (mcs->x3<xr) alf1=180-gam;
};
if (yr<mcs->y3) alf1=(-1)*alf1;
bet1=90;
if (xr!=mcl->x2)
{
gam=180*(float)atan((float)abs(yr-mcl->y2)/(float)abs(xr-mcl->x2))/pi;
bet1=gam;
if (mcl->x2<xr) bet1=180-gam;
};
if (yr<mcl->y2) bet1=(-1)*bet1;
alf=alf1; bet=bet1;
if (GLspin==0)
{
alf=bet1; bet=alf1;
};
mca->xr=mcs->xr;
mca->yr=mcs->yr;
mca->r=mcs->rad;
mca->ang1=alf;
mca->ang2=bet;
mca->spin=GLspin;
Draw_arc(mca);
close_window(NULL);
}
*/
asc_cilindr_param_form_OK(void *data)
{
Type_Zagotov=1;
close_window(NULL);
}
void asc_cilindr_param_form(void *data)//окно отвечающее за ввод параметров цилиндрической заготовки: длины и диаметра
{
TZagotov_cilindr *tzc;
tzc= GetMem0(TZagotov_cilindr, 1);
MkDialogue(ADAPTIVE, "Cilindr param", 0);
AddTextBox(RIGHT, "Cilindr paremeters:", 200, 0, 0);
AddEditBox(DOWNLEFT,70,"Cilindr diametr",FINT,0,&tzc->diametr);
AddEditBox(DOWNLEFT,70,"Cilindr length",FINT,0,&tzc->length);
AddButton(DOWNLEFT,"~Ok",asc_cilindr_param_form_OK, NULL);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void asc_zagot_form(void *data) //окно отвечает за выбор одной из стандартных заготовок
{
MkDialogue(ADAPTIVE, "Zagot form", 0);
AddButton(DOWNLEFT, "Cilindr", asc_cilindr_param_form, NULL);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void Draw_Yline_close(void *data)//рисует линию используя угол наклона к оси 0X и конечную координату по Y и закрывает окно
{
TCline *mcl=data;
float b, qqq;
if(mcl->x2==90.0)
{
mcl->x2=b_x;
}else
{
mcl->x2=(-1)*mcl->x2;
b=(float)((float)b_y-(float)tan((float)(pi*mcl->x2)/180)*b_x);
mcl->x2=(float)((mcl->y2-b)/tan((float)(pi*mcl->x2)/180));
}
Draw_line_close(mcl);
close_window(NULL);
}
void asc_Yline_form(void *data)//окно отвечающее за ввод угла наклона к оси 0Х и конечной координаты по Y
{
int p_x=0, p_y =0;
TCline *mcl;
mcl= GetMem0(TCline, 1);
MkDialogue(ADAPTIVE, "Line coord", 0);
AddTextBox(RIGHT, "Choose final coord:", 200, 0, 0);
AddEditBox(DOWNLEFT,70,"~Z Coord",FFLOAT,0,&mcl->y2);
AddEditBox(RIGHT,70,"~Angle",FFLOAT,0,&mcl->x2);
AddButton(DOWNLEFT,"~Ok",Draw_Yline_close, mcl);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void Draw_Xline_close(void *data)//рисует линию используя угол наклона к оси 0X и конечную координату по X и закрывает окно
{
TCline *mcl=data;
float b; mcl->y2=(-1)*mcl->y2;
b=(float)((float)b_y-(float)tan((float)(pi*mcl->y2)/180)*b_x);
mcl->y2=((float)tan((float)(pi*mcl->y2)/180)*mcl->x2 + b);
Draw_line_close(mcl);
close_window(NULL);
}
void asc_Xline_form(void *data)//окно отвечающее за ввод угла наклона к оси 0Х и конечной координаты по Х
{
int p_x=0, p_y =0;
TCline *mcl;
mcl= GetMem0(TCline, 1);
MkDialogue(ADAPTIVE, "Line coord", 0);
AddTextBox(RIGHT, "Choose final coord:", 200, 0, 0);
AddEditBox(DOWNLEFT,70,"~X Coord",FFLOAT,0,&mcl->x2);
AddEditBox(RIGHT,70,"~Angle",FFLOAT,0,&mcl->y2);
AddButton(DOWNLEFT,"~Ok",Draw_Xline_close, mcl);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void asc_line_form(void *data) //окно отвечает за ввод конечных координат линии
{
int p_x=0, p_y =0;
TCline *mcl;
mcl= GetMem0(TCline, 1);
MkDialogue(ADAPTIVE, "Line coord", 0);
AddTextBox(RIGHT, "Choose final coord:", 200, 0, 0);
AddEditBox(DOWNLEFT,70,"~X Coord",FFLOAT,0,&mcl->x2);
AddEditBox(RIGHT,70,"~Z Coord",FFLOAT,0,&mcl->y2);
AddButton(DOWNLEFT,"X&angle",asc_Xline_form, mcl);
AddButton(RIGHT,"Z&angle",asc_Yline_form, mcl);
AddButton(DOWNLEFT,"~Ok",Draw_line_close, mcl);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void UseUnclock(int txtn)//изменяет глобальную переменную и изменяет текст в TextBox’е
{GLspin=0; UpdateTextBoxText(txtn, "Unclock"); Refresh(arcid);}
void UseClock(int txtn)
{GLspin=1; UpdateTextBoxText(txtn, "Clock"); Refresh(arcid);}
void UseUnclocks(int txtn)
{GLspin=0; UpdateTextBoxText(txtn, "Unclock"); Refresh(soprid);}
void UseClocks(int txtn)
{GLspin=1; UpdateTextBoxText(txtn, "Clock"); Refresh(soprid);}
void UseUnclocksl(int txtn)
{GLspin=0; UpdateTextBoxText(txtn, "Unclock"); Refresh(soprlineid);}
void UseClocksl(int txtn)
{GLspin=1; UpdateTextBoxText(txtn, "Clock"); Refresh(soprlineid);}
void UseNear(int txtn)
{nearpoint=1; UpdateTextBoxText(txtn, "Near Point"); Refresh(soprlineid);}
void UseFar(int txtn)
{nearpoint=2; UpdateTextBoxText(txtn, "Far Point"); Refresh(soprlineid);}
void UseNeara(int txtn)
{nearpointa=1; UpdateTextBoxText(txtn, "UP Point ARC"); Refresh(soprlineid);}
void UseFara(int txtn)
{nearpointa=2; UpdateTextBoxText(txtn, "DOWN Point ARC"); Refresh(soprlineid);}
void asc_line_arc_form(void *data) //окно отвечает за ввод данных(угол наклоня прямой,
// координаты центра окружности, координата Х конца дуги и т.д.) необходимых для
// построения линии по заданному углу наклона и сопряжения её с окружностью
{
int p_x=0, p_y =0;
TCline *mcl;
TCsopr *mcs;
TCline_sopr *ls;
mcl= GetMem0(TCline, 1);
mcs= GetMem0(TCsopr, 1);
ls= GetMem0(TCline_sopr, 1);
ls->line=mcl;
ls->sopr=mcs;
ls->tsk=1;
soprlineid=MkDialogue(ADAPTIVE, "Line + ARC", 0);
AddEditBox(DOWNLEFT,70,"Line XAngle",FFLOAT,0,&mcl->y2);
AddEditBox(DOWNLEFT,70,"Rad",FFLOAT,0,&mcs->rad);
AddEditBox(DOWNLEFT,70,"XCENTER",FFLOAT,0,&mcs->xr);
AddEditBox(DOWNLEFT,70,"YCENTER",FFLOAT,0,&mcs->yr);
AddEditBox(DOWNLEFT,70,"X kon arc",FFLOAT,0,&mcs->x3);
/* AddEditBox(DOWNLEFT,70,"Ykon",FINT,0,&mcs->y3); */
int txtn, txtn1, txtn2;
txtn=AddTextBox(DOWNLEFT, " ", 200, 0, 0);
if(GLspin==0){UpdateTextBoxText(txtn, "Unclock");};
if(GLspin==1){UpdateTextBoxText(txtn, "Clock");};
AddButton(DOWNLEFT,"~Unclock",UseUnclocksl,txtn);
AddButton(RIGHT,"~Clock",UseClocksl,txtn);
txtn1=AddTextBox(DOWNLEFT, " ", 200, 0, 0);
if(nearpoint==1){UpdateTextBoxText(txtn1, "Near Point");};
if(nearpoint==2){UpdateTextBoxText(txtn1, "Far Point");};
AddButton(DOWNLEFT,"~Near point",UseNear,txtn1);
AddButton(RIGHT,"~Far point",UseFar,txtn1);
txtn2=AddTextBox(DOWNLEFT, " ", 200, 0, 0);
if(nearpointa==1){UpdateTextBoxText(txtn2, "UP Point ARC");};
if(nearpointa==2){UpdateTextBoxText(txtn2, "DOWN Point ARC");};
AddButton(DOWNLEFT,"UP point ARC",UseNeara,txtn2);
AddButton(RIGHT,"DOWN point ARC",UseFara,txtn2);
AddButton(DOWNLEFT,"~Ok",Draw_line_arc_close, ls);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
/*void asc_arc_arc_form(void *data)
{
int p_x=0, p_y =0;
TCarc *mca1,*mca2;
TCline_sopr *ls;
mca1= GetMem0(TCarc, 1);
mca2= GetMem0(TCarc, 1);
ls= GetMem0(TCline_sopr, 1);
ls->line=mcl;
ls->sopr=mcs;
ls->tsk=1;
soprlineid=MkDialogue(ADAPTIVE, "ARC + ARC", 0);
AddEditBox(DOWNLEFT,70,"X1",FFLOAT,0,&mca1->xr);
AddEditBox(RIGHT,70,"Y1",FFLOAT,0,&mca1->yr);
AddEditBox(RIGHT,70,"R1",FFLOAT,0,&mca1->r);
AddEditBox(DOWNLEFT,70,"X2",FFLOAT,0,&mca2->xr);
AddEditBox(RIGHT,70,"Y2",FFLOAT,0,&mca2->yr);
AddEditBox(RIGHT,70,"R2",FFLOAT,0,&mca2->r);
AddEditBox(DOWNLEFT,70,"X2 kon arc",FFLOAT,0,&mca2->spin);
int txtn, txtn1, txtn2;
txtn=AddTextBox(DOWNLEFT, " ", 200, 0, 0);
if(GLspin==0){UpdateTextBoxText(txtn, "Unclock");};
if(GLspin==1){UpdateTextBoxText(txtn, "Clock");};
AddButton(DOWNLEFT,"~Unclock",UseUnclocksl,txtn);
AddButton(RIGHT,"~Clock",UseClocksl,txtn);
txtn1=AddTextBox(DOWNLEFT, " ", 200, 0, 0);
if(nearpoint==1){UpdateTextBoxText(txtn1, "Near Point");};
if(nearpoint==2){UpdateTextBoxText(txtn1, "Far Point");};
AddButton(DOWNLEFT,"~Near point",UseNear,txtn1);
AddButton(RIGHT,"~Far point",UseFar,txtn1);
txtn2=AddTextBox(DOWNLEFT, " ", 200, 0, 0);
if(nearpointa==1){UpdateTextBoxText(txtn2, "UP Point ARC");};
if(nearpointa==2){UpdateTextBoxText(txtn2, "DOWN Point ARC");};
AddButton(DOWNLEFT,"UP point ARC",UseNeara,txtn2);
AddButton(RIGHT,"DOWN point ARC",UseFara,txtn2);
AddButton(DOWNLEFT,"~Ok",Draw_arc_arc_close, ls);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
*/
void Draw_arc_close_spin_modify(void *data)//модификация void Draw_arc(void *data), для случаев по и против часовой стрелки
{TCarc *mca=data;
float gam;
if (GLspin==1) {gam=mca->ang1; mca->ang1=mca->ang2; mca->ang2=gam;};
mca->spin=GLspin;
Draw_arc_close(mca);
}
void asc_arc_form(void *data) //окно отвечает за ввод координат центра дуги,
// угла с которого надо начинать построение и по достижении которого закончить построение
{ int p_x=0, p_y =0, txtn=0;
TCarc *mca;
mca=GetMem0(TCarc, 1);
arcid=MkDialogue(ADAPTIVE, "Draw Arc", 0);
AddTextBox(RIGHT, "Choose drawing way:", 200, 0, 0);
txtn=AddTextBox(RIGHT, " ", 200, 0, 0);
AddEditBox(DOWNLEFT,70,"~X Central",FFLOAT,0,&mca->xr);
AddEditBox(RIGHT,70,"~Y Central",FFLOAT,0,&mca->yr);
AddEditBox(RIGHT,70,"Radius",FFLOAT,0,&mca->r);
AddEditBox(DOWNLEFT,70,"Starting Angle",FINT,0,&mca->ang1);
AddEditBox(RIGHT,70,"Finishing Angle",FINT,0,&mca->ang2);
if(GLspin==0){UpdateTextBoxText(txtn, "Unclock");};
if(GLspin==1){UpdateTextBoxText(txtn, "Clock");};
AddButton(DOWNLEFT,"~Unclock",UseUnclock,txtn);
AddButton(RIGHT,"~Clock",UseClock,txtn);
AddButton(RIGHT,"~Ok",Draw_arc_close_spin_modify,mca);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void skor_shpind(float *v)//установка скорости шпинделя
{ char *str;
str=malloc(9);
sprintf(str, "S%.4f", *v);
ProgList[nkol]=str;
nkol++;
Refresh(List_id);
close_window(NULL);
close_window(NULL);
}
void asc_skor_shpind_form(void)//форма для выбора скорости шпинделя
{ float v;
MkDialogue(ADAPTIVE, "Skor shpind", 0);
AddEditBox(DOWNLEFT,70,"Skor shpind",FFLOAT, 0, &v);
AddButton(DOWNLEFT,"~Ok",skor_shpind, &v);
AddButton(DOWNLEFT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void skor_poda4(float *v)//установка скорости подачи
{ char *str;
str=malloc(50);
sprintf(str, "F%.4f", *v);
ProgList[nkol]=str;
nkol++;
Refresh(List_id);
close_window(NULL);
close_window(NULL);
}
void asc_skor_poda4_form(void)//форма для выбора скорости подачи
{ float v;
MkDialogue(ADAPTIVE, "Skor poda4", 0);
AddEditBox(DOWNLEFT,70,"Skor poda4",FFLOAT,0,&v);
AddButton(DOWNLEFT,"~Ok",skor_poda4,&v);
AddButton(DOWNLEFT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void nomer_instr(void *data)//установка скорости подачи
{ TInstrument *mi=data;
char *str;
str=malloc(50);
sprintf(str, "T%d D%d",mi->t,mi->d);
ProgList[nkol]=str;
nkol++;
Refresh(List_id);
close_window(NULL);
close_window(NULL);
}
void asc_nomer_instr_form(void)//форма для выбора скорости подачи
{ TInstrument *mi;
mi=GetMem0(TInstrument,1);
MkDialogue(ADAPTIVE, "Nomer instr", 0);
AddEditBox(DOWNLEFT,70,"Nomer instr",FINT,0,&mi->t);
AddEditBox(DOWNLEFT,70,"Nomer korr",FINT,0,&mi->d);
AddButton(DOWNLEFT,"~Ok",nomer_instr, mi);
AddButton(DOWNLEFT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void nomer_korr (int *v)
{ char *str;
str=malloc(50);
sprintf(str, "D%d",v);
ProgList[nkol]=str;
nkol++;
Refresh(List_id);
close_window(NULL);
close_window(NULL);
}
void asc_nomer_korr_form(void)//форма для выбора скорости подачи
{ TInstrument *mi;
mi=GetMem0(TInstrument,1);
MkDialogue(ADAPTIVE, "Nomer korr", 0);
AddEditBox(DOWNLEFT,70,"Nomer korr",FINT,0,&mi->d);
AddButton(DOWNLEFT,"~Ok",nomer_korr, mi);
AddButton(DOWNLEFT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void asc_tehn_param_form(void)//форма для выбора какой технологический параметр надо изменить
{
MkDialogue(ADAPTIVE, "Tehn parameters", 0);
AddButton(DOWNLEFT,"Skor shpind",asc_skor_shpind_form,NULL);
AddButton(RIGHT,"Skor poda4",asc_skor_poda4_form,NULL);
AddButton(RIGHT,"Nomer instr",asc_nomer_instr_form,NULL);
AddButton(RIGHT,"Nomer korr",asc_nomer_korr_form,NULL);
AddButton(DOWNLEFT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void Proc_setpoint(void *data)//устанавливает стартовую точку на Canvas и генерирует УП для УЧПУ
{
TCpoint *mcp2=data;
char *str;
str=malloc(50);
b_x=mcp2->x1;
b_y=mcp2->y1;
//sprintf(str, "D0");
//ProgList[nkol]=str;
//nkol++;
if (mcp2->t==1) sprintf(str, "G00 X%.4f Z%.4f", b_x, b_y);
if (mcp2->t==2) sprintf(str, "NX%.4f NZ%.4f", b_x, b_y);
ProgList[nkol]=str;
nkol++;
Refresh(List_id);
putpixel(mcanv->mybmp,b_x, b_y, MYCOLOR);
Refresh(mcanv->id);
putpixel(maincanv->mybmp,b_x, b_y, MYCOLOR);
Refresh(maincanv->id);
CMList_add(T_POINT, data);
close_window(NULL);
UpdateXZ();
}
void asc_cycle_toch_form(void)//создаёт окно для ввода параметров цикла точения
{
close_window(NULL);
MkDialogue(ADAPTIVE, "Cycle Tochenie", 0);
TCyclet *cyclep;
cyclep=GetMem0(TCyclet,1);
AddEditBox(DOWNLEFT,70,"TYP",FINT,0,&cyclep->TYP);
AddEditBox(DOWNLEFT,70,"STX",FFLOAT,0,&cyclep->STX);
AddEditBox(DOWNLEFT,70,"STZ",FFLOAT,0,&cyclep->STZ);
AddEditBox(DOWNLEFT,70,"STP",FFLOAT,0,&cyclep->STP);
AddEditBox(DOWNLEFT,70,"TWD",FFLOAT,0,&cyclep->TWD);
AddEditBox(DOWNLEFT,70,"PRP",FFLOAT,0,&cyclep->PRP);
AddEditBox(DOWNLEFT,70,"OBR",FINT,0,&cyclep->OBR);
AddEditBox(DOWNLEFT,70,"FRF",FFLOAT,0,&cyclep->FRF);
AddEditBox(DOWNLEFT,70,"FTF",FFLOAT,0,&cyclep->FTF);
AddEditBox(DOWNLEFT,70,"FAR",FFLOAT,0,&cyclep->FAP);
AddEditBox(DOWNLEFT,70,"FPF",FFLOAT,0,&cyclep->FPF);
cycletype=1;
AddButton(RIGHT,"~Ok",make_a_canvas_window,cyclep);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void asc_cycle_rezb_form(void)//создаёт окно для ввода параметров цикла резьбонарезания
{
close_window(NULL);
MkDialogue(ADAPTIVE, "Cycle Rezb", 0);
TCycler *cyclec;
cyclec=GetMem0(TCycler,1);
//TYP=_ STX=_ STZ=_ SBX=_ SBZ=_ STP=_ PRP=_ NPR=_ OBR=_
//FRF=_ ANG=_ STC=_ FTF=_ NB=_
AddEditBox(DOWNLEFT,70,"TYP",FINT,0,&cyclec->TYP);
AddEditBox(DOWNLEFT,70,"STX",FFLOAT,0,&cyclec->STX);
AddEditBox(DOWNLEFT,70,"STZ",FFLOAT,0,&cyclec->STZ);
AddEditBox(DOWNLEFT,70,"SBX",FFLOAT,0,&cyclec->SBX);
AddEditBox(DOWNLEFT,70,"SBZ",FFLOAT,0,&cyclec->SBZ);
AddEditBox(DOWNLEFT,70,"STP",FFLOAT,0,&cyclec->STP);
AddEditBox(DOWNLEFT,70,"PRP",FFLOAT,0,&cyclec->PRP);
AddEditBox(DOWNLEFT,70,"NPR",FINT,0,&cyclec->NPR);
AddEditBox(DOWNLEFT,70,"OBR",FINT,0,&cyclec->OBR);
AddEditBox(DOWNLEFT,70,"FRF",FFLOAT,0,&cyclec->FRF);
AddEditBox(DOWNLEFT,70,"ANG",FFLOAT,0,&cyclec->ANG);
AddEditBox(DOWNLEFT,70,"STC",FFLOAT,0,&cyclec->STC);
AddEditBox(DOWNLEFT,70,"FTF",FFLOAT,0,&cyclec->FTF);
AddEditBox(DOWNLEFT,70,"NB",FINT,0,&cyclec->NB);
cycletype=3;
AddButton(RIGHT,"~Ok",make_a_canvas_window,cyclec);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void asc_cycle_copir_form(void)//создаёт окно для ввода параметров цикла копирования
{
close_window(NULL);
MkDialogue(ADAPTIVE, "Cycle Copy", 0);
TCyclec *cyclec;
cyclec=GetMem0(TCyclec,1);
AddEditBox(DOWNLEFT,70,"TYP",FINT,0,&cyclec->TYP);
AddEditBox(DOWNLEFT,70,"STX",FFLOAT,0,&cyclec->STX);
AddEditBox(DOWNLEFT,70,"STP",FFLOAT,0,&cyclec->STP);
AddEditBox(DOWNLEFT,70,"PRP",FFLOAT,0,&cyclec->PRP);
AddEditBox(DOWNLEFT,70,"OBR",FINT,0,&cyclec->OBR);
AddEditBox(DOWNLEFT,70,"FRF",FFLOAT,0,&cyclec->FRF);
AddEditBox(DOWNLEFT,70,"FTF",FFLOAT,0,&cyclec->FTF);
cycletype=2;
AddButton(RIGHT,"~Ok",make_a_canvas_window,cyclec);
AddButton(RIGHT,"Close",close_window,NULL);
DisplayWin();
ProcessEvents();
}
void asc_cycle_param_form(void)//окно отвечающее за выбор типа цикла обработки (точение/копирование/резьбонарезание/...)
{
MkDialogue(ADAPTIVE, "Cycle type", 0);
AddButton(DOWNLEFT,"Tochenie",asc_cycle_toch_form,NULL);
AddButton(RIGHT,"Copy",asc_cycle_copir_form,NULL);
AddButton(RIGHT,"Rezba",asc_cycle_rezb_form,NULL);
AddButton(DOWNLEFT, "Close", close_window, NULL);
DisplayWin();
ProcessEvents();
}
void Add_cycletoList(void *data) //
{
TCyclet *cyclep;
TCyclec *cyclec;
TCycler *cycler;
if (cycletype==1)
{
cyclep=GetMem0(TCyclet,1);
cyclep=data;
}
if (cycletype==2)
{
cyclec=GetMem0(TCyclec,1);
cyclec=data;
}
if (cycletype==3)
{
cycler=GetMem0(TCycler,1);
cycler=data;
}
char *str, *str2, *str0;
str=malloc(255);
str2=malloc(255);
str0=malloc(25);
str0="G54G90G20";
ProgList[nkol]=str0;
nkol++;
if (cycletype==1)
{
sprintf(str, "TYP=%d STX=%.4f STZ=%.4f STP=%.4f TWD=%.4f PRP=%.4f OBR=%d FRF=%d", cyclep->TYP, cyclep->STX, cyclep->STZ, cyclep->STP, cyclep->TWD, cyclep->PRP, cyclep->OBR, cyclep->FRF);
ProgList[nkol]=str;
nkol++;
sprintf(str2, "FTF=%.4f FAP=%d FPF=%d ",cyclep->FTF, cyclep->FAP, cyclep->FPF);
ProgList[nkol]=str2;
nkol++;
};
if (cycletype==2)
{
sprintf(str, "TYP=%d STX=%.4f STP=%.4f PRP=%.4f OBR=%.4f FRF=%d FTF=%.4f", cyclec->TYP, cyclec->STX, cyclec->STP, cyclec->PRP, cyclec->OBR, cyclec->FRF, cyclec->FTF);
ProgList[nkol]=str;
nkol++;
};
if (cycletype==3)
{
sprintf(str, "TYP=%d STX=%.4f STZ=%.4f SBX=%.4f SBZ=%.4f STP=%.4f PRP=%.4f",cycler->TYP, cycler->STX, cycler->STZ, cycler->SBX, cycler->SBZ, cycler->STP, cycler->PRP);
ProgList[nkol]=str;
nkol++;
sprintf(str2, "NPR=%d OBR=%d FRF=%.4f ANG=%.4f STC=%.4f FTF=%.4f NB=%d",cycler->NPR, cycler->OBR, cycler->FRF, cycler->ANG, cycler->STC, cycler->FTF, cycler->NB);
ProgList[nkol]=str2;
nkol++;
};
//Refresh(List_id);
if (cyclety