問題描述
根據給出的模數m 齒數z 厚度b 使用C語言生成AutoCAD Script腳本繪製出齒輪圖形
注意事項
- 本腳本中除參數需要用實際數值代替掉以外格式不允許發生任何改動(空格也不行),否則大概率會造成無法運行。
- 在AutoCAD中使用SCRIPT時需要關閉動態輸入(F12)將輸入座標變爲絕對座標,需要關閉對象捕捉(F3),否則會因不可抗力而導致圖形畸變。
- 腳本中出現的粗實線、細實線、尺寸線爲對應的圖層名稱,可根據自己的配置進行修改,但需要注意附近的空格。
- 腳本中的空格極其重要,在運行時會起到類似回車的作用,因此要特別注意每一句中有幾個空格,尤其是每一句代碼的最後,有些是不需要額如CIRLCE指令,有些需要一個如LINE、LAYER指令,有些需要兩個到三個。
- 腳本中的某些指令的運行跟高版本(我的是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);
}