📄 makedatadlg.cpp
字号:
// MakeDataDlg.cpp : implementation file
//
#include "stdafx.h"
#include "gearmeasurement.h"
#include "MakeDataDlg.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;//引用全局变量声明
/////////////////////////////////////////////////////////////////////////////
// CMakeDataDlg dialog
// 生成实验数据对话框类的声明
////////////////////////////////////////////////////////////////////////////
CMakeDataDlg::CMakeDataDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMakeDataDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMakeDataDlg)
m_D = 0.0;
m_kN = 0;
m_dL = 0.0;
m_cL = 0.0;
//}}AFX_DATA_INIT
}
void CMakeDataDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMakeDataDlg)
DDX_Text(pDX, mdEDIT1, m_D);
DDX_Text(pDX, mdEDIT2, m_kN);
DDX_Text(pDX, mdEDIT3, m_dL);
DDX_Text(pDX, mdEDIT4, m_cL);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMakeDataDlg, CDialog)
//{{AFX_MSG_MAP(CMakeDataDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMakeDataDlg message handlers
void CMakeDataDlg::OnOK()
{
// 获得指向Doc的指针
CGearMeasurementDoc* pDoc=(CGearMeasurementDoc*)((CMainFrame*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
// 开始数据更新
UpdateData(TRUE);
// 把文本框的值读到变量中
double pi=3.1415926;
int D;
double s; //s 为采样间隔
int kN; //Nc为跨齿数
double dL; //定位臂长
double cL; //测量臂长
char ch1[10],ch2[10],ch3[10],ch4[10];
// 把文本框的值读到变量中
GetDlgItem(mdEDIT1)->GetWindowText(ch1,10);
GetDlgItem(mdEDIT2)->GetWindowText(ch2,10);
GetDlgItem(mdEDIT3)->GetWindowText(ch3,10);
GetDlgItem(mdEDIT4)->GetWindowText(ch4,10);
//数据转化
D=atoi(ch1);
kN=atoi(ch2);
dL=atof(ch3);
cL=atof(ch4);
s=pDoc->m_cljiange;
// 检查用户错误的输入
if(D<=pDoc->m_Dmin||D>=pDoc->m_Dmax)
{
AfxMessageBox("请输入数据!请选择合理的定位球直径!");
return;
}
if(kN<=0)
{
AfxMessageBox("请输入数据!跨齿数必须为正整数!");
return;
}
if(dL<=0)
{
AfxMessageBox("请输入数据!请选择合理的定位臂长!");
return;
}
if(cL<=0)
{
AfxMessageBox("请输入数据!请选择合理的测量臂长!");
return;
}
// 用户设定的参数送入Doc中保存
pDoc->m_D=D;
pDoc->m_kN=kN;
pDoc->m_dL=dL;
pDoc->m_cL=cL;
//迭代求定位球接触点的压力角
int m=pDoc->m_moshu;
int Z=pDoc->m_chishu;
double beta=pDoc->m_beta;
double R=pDoc->m_R;
double a=20*pi/180;
double Rb=R*cos(a);
double Q=tan(a)-a;
double S=0.5*m*pi;
double a0=20*pi/180;
double dx=0.0001;
double A,B,ai; //ai为最后的迭代值
A=D/cos(beta)*cos(a0)/(2*sin(tan(a0)-a0+pi/Z-S/(2*R)*cos(a0)-Q))-Rb/cos(tan(a0)+
pi/Z-S/(2*R)*cos(a0)-Q);
B=D/cos(beta)*cos(a0-dx)/(2*sin(tan(a0-dx)-(a0-dx)+pi/Z-S/(2*R)*cos(a0)-Q))-
Rb/cos(tan(a0-dx)+pi/Z-S/(2*R)*cos(a0)-Q);
ai=a0-A*dx/(A-B);
while (fabs(ai-a0)>=0.000001)
{
a0=ai;
A=D/cos(beta)*cos(a0)/(2*sin(tan(a0)-a0+pi/Z-S/(2*R)-Q))-Rb/cos(tan(a0)
+pi/Z-S/(2*R)*cos(a0)-Q);//subs(fun,x,a0);
B=D/cos(beta)*cos(a0-dx)/(2*sin(tan(a0-dx)-(a0-dx)+pi/Z-S/(2*R)-Q))-
Rb/cos(tan(a0-dx)+pi/Z-S/(2*R)*cos(a0)-Q);//subs(fun,x,a0);/subs(fun,x,a0-dx);
ai=a0-A*dx/(A-B);
}
pDoc->m_ai=ai; //保存迭代结果
//计算定位球球心位置
double cd=pDoc->m_cd;
double OE,AO,AF,W;
AO=Rb/cos(tan(ai)+pi/Z-S/(2*Rb)*cos(a)-Q);
OE=(0.5*cd/cos(beta)/sin(a-pi/(2*Z))+R*sin(pi/(2*Z))*cos(a-pi/(2*Z))/sin(a-pi/(
2*Z))+R*cos(pi/(2*Z))-AO*cos(pi*kN/Z))/cos(a-pi/(2*Z));
W=AO*(sin(pi*kN/Z)*cos(a-pi/(2*Z))+sin(a-pi/(2*Z))*cos(pi*kN/Z))-0.5*cd/
cos(beta)-R*sin(a);
AF=W*tan(a-pi/(2*Z));
//计算测量头Y坐标
double Yci;
int flag=1;
Yci=-(OE+AF-dL+cL);
pDoc->m_A=AO;
pDoc->m_flag=flag;
//写生成模拟数据的算法
int n=pDoc->m_n; //n为采样点数
double *RandX; //模拟的渐开线齿形
double rb=1,ra; //中间参数
double dfmin=1000,dfmax=-1000; //中间参数
RandX=new double[n];
//生成模拟渐开线
for(int i=0;i<n;i++)
{
ra=(double)(rand()%10)*rb;
pDoc->m_RandX[i]=pDoc->m_X[i]+ra/10;
rb=(-1)*rb;
if(dfmin>(pDoc->m_X[i]-pDoc->m_RandX[i]))
{
dfmin=pDoc->m_X[i]-pDoc->m_RandX[i];
}
if(dfmax<(pDoc->m_X[i]-pDoc->m_RandX[i]))
{
dfmax=pDoc->m_X[i]-pDoc->m_RandX[i];
}
}
pDoc->m_dfmax=dfmax; //生成包络渐开线时所用到的参数
pDoc->m_dfmin=dfmin;
//理论渐开线与实际渐开线之间的误差
double *error;
double errorMax=0;
error=new double[n]; //存误差数组
for(i=0;i<pDoc->m_n;i++)
{
error[i]=fabs(pDoc->m_RandX[i]-pDoc->m_X[i])/cos(pDoc->m_f[i]-tan(a));
if(errorMax<error[i])
errorMax=error[i];
}
errorMax=errorMax;
pDoc->m_errorMax=errorMax/30; //保存最大齿形误差;
// 判断是否合格
CString judge;
if(errorMax>0.042)
judge="合格";
else
judge="不合格";
pDoc->m_judge=judge;
// 停止数据更新
UpdateData(FALSE);
// 关闭本对话框
EndDialog(NULL);
// 发送参数设定结束给SetParameterView.cpp,生成数据完成的消息,更新表格
::SendMessage(pSShowResultView,WM_OnMakeData,0,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -