內(nèi)蒙古科技大學(xué) 薄少軍
AutoCAD與C語言接口程序的參數(shù)化設(shè)計與實現(xiàn)
內(nèi)蒙古科技大學(xué) 薄少軍
在開發(fā)參數(shù)化機械CAD系統(tǒng)時,設(shè)計了AutoCAD與高級語言的接口程序,把AutoCAD強大的繪圖功能與C語言強有力的計算、輸入和輸出等功能結(jié)合起來,實現(xiàn)了自動繪圖。
AutoCAD C語言接口
AutoCAD具有較強的繪圖功能,但它所提供的計算能力有限,對于大量的計算問題顯得不太方便。為了充分利用高級語言中強有力的計算、輸入、輸出功能以及其它功能,必需考慮如何利用高級語言調(diào)用AutoCAD中的繪圖命令、編輯命令、尺寸標(biāo)注命令以及其它一些功能命令,這就要為高級語言與AutoCAD之間設(shè)計一個接口,以實現(xiàn)高級語言對AutoCAD的功能調(diào)用1。
AutoCAD繪圖軟件與高級語言連接方式主要有以下3種:DXF圖形交換文件;命令組文件(3.SCR);IGS類型的圖形交換文件。相比之下,命令組文件有以下優(yōu)點:程序易編、易讀、易修改;命令組文件格式比較緊湊、占用內(nèi)存少,在AutoCAD上運行迅速,操作簡單2。
鑒于命令組文件有上述優(yōu)點,本文選擇了命令組文件作為高級語言與AutoCAD的接口。在編寫函數(shù)時,主要應(yīng)考慮AutoCAD的命令格式,即基于命令格式來寫函數(shù)。編寫函數(shù)的目的實際上就是設(shè)計一個高級語言的函數(shù)集,通過調(diào)用這些函數(shù),可以形成與其功能相對應(yīng)的命令組文件,用戶可以通過高級語言調(diào)用這些函數(shù)實現(xiàn)對AutoCAD功能的調(diào)用,通過Auto2 CAD就可以方便地繪出圖形來。
在設(shè)計函數(shù)之前,首先要將AutoCAD的菜單命令進行分類,然后歸納出各類命令的主要功能,最后編制實現(xiàn)這些功能的高級語言函數(shù)。本文將AutoCAD菜單命令分為4類,分別為:圖形繪制命令;圖形編輯命令;文本注釋命令;尺寸標(biāo)注命令3。下面以尺寸標(biāo)注命令為例闡述其實現(xiàn)方法。
尺寸標(biāo)注是一般繪圖過程中不可缺少的步驟,為此,AutoCAD提供了一套完整的尺寸標(biāo)注命令。通過這些命令,可方便地標(biāo)注圖形上的各種尺寸,如線性尺寸、角度、直徑、半徑等。與這些功能相對應(yīng),就必須編寫一些函數(shù)以實現(xiàn)這些功能。函數(shù)的命令與其菜單名基本一致,其參數(shù)與在交互方式下實現(xiàn)這一功能時所輸入的參數(shù)也基本相同。
例如,函數(shù)dim liner(floatX,floatY,float Z,float L,int I,int J,int K)的功能是自動進行水平標(biāo)注和垂直標(biāo)注。其中,X、Y是起點的坐標(biāo),L是相對于起點的長度,Z是相對于上一點的長度。I、J、K是狀態(tài)控制參數(shù),取值為:
I=0 標(biāo)注水平尺寸
I=1 標(biāo)注垂直尺寸
J=0 標(biāo)注直徑符號
J=1 標(biāo)注半徑符號
K=0 起點坐標(biāo)為絕對坐標(biāo)
K=1 起點坐標(biāo)為相對坐標(biāo)
函數(shù)清單如下:
/3 dim liner.c 3
#include
#include
char XX[16],YY[16],ZZ[16],LL[16],UU [16],TT[16],SS[12];
void mid(char 3 pl,char 3 p2,inti,intj)/3定義從字符串中取子串函數(shù)3/
{
int k;
for(k=i-1;k
}
void right(char 3 p1,char 3 p2,inti)/3定義從字符串右端取子串函數(shù)3/
{
intj,k=strlen(p1);
for(j=k-i;j } void dim liner(float X,float Y,float Z,float L,float I,int J,int K) { /3定義標(biāo)注函數(shù)3/ int xl,yl,zl,110,i; float ll; FILE 3 fp; p rintf(″Enter your SCR filename: ); gets(SS); /3輸入要建立的SCR文件名3/ strcat(SS,″.SCR″);/3加擴展名3/ if((fp=fopen(SS,″W″))==NULL) { /3建立SCR文件3/ p rintf(″Can’t open SCR file!″); exit(0); } sp rintf(XX,″%f″,X); sp rintf(YY,″%f″,Y); sp rintf(ZZ,″%f″,Z); xl=Z>=0?strlen(XX)-l:strlen(XX); yl=Y>=0?strlen(YY)-l:strlen(YY); zl=Z>=0?strlen(ZZ)-l:strlen(ZZ); L=(int)(L 3 100+.5)/100; sp rintf(LL,″%d″L); 110=strlen(LL); strcpy(UU,″″); for(i=0<110;i++) { mid(LL,TT,i,l); strcat(UU,TT); if(!strcmp(TT,″.″)) { mid(LL,TT,i+1,2); strcat(UU,TT); break; } } strcpy(LL,UU); ll=L>=0?strlen(LL)-l:strlen(LL); right(LL,LL,ll); right(XX,XX,xl); right(YY,YY,yl); right(ZZ,ZZ,zl); if(I==0) { fp rintf(fp,″dim hor″);/3向SCR文件中寫標(biāo)注命令和標(biāo)注參數(shù)3/ if(K==1)fp rintf(fp,″@″); fp rintf(fp,:″%s″,XX); fp rintf(fp,″,″); fp rintf(fp,″%s″,YY); fp rintf(fp,″@″); fp rintf(fp,″%s″,LL); fp rintf(fp,″,0@0,″); fp rintf(fp,″%s″,ZZ); fp rintf(fp,″″); } else { fp rintf(fp,″dim ver″); if(K==1)fp rintf(fp,″@″); fp rintf(fp,″%s″,XX); fp rintf(fp,″,″); fp rintf(fp,″%s″,YY); fp rintf(fp,″@″); fp rintf(fp,″%s″,LL); fp rintf(fp,″,0@0,″); fp rintf(fp,″%s″,ZZ); fp rintf(fp,″″); } if(J==1)fp rintf(fp,″%%%%c″); if(J==2)fp rintf(fp,″r″); if(L<0)right(LL,LL,ll-l); fp rintf(fp,″%s″,LL); fp rintf(fp,″exit″); fclose(fp); /3關(guān)閉SCR文件3/ } 如果用dim liner(100,60,8,70,0,0,0)調(diào)用該函數(shù),則在命令組文件中形成如下形式的數(shù)據(jù): D IM HOR 100,60@70,0@8,0 70 EXIT 在繪AutoCAD的編輯狀態(tài)下,用SCRIPT命令調(diào)用含有命令組的文本文件即可生成所需繪制的直線。 我們?yōu)锳utoCAD命令編寫函數(shù),設(shè)計AutoCAD與高級語言的接口,從而成功地將高級語言的優(yōu)點和AutoCAD的繪圖功能有機結(jié)合起來,取得了很好的效果。 [1]方貴盛,王建軍.AutoCAD二次開發(fā)技術(shù)及其應(yīng)用研究[J].機床與液壓,2007.06 [2]王軍政.TURBO C 3.0實用高級編程技巧.北京:北京科海培訓(xùn)中心,2002 [3]應(yīng)道寧,胡樹根.中國CAD/CAM應(yīng)用與研究.成都:電子科技大學(xué)出版社,2002 book=56,ebook=151四、結(jié)論