Функции отвечающие за операции над данными




 

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: