AutoCAD利用SCRIPT脚本生成齿轮

问题描述

根据给出的模数m 齿数z 厚度b 使用C语言生成AutoCAD Script脚本绘制出齿轮图形

注意事项

  1. 本脚本中除参数需要用实际数值代替掉以外格式不允许发生任何改动(空格也不行),否则大概率会造成无法运行。
  2. 在AutoCAD中使用SCRIPT时需要关闭动态输入(F12)将输入座标变为绝对座标,需要关闭对象捕捉(F3),否则会因不可抗力而导致图形畸变。
  3. 脚本中出现的粗实线、细实线、尺寸线为对应的图层名称,可根据自己的配置进行修改,但需要注意附近的空格。
  4. 脚本中的空格极其重要,在运行时会起到类似回车的作用,因此要特别注意每一句中有几个空格,尤其是每一句代码的最后,有些是不需要额如CIRLCE指令,有些需要一个如LINE、LAYER指令,有些需要两个到三个。
  5. 脚本中的某些指令的运行跟高版本(我的是2018)中的指令会有些许不同,如LAYER指令,在指令框中直接运行只能打开图层管理器,而在脚本中运行时则可以更换图层,经查阅官方给的资料后发现是指令有些许改动,同名的老版本指令只需在指令前添加“-",如-LAYER,就可以使用老版本中的指令。

齿轮参数

/* 参数 */
齿顶高ha               ha=m
齿根高hf               hf=1.25m
齿高h                  h=ha+hf=1.25m
分度圆直径d            d=mz
齿顶圆直径da           da=d+2ha=m(z+2)
齿根圆直径df           df=d-2hf=m(z-2.5)
齿厚b	
中心距a                a=(d1+d2)/2=m(z1+z2)/2
压力角A=20,变位系数O=0,齿高系数T=1,齿顶隙系数B=0.25,过度圆弧系数=0.38
基圆半径rb=mz/2*cos(A)
齿顶圆半径rt=mz/2+m*(T+O)
齿根圆半径rf=mz/2-m*(T+B-O)
已知齿顶圆da=220,齿数z=20,求出模数m=10,分度圆直径d=200,基圆半径rb=93.97,齿根圆df=175
//切线角度
theta_k = 360/(z*2)
//对称线角度
theta_m = 360/(z*4)
//切线长度
l = PI*rb*2/(2*z)
//过渡圆半径
mid_r = 0.38*m
//第四点
theta_4=theta_k*da/2*sin(acos(rb*2/da))/l
//渐开线上四点
x_1 = -(rb*sin(theta_k)-l*cos(theta_k))
y_1 = rb*cos(theta_k)+l*sin(theta_k))
x_2 = -(rb*sin(2*theta_k)-2*l*cos(2*theta_k))
y_2 = rb*cos(2*theta_k)+2*l*sin(2*theta_k)
x_3 = -(rb*sin(3*theta_k)-3*l*cos(3*theta_k))
y_3 = rb*cos(3*theta_k)+3*l*sin(3*theta_k)
x_4 = -(rb*sin(theta_4)-theta_4/theta_k*l*cos(theta_4))
y_4 = rb*cos(theta_4)+theta_4/theta_k*l*sin(theta_4)

/* ************************************************* */

SCRIPT脚本

/* *********** 主程序 ********** */
LIMITS -(da/2+20),-(da/2+20) (da/2+20),(da/2+20) 
ZOOM A
BASE 0,0
LAYER S 虚线 
CIRCLE 0,0 d/2
CIRCLE 0,0 rb
LAYER S 中心线 
LINE -(da/2+20),0 (da/2+20),0 
LINE 0,-(da/2+20) 0,(da/2+20) 
LINE 0,0 -da/2*sin(theta_m),da/2*cos(theta_m) 
LAYER S 粗实线 
SPLINE x_1,y_1 x_2,y_2 x_3,y_3 x_4,y_4   
LINE x_1,y_1 0,(df/2+mid_r) 
ARC 0,(df/2+mid_r) C mid_r,(df/2+mid_r) df/2*sin(atan(mid_r/(df/2+mid_r))),df/2*cos(atan(mid_r/(df/2+mid_r)))
ARC C 0,0 x_4,y_4 -da/2*sin(theta_m),da/2*cos(theta_m)
ARC C 0,0 df/2*sin(atan(mid_r/(df/2+mid_r))),df/2*cos(atan(mid_r/(df/2+mid_r))) A -(theta_m-asin(df/2*sin(atan(mid_r/(df/2+mid_r)))/(df/2)))
MIRROR W x_4-10,y_4+10 df/2*sin(atan(mid_r/(df/2+mid_r)))+10,df/2*cos(atan(mid_r/(df/2+mid_r)))-10  -da/2*sin(theta_k/2),da/2*cos(theta_k/2) 0,0 N  
ARRAYPOLAR W -(da/2+20),(da/2+20) (da/2+20),10  0,0 I Z  
LAYER S 中心线 
LINE (da/2+30),0 (da/2+b+70),0 
LINE (da/2+50+b/2),(da/2+20) (da/2+b/2+50),-(da/2+20) 
LAYER S 粗实线 
LINE (da/2+50+b/2),da/2 (da/2+b+50),da/2 
LINE (da/2+b+50),da/2 (da/2+b+50),0 
LINE (da/2+b/2+50),df/2 (da/2+b+50),df/2 
LAYER S 虚线 
LINE (da/2+b/2+50),d/2 (da/2+b+50),d/2 
MIRROR W (da/2+50+b/2)-10,da/2+10 (da/2+b+50)+10,-10  (da/2+50),0 (da/2+b+70),0 N  
MIRROR W (da/2+50+b/2)-10,da/2+10 (da/2+b+50)+10,-10-da/2  (da/2+50+b/2),(da/2+20) (da/2+b/2+50),-(da/2+20) N  
LAYER S 尺寸线 
DIM
DIMTXT 5
HOR (da/2+50),0 (da/2+50+b),0 (da/2+50+b/2),(df/5) b 
VER (da/2+50+b),-df/2 (da/2+50+b),df/2 (da/2+b+90),0 df 
VER (da/2+50+b),-d/2 (da/2+50+b),d/2 (da/2+b+110),0 d 
VER (da/2+50+b),-da/2 (da/2+50+b),da/2 (da/2+b+130),0 da 
EXIT
/* END */

C语言实现脚本生成

typedef struct __POINT_
{
	float x;
	float y;
}MyPoint;
/**
* @brief  根据模数、齿数、齿厚、压力角生成AutoCAD脚本 gear.scr
*/
void gear(float m, float z, float b ,float A) 
{
	FILE *fp;
	float d = m*z;				//分度圆直径		
	float da = m*(z + 2*1);		//齿顶圆直径		齿顶高 ha* = 1	    
	float df = m*(z - 2*1.25);		//齿根圆直径		齿根高 hf* = ha* +c*=1.25    
	float rb = m*z / 2 * cos(A * PI / 180); //基圆半径 
	float theta_k = 360 / (z * 2) * PI / 180;	//切线角度
	float theta_m = 360 / (z * 4) * PI / 180;	//对称线偏角
	float l = PI * rb * 2 / (2 * z);		//切线长度
	float mid_r = 0.38 * m;		//齿根过渡圆圆角 过度圆弧系数 = 0.38
	float theta_4 = theta_k * da / 2 * sin(acos(rb * 2 / da)) / l;
	MyPoint P[4];				//渐开线上四点
    char filename[50];
	sprintf_s(filename,"gear_z_%.1f_m_%.1f_b_%.1f_Alpha_%.1f.scr",z,m,b,A);

	P[0].x = -(rb*sin(theta_k) - l * cos(theta_k));
	P[0].y = rb * cos(theta_k) + l * sin(theta_k);
	P[1].x = -(rb*sin(2 * theta_k) - 2 * l*cos(2 * theta_k));
	P[1].y = rb * cos(2 * theta_k) + 2 * l*sin(2 * theta_k);
	P[2].x = -(rb*sin(3 * theta_k) - 3 * l*cos(3 * theta_k));
	P[2].y = rb * cos(3 * theta_k) + 3 * l*sin(3 * theta_k);
	P[3].x = -(rb*sin(theta_4) - theta_4 / theta_k * l*cos(theta_4));
	P[3].y = rb * cos(theta_4) + theta_4 / theta_k * l*sin(theta_4);

	if (fopen_s(&fp, filename, "w") != NULL)
	{
		printf("文件生成失败\n");
		return;
	}

	fprintf(fp, "LIMITS %.2f,%.2f %.2f,%.2f\n", -(da/2+20), -(da/2+20), (da/2+20), (da/2+20));
	fprintf(fp, "ZOOM A\n");
	fprintf(fp, "BASE 0,0\n");
	fprintf(fp, "LAYER S 虚线 \n");
	fprintf(fp, "CIRCLE 0,0 %.2f\n", d / 2);
	fprintf(fp, "CIRCLE 0,0 %.2f\n", rb);
	fprintf(fp, "LAYER S 中心线 \n");
	fprintf(fp, "LINE %.2f,0 %.2f,0 \n", -(da / 2 + 20), (da / 2 + 20));
	fprintf(fp, "LINE 0,%.2f 0,%.2f \n", -(da / 2 + 20), (da / 2 + 20));
	fprintf(fp, "LINE 0,0 %.2f,%.2f \n", -da / 2 * sin(theta_m), da / 2 * cos(theta_m));
	fprintf(fp, "LAYER S 粗实线 \n");
	fprintf(fp, "SPLINE %.2f,%.2f %.2f,%.2f %.2f,%.2f %.2f,%.2f   \n",P[0].x,P[0].y,P[1].x,P[1].y, P[2].x, P[2].y, P[3].x, P[3].y);
	fprintf(fp, "LINE %.2f,%.2f 0,%.2f \n", P[0].x, P[0].y, (df / 2 + mid_r));
	fprintf(fp, "ARC 0,%.2f C %.2f,%.2f %.2f,%.2f\n", (df / 2 + mid_r), mid_r, (df / 2 + mid_r), df / 2 * sin(atan(mid_r / (df / 2 + mid_r))), df / 2 * cos(atan(mid_r / (df / 2 + mid_r))));
	fprintf(fp, "ARC C 0,0 %.2f,%.2f %.2f,%.2f\n", P[3].x,P[3].y, -da / 2 * sin(theta_m), da / 2 * cos(theta_m));
	fprintf(fp, "ARC C 0,0 %.2f,%.2f A %.2f\n", df / 2 * sin(atan(mid_r / (df / 2 + mid_r))), df / 2 * cos(atan(mid_r / (df / 2 + mid_r))), -(theta_m - asin(df / 2 * sin(atan(mid_r / (df / 2 + mid_r))) / (df / 2)))*180/PI);
	fprintf(fp, "MIRROR W %.2f,%.2f %.2f,%.2f  %.2f,%.2f 0,0 N  \n", P[3].x-10, P[3].y+10, df / 2 * sin(atan(mid_r / (df / 2 + mid_r))) + 10, df / 2 * cos(atan(mid_r / (df / 2 + mid_r))) - 10, -da / 2 * sin(theta_k / 2), da / 2 * cos(theta_k / 2));
	fprintf(fp, "ARRAYPOLAR W %.2f,%.2f %.2f,10  0,0 I %.2f  \n", -(da / 2 + 20), (da / 2 + 20), (da / 2 + 20), z);
	fprintf(fp, "LAYER S 中心线 \n");
	fprintf(fp, "LINE %.2f,0 %.2f,0 \n", (da / 2 + 30), (da / 2 + b + 70));
	fprintf(fp, "LINE %.2f,%.2f %.2f,%.2f \n", (da / 2 + 50 + b / 2), (da / 2 + 20), (da / 2 + b / 2 + 50), -(da / 2 + 20));
	fprintf(fp, "LAYER S 粗实线 \n");
	fprintf(fp, "LINE %.2f,%.2f %.2f,%.2f \n", (da / 2 + 50 + b / 2), da / 2, (da / 2 + b + 50), da / 2);
	fprintf(fp, "LINE %.2f,%.2f %.2f,0 \n", (da / 2 + b + 50), da / 2, (da / 2 + b + 50));
	fprintf(fp, "LINE %.2f,%.2f %.2f,%.2f \n", (da / 2 + b / 2 + 50), df / 2, (da / 2 + b + 50), df / 2);
	fprintf(fp, "LAYER S 虚线 \n");
	fprintf(fp, "LINE %.2f,%.2f %.2f,%.2f \n", (da / 2 + b / 2 + 50), d / 2, (da / 2 + b + 50), d / 2);
	fprintf(fp, "MIRROR W %.2f,%.2f %.2f,-10  %.2f,0 %.2f,0 N  \n", (da / 2 + 50 + b / 2) - 10, da / 2 + 10, (da / 2 + b + 50) + 10, (da / 2 + 50), (da / 2 + b + 70));
	fprintf(fp, "MIRROR W %.2f,%.2f %.2f,%.2f  %.2f,%.2f %.2f,%.2f N  \n", (da / 2 + 50 + b / 2) - 10, da / 2 + 10, (da / 2 + b + 50) + 10, -10 - da / 2, (da / 2 + 50 + b / 2), (da / 2 + 20), (da / 2 + b / 2 + 50), -(da / 2 + 20));
	fprintf(fp, "LAYER S 尺寸线 \n");
	fprintf(fp, "DIM\n");
	fprintf(fp, "DIMTXT 5\n");
	fprintf(fp, "HOR %.2f,0 %.2f,0 %.2f,%.2f %.2f \n", (da / 2 + 50), (da / 2 + 50 + b), (da / 2 + 50 + b / 2), (df / 5),b);
	fprintf(fp, "VER %.2f,%.2f %.2f,%.2f %.2f,0 %.2f \n", (da / 2 + 50 + b), -df / 2, (da / 2 + 50 + b), df / 2, (da / 2 + b + 90), df);
	fprintf(fp, "VER %.2f,%.2f %.2f,%.2f %.2f,0 %.2f \n", (da / 2 + 50 + b), -d / 2, (da / 2 + 50 + b), d / 2, (da / 2 + b + 110), d);
	fprintf(fp, "VER %.2f,%.2f %.2f,%.2f %.2f,0 %.2f \n", (da / 2 + 50 + b), -da / 2, (da / 2 + 50 + b), da / 2, (da / 2 + b + 130), da);
	fprintf(fp, "EXIT\n");
	fclose(fp);
}

运行结果

这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章