⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 makedatadlg.cpp

📁 大齿轮渐开线齿形误差在位误差检测
💻 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 + -