AutoCAD与C语言接口程序的参数化设计与实现
2010-08-15内蒙古科技大学薄少军
内蒙古科技大学 薄少军
AutoCAD与C语言接口程序的参数化设计与实现
内蒙古科技大学 薄少军
在开发参数化机械CAD系统时,设计了AutoCAD与高级语言的接口程序,把AutoCAD强大的绘图功能与C语言强有力的计算、输入和输出等功能结合起来,实现了自动绘图。
AutoCAD C语言接口
一、引言
AutoCAD具有较强的绘图功能,但它所提供的计算能力有限,对于大量的计算问题显得不太方便。为了充分利用高级语言中强有力的计算、输入、输出功能以及其它功能,必需考虑如何利用高级语言调用AutoCAD中的绘图命令、编辑命令、尺寸标注命令以及其它一些功能命令,这就要为高级语言与AutoCAD之间设计一个接口,以实现高级语言对AutoCAD的功能调用1。
二、AutoCAD与高级语言接口程序的设计
AutoCAD绘图软件与高级语言连接方式主要有以下3种:DXF图形交换文件;命令组文件(3.SCR);IGS类型的图形交换文件。相比之下,命令组文件有以下优点:程序易编、易读、易修改;命令组文件格式比较紧凑、占用内存少,在AutoCAD上运行迅速,操作简单2。
鉴于命令组文件有上述优点,本文选择了命令组文件作为高级语言与AutoCAD的接口。在编写函数时,主要应考虑AutoCAD的命令格式,即基于命令格式来写函数。编写函数的目的实际上就是设计一个高级语言的函数集,通过调用这些函数,可以形成与其功能相对应的命令组文件,用户可以通过高级语言调用这些函数实现对AutoCAD功能的调用,通过Auto2 CAD就可以方便地绘出图形来。
三、AutoCAD与高级语言接口程序的实现
在设计函数之前,首先要将AutoCAD的菜单命令进行分类,然后归纳出各类命令的主要功能,最后编制实现这些功能的高级语言函数。本文将AutoCAD菜单命令分为4类,分别为:图形绘制命令;图形编辑命令;文本注释命令;尺寸标注命令3。下面以尺寸标注命令为例阐述其实现方法。
尺寸标注是一般绘图过程中不可缺少的步骤,为此,AutoCAD提供了一套完整的尺寸标注命令。通过这些命令,可方便地标注图形上的各种尺寸,如线性尺寸、角度、直径、半径等。与这些功能相对应,就必须编写一些函数以实现这些功能。函数的命令与其菜单名基本一致,其参数与在交互方式下实现这一功能时所输入的参数也基本相同。
例如,函数dim liner(floatX,floatY,float Z,float L,int I,int J,int K)的功能是自动进行水平标注和垂直标注。其中,X、Y是起点的坐标,L是相对于起点的长度,Z是相对于上一点的长度。I、J、K是状态控制参数,取值为:
I=0 标注水平尺寸
I=1 标注垂直尺寸
J=0 标注直径符号
J=1 标注半径符号
K=0 起点坐标为绝对坐标
K=1 起点坐标为相对坐标
函数清单如下:
/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定义从字符串中取子串函数3/
{
int k;
for(k=i-1;k
}
void right(char 3 p1,char 3 p2,inti)/3定义从字符串右端取子串函数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定义标注函数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文件中写标注命令和标注参数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关闭SCR文件3/ } 如果用dim liner(100,60,8,70,0,0,0)调用该函数,则在命令组文件中形成如下形式的数据: D IM HOR 100,60@70,0@8,0 70 EXIT 在绘AutoCAD的编辑状态下,用SCRIPT命令调用含有命令组的文本文件即可生成所需绘制的直线。 我们为AutoCAD命令编写函数,设计AutoCAD与高级语言的接口,从而成功地将高级语言的优点和AutoCAD的绘图功能有机结合起来,取得了很好的效果。 [1]方贵盛,王建军.AutoCAD二次开发技术及其应用研究[J].机床与液压,2007.06 [2]王军政.TURBO C 3.0实用高级编程技巧.北京:北京科海培训中心,2002 [3]应道宁,胡树根.中国CAD/CAM应用与研究.成都:电子科技大学出版社,2002 book=56,ebook=151四、结论