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

📄 initializeparameterdlg.cpp

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