📄 initializeparameterdlg.cpp
字号:
//////////////////////////////////////////////////////////////////////////////
// InitializeParameterDlg.cpp : implementation file
// 初始参数对话框类的定义
// 初始参数部分的算法也应该写在这里
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "gearmeasurement.h"
#include "InitializeParameterDlg.h"
#include "math.h"
#include "GearMeasurementDoc.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern HWND pSShowResultView;//引用全局变量声明
/////////////////////////////////////////////////////////////////////////////
// CInitializeParameterDlg dialog
CInitializeParameterDlg::CInitializeParameterDlg(CWnd* pParent /*=NULL*/)
: CDialog(CInitializeParameterDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CInitializeParameterDlg)
m_moshu = 0;
m_chishu = 0;
m_cljiange = 0.0;
m_cd = 0.0;
m_beta = 0.0;
//}}AFX_DATA_INIT
}
void CInitializeParameterDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInitializeParameterDlg)
DDX_Text(pDX, EDIT1, m_moshu);
DDX_Text(pDX, EDIT2, m_chishu);
DDX_Text(pDX,EDIT4, m_cljiange);
DDX_Text(pDX, EDIT5, m_cd);
DDX_Text(pDX, EDIT3, m_beta);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInitializeParameterDlg, CDialog)
//{{AFX_MSG_MAP(CInitializeParameterDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CInitializeParameterDlg message handlers
void CInitializeParameterDlg::OnOK()
{
// 获得指向Doc的指针
CGearMeasurementDoc* pDoc=(CGearMeasurementDoc*)((CMainFrame*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
// 开始数据更新
UpdateData(TRUE);
int m; //m为齿轮模数
int Z; //为齿轮齿数
double beta; //Bb为基圆螺旋角度
double cd; // 测量头直径
double s; // 测量间隔
char ch1[10],ch2[10],ch3[10],ch4[10],ch5[10];
double pi=3.1415926;
// 把文本框的值读到变量中
GetDlgItem(EDIT1)->GetWindowText(ch1,10);
GetDlgItem(EDIT2)->GetWindowText(ch2,10);
GetDlgItem(EDIT3)->GetWindowText(ch3,10);
GetDlgItem(EDIT4)->GetWindowText(ch4,10);
GetDlgItem(EDIT5)->GetWindowText(ch5,10);
//数据转化
m=atoi(ch1);
Z=atoi(ch2);
beta=atof(ch3)*pi/180;
s=atof(ch4);
cd=atof(ch5);
// 检查用户错误的输入
if(m<=0||Z<=0)
{
AfxMessageBox("请重新输入数据!模数和齿数必须为正整数!");
return;
}
if(beta<0)
{
AfxMessageBox("输入有误,请输入合理的基圆螺旋角!");
return;
}
if(s<=0)
{
AfxMessageBox("采样间隔必须大于0,请重新输入!");
return;
}
if(cd<=0)
{
AfxMessageBox("输入有误,测量头的直径须大于0!");
return;
}
// 用户设定的参数送入Doc中保存
pDoc->m_moshu=m;
pDoc->m_chishu=Z;
pDoc->m_beta=beta;
pDoc->m_cljiange=s;
pDoc->m_cd=cd;
// 计算定位球的直径
double R; // 分度圆半径
double Ra; // 齿顶圆半径
double Rb; // 基圆半径
double S; // 分度圆齿厚
double Sa; // 齿顶圆齿厚
double a; //分度圆上的压力角
double aa; // 齿顶圆上点的压力角
double Q,Qa; //分度圆上的展角和齿顶圆上展角
double A1,A2,B1,B2;//中间变量
double Dmin,Dmax; //定位球的最小,最大
R=0.5*m*Z;
Rb=R*cos(20*pi/180);
Ra=0.5*m*(Z+2);
S=pi*m/2; //分度圆处齿厚
a=20*pi/180; //基圆压力角
aa=acos(Rb/Ra); // 齿顶圆上的压力角
Q=tan(a)-a; //分度圆上渐开线的展角
Qa=tan(aa)-aa; //齿顶圆上渐开线上展角
Sa=S*Ra/R-2*Ra*(Q-Qa); //齿顶圆处渐开线
A1=sqrt(R*R-Rb*Rb);
A2=sqrt(Ra*Ra-Rb*Rb);
B1=Rb*tan(acos(Rb/R)+S/(2*Rb)*cos(a));
B2=Rb*tan(acos(Rb/Ra)+Qa+S/(2*Rb)*cos(a)-Q);
Dmin=2*cos(beta)*(-A1+B1);
Dmax=2*cos(beta)*(-A2+B2);
// 保存结果
pDoc->m_Dmin=Dmin;
pDoc->m_Dmax=Dmax;
pDoc->m_R=R;
// 计算采样点数
double aS,aE; //aS为起始展开角;aE为终止展开角
double YS,YE; //YS为起始Y坐标,YE为终止Y坐标
double Rs; //Rs为起始点半径
double C,YS1; //中间参数;
double A,B; //中间变量
double x,x0; //迭代参数
double ft; //ft为分度圆端面展开角
double *Y,*X,*f; //标准渐开线数组
int n; //采样次数
ft=tan(a); //ft为分度圆端面展开角
Rb=R*cos(a);
C=sqrt(R*R-Rb*Rb)-m/sin(a);
Rs=sqrt(Rb*Rb+C*C); //起测圆半径
Ra=m*(Z+2)/2; //齿顶圆半径
aS=tan(acos(Rb/Rs)); //起测圆端面展开角=tan(压力角);
aE=tan(acos(Rb/Ra)); //终测圆端面展开角
YS=(Rb*(sin(aS)-aS*cos(aS)))*sin(ft)+(Rb*(cos(aS)+aS*sin(aS)))*cos(ft)-
R*cos(a)-(R*sin(pi/(2*Z))+0.5*cd/cos(beta)*cos(a-pi/(2*Z)))/sin(a-pi/(2*Z));
YE=(Rb*(sin(aE)-aE*cos(aE)))*sin(ft)+(Rb*(cos(aE)+aE*sin(aE)))*cos(ft)-
R*cos(a)-(R*sin(pi/(2*Z))+0.5*cd/cos(beta)*cos(a-pi/(2*Z)))/sin(a-pi/(2*Z));
n=(int)((YE-YS)/s); //采样点数
//计算理想渐开线
f=new double[n];
X=new double[n];
Y=new double[n];
f[0]=aS;
f[n-1]=aE;
Y[0]=YS;
Y[n-1]=YE;
//迭代求各点的端面展开角
for(int i=0;i<n;i++)
{
x0=f[0]+0.382*(f[n-1]-f[0]);
YS1=Y[0]+i*s;
A=(Rb*(sin(x0)-x0*cos(x0)))*sin(ft)+(Rb*(cos(x0)+x0*sin(x0)))*cos(ft)-R*cos(a)-(R*sin(pi/(2*Z))+0.5*cd/cos(beta)*cos(a-pi/(2*Z)))/sin(a-pi/(2*Z))-YS1;
B=Rb*x0*sin(x0)*sin(ft)+Rb*x0*cos(x0)*cos(ft);
x=x0-A/B;
while (fabs(x-x0)>0.000001)
{ x0=x;
A=(Rb*(sin(x0)-x0*cos(x0)))*sin(ft)+(Rb*(cos(x0)+x0*sin(x0)))*cos(ft)-R*cos(a)-(R*sin(pi/(2*Z))+0.5*cd/cos(beta)*cos(a-pi/(2*Z)))/sin(a-pi/(2*Z))-YS1;
B=Rb*x0*sin(x0)*sin(ft)+Rb*x0*cos(x0)*cos(ft);
x=x0-A/B;
}
X[i]=Rb*(sin(x0)-x0*cos(x0))*cos(ft)-Rb*(cos(x0)+x0*sin(x0))*sin(ft)+R*sin(a)+0.5*cd/cos(beta);
Y[i]=Rb*(sin(x0)-x0*cos(x0))*sin(ft)+Rb*(cos(x0)+x0*sin(x0))*cos(ft)-R*cos(a)-(R*sin(pi/(2*Z))+0.5*cd/cos(beta)*cos(a-pi/(2*Z)))/sin(a-pi/(2*Z));
f[i]=x0;
}
// 保存生成的模拟数据到Doc中
for(i=0;i<n;i++)
{
pDoc->m_f[i]=f[i];
pDoc->m_X[i]=X[i];
pDoc->m_Y[i]=Y[i];
}
pDoc->m_n=n;
pDoc->m_Rs=Rs;
pDoc->m_Ra=Ra;
pDoc->m_YS=YS;
int flag=0;
pDoc->m_flag=flag;
// 停止数据更新
UpdateData(FALSE);
// 关闭本对话框
EndDialog(NULL);
// 发送参数设定结束给ShowResultView.cpp,参数初始化完毕的消息,更新表格
::SendMessage(pSShowResultView,WM_OnInitializeParameter,0,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -