//************************************************************************** //Skeleton of trmod.dll(ワークデータ編集) //************************************************************************** // #include #include #include #include #include #include "resource.h" //外部参照(DLL)関数の定義 #ifdef __cplusplus //この分岐宣言はC言語(*.C)としてコンパイルする時は省略可 extern "C" { #endif __declspec(dllexport) void TRMODINIT(int*); __declspec(dllexport) void TRMODMENUITEM(int*,char *); __declspec(dllexport) void TRMODPARAMETER(int*); __declspec(dllexport) void TRMODMODWORK(double*,double*,double*,int*,int*, float*,unsigned char*,int*,int*); __declspec(dllexport) void TRMODFREE(); #ifdef __cplusplus //この分岐宣言はC言語(*.C)としてコンパイルする時は省略可 } #endif //もしTRMODPARAMETER などでダイアログを表示する場合は、以下のDllMain関数で //インスタンスをグローバル変数(hInst)に保存しておいて下さい。それ以外はDllMain関数は、 //不要です。 HINSTANCE hInst; BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD fdwReason,LPVOID lpvReserved) { hInst=hinstDll; return TRUE; } //本DLL内でのグローバル変数を定義 double dw,cr,wr,hr,wr0,hr0; double midx,midy; //DLL内でローカルに使用する関数を記述 //(これらの関数を後ろのほうで記述する場合や、別ファイルで記述する場合は、 //それらの関数のプロトタイプ宣言を記述) /////////////////////////////////////////////////////////////////////////////////// void clearpen(unsigned char *topc) { *topc &= 0xf0; } void setpen(unsigned char *topc,int penno) { static unsigned char penbyte[8]={0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e}; *topc &= 0xf0; *topc |= penbyte[penno]; } void clearpenki(unsigned char *topc) { *topc &= 0xfe; } void setpenki(unsigned char *topc) { *topc |= 0x01; } void cleardirection(unsigned char *topc) { *topc &= 0x0f; } void setdirection(unsigned char *topc,int dirno) { static unsigned char dirbyte[4]={0x00,0x30,0x10,0x20}; *topc &= 0x0f; *topc |= dirbyte[dirno]; } //ダイアログボックスのプロシジャー BOOL WINAPI trmodDialog(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) { char buf[20]; switch(message) { case WM_INITDIALOG: SetWindowPos(hDlg,HWND_TOPMOST,NULL,NULL,NULL,NULL,SWP_NOMOVE|SWP_NOSIZE); sprintf(buf,"%8.3f",wr); SetDlgItemText(hDlg,IDC_WR,buf); sprintf(buf,"%8.3f",hr); SetDlgItemText(hDlg,IDC_HR,buf); sprintf(buf,"%8.3f",cr); SetDlgItemText(hDlg,IDC_CR,buf); sprintf(buf,"%8.3f",dw); SetDlgItemText(hDlg,IDC_DW,buf); return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: GetDlgItemText(hDlg,IDC_WR,buf,20); wr=atof(buf); GetDlgItemText(hDlg,IDC_HR,buf,20); hr=atof(buf); GetDlgItemText(hDlg,IDC_CR,buf,20); cr=atof(buf); GetDlgItemText(hDlg,IDC_DW,buf,20); dw=atof(buf); case IDCANCEL: EndDialog(hDlg, LOWORD(wParam) == IDOK); return TRUE; } } return FALSE; } //************************************************************************** //外部参照(DLL)関数の引数説明 //[I -] 入力のみ(関数内では参照するだけにして下さい) //[- O] 出力のみ(参照時は未定義になっています。必ず値を返して下さい。) //[I O] 入出力 // // //====================================================================== void TRMODINIT(int *irc) //[- O] Return Code(=0:FALSE =1:TRUE) // 機能:処理の初期化 // 説明:TRYCUT2000起動時のWM_CREATE時に一度だけ参照されます。 // 作業エリアの確保などに利用しますが、特に必要ない場合は、 // 本関数自体の省略も可です。 // 初期化が正常な場合は、*irc は必ずTRUEを設定して下さい。 // 本関数省略時は、*irc=TRUE とみなします。 { wr=2000.0; hr=1500.0; cr=20.0; dw=10.0; *irc=TRUE; return; } //====================================================================== void TRMODMENUITEM(int *lang, //[I -] 言語環境 (=0:日本語 =1:他言語) char *item) //[- O] メニュー表示部の文字列 // 機能:メニュー表示部の文字列を設定 // 説明:メニュー表示部の文字列を言語環境ごとに設定。日本語環境でのみ // 使用される場合は、特に場合分けは必要ありません。 // 本関数は省略不可です。 { if( *lang ) { strcpy(item,"RING(&X)"); } else { strcpy(item,"リング作成(&X)"); } } //====================================================================== void TRMODPARAMETER(int *irc) //[- O] Return Code // 機能:処理パラメータの設定 // 説明:ファイルダイアログで対象ファイルを選択後「OK」を指示 // したタイミングで参照されます。 // 処理に関連するパラメータを設定するI/Fで、ダイアログ // などを表示する処理などに利用して下さい。 // 正常な場合は、*irc は必ずTRUEを設定して下さい。 // 本関数自体は省略可で、その場合*irc=TRUE とみなします。 { if( DialogBox(hInst,MAKEINTRESOURCE(IDM_DIALOG),GetFocus(),(DLGPROC)trmodDialog) == IDOK) { *irc=TRUE; } else { *irc=FALSE; } } //====================================================================== void TRMODMODWORK(double *pmax, //[I -] ワークの最大値XY double *pmin, //[I -] ワークの最小値XY double *wpitch, //[I -] ワークのピッチ(精度) int *xmax, //[I -] X方向格子数 int *ymax, //[I -] Y方向格子数 float *top, //[I O] Z値列(X*Y個)の先頭アドレス unsigned char *topc, //[I O] 属性(PENKI,PENなど)の先頭アドレス int *topn, //[I O] 切削ブロック番号の先頭アドレス int *irc) //[- O] Return Code(=0:FALSE =1:TRUE) //機能:ワーク形状の編集 //説明:ワ−ク形状や格子ごとの各種属性を編集する。修正するのは、 // *top,*tpc,*topn 配列内の値だけにして下さい。 // ただし、TRYCUT2000側のメモリ省略の設定により、あらかじめ topn は、 // NULL が設定されている場合があります。このような場合は、topn は // 修正しないようにして下さい。 // top と topc は、TRYCUT2000が正常に動作している場合は、必ずNULL以外 // の値が設定(領域が確保)されています。本関数は省略不可です。 { unsigned char penbyte[8]={0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e}; int i,j,ijmax; double maxx,maxy; double cx,cy,dx,dy,dis,dis1,dis2,pmx,pmy; double wrcx,wrcy,hrcx,hrcy; double dxw,dyw,dxh,dyh,dx0,dy0; double pt1[2],pt2[2],gai1,gai2; double x,y; maxx=pmax[0]-dw; maxy=pmax[1]-dw; wr0=wr-cr; hr0=hr-cr; midx=(pmax[0]+pmin[0])/2.0; midy=(pmax[1]+pmin[1])/2.0; wrcx=midx; wrcy=pmax[1]-dw-wr; hrcx=pmax[0]-dw-hr; hrcy=midy; dx=wrcx-hrcx; dy=wrcy-hrcy; dis=sqrt(dx*dx+dy*dy); dis1=(wr0*wr0-hr0*hr0+dis*dis)/dis/2.0; dis2=dis-dis1; pmx=(wrcx*dis2+hrcx*dis1)/dis; pmy=(wrcy*dis2+hrcy*dis1)/dis; dis=sqrt(wr0*wr0-dis1*dis1)/sqrt(dx*dx+dy*dy); cx=fabs(dy)*dis+pmx; cy=fabs(dx)*dis+pmy; pt1[0]=cx-wrcx; pt1[1]=cy-wrcy; pt2[0]=cx-hrcx; pt2[1]=cy-hrcy; ijmax=*xmax * *ymax; for(j=0;j<*ymax;j++) { y=pmin[1]+j* *wpitch; y=fabs(y-midy)+midy; if( maxy > y ) { dyw=y-wrcy; dyh=y-hrcy; dy0=y-cy; for(i=0;i<*xmax;i++) { x=pmin[0]+i* *wpitch; x=fabs(x-midx)+midx; if( maxx > x ) { dxw=x-wrcx; dxh=x-hrcx; dx0=x-cx; if(sqrt(dxw*dxw+dyw*dyw) < wr ) { if(sqrt(dxh*dxh+dyh*dyh) < hr ) { gai1=pt1[0]*dy0-pt1[1]*dx0; gai2=pt2[0]*dy0-pt2[1]*dx0; if( dx0 < 0.0 || dy0 < 0.0 || gai1*gai2 >= 0.0 || sqrt(dx0*dx0+dy0*dy0) < cr ) { top[i+ *xmax*j]=(float)pmin[2]; setpen(&topc[i+ *xmax*j],3); } } } } } } } *irc=TRUE; } //====================================================================== void TRMODFREE() // 引数なし // 機能:作業エリアの開放など // 説明:TRYCUT2000終了時のWM_DESTROYイベント発生時に参照されます。 // TRMODINITなどで作業エリアを確保している場合などに、 // その作業エリアの開放(FREE)のために利用します。本関数は省略可です。 { }