资源描述
西南交通大学机械CAD课程大作业设计说明书设计题目:基于PROE二次开发的齿轮参数化设计系统指导熊鹰组员信息:20XX12月目录简介2一、研究现状3二、设计思路42.1 选定平台42.2 Pro/E+Visual Studio平台调试52.3 编译及调试事项5三、系统结构6四、关键功能实现74.1 齿轮参数化建模过程74.2 程序关键功能实现114.2.1 主程序进入流程114.2.2 对话框与具体实现方法134.2.3 建立模型方法144.2.4 读取模型参数方法17五、系统使用方法185.1 安装系统185.2 使用方法20六、总结与展望22七、附录22参考文献40简 介Pro/Engineer操作软件是美国参数技术公司PTC旗下的CAD/CAM/CAE一体化的三维软件。Pro/Engineer软件以参数化著称,是参数化技术的最早应用者,在目前的三维造型软件领域中占有着重要地位,Pro/Engineer作为当今世界机械CAD/CAE/CAM领域的新标准而得到业界的认可和推广。是现今主流的CAD/CAM/CAE软件之一,特别是在国产品设计领域占据重要位置。我们以Pro/E Wildfire 4.0为基础进行二次开发,建立了符合GB的齿轮模型,并在Visual Studio 2005平台上编写了齿轮参数化设计程序,界面友好。设置模数等参数即可快速地生成符合GB的齿轮模型,极提高了齿轮设计效率。一、 研究现状Pro/E平台:MONLibs号称是国最全的标准件库,其中的齿轮库使用了名为PTC国家标准件库中的齿轮模型。这些齿轮模型带有参数,并自带Pro/Program编写的输入函数。该库并未添加齿轮参数设置的容。图1.1 MONLibs标准件库就目前互联网上的免费资源而言,Pro/E平台下的齿轮参数化设计程序还是较为常见,但其大多界面和功能都较为简单。Solidworks平台:Solidworks平台下的GearTrax是享有盛名的齿轮参数化设计系统。能够详细地设置齿轮的各个参数,绘制动态的啮合图,且能够修改该程序创建的模型。但最大的缺点是该程序制作的齿轮模型的渐开线是分段取值后连线而成,对系统资源的占用相当高,曲线分段化后给人以不完美的感觉体验。图1.2 Solidworks平台下的GearTrax由此,自主开发一套齿轮参数化设计程序还是有其实用性。二、 设计思路2.1 选定平台最初我们打算使用Pro/E的Pro/Program模块进行设计。但在研究了Pro/Program的共11条函数1,并了解其功能后,我们认为Pro/Program虽然能够实现功能,但界面不够友好。图2.1 Pro/Program的使用步骤还是不够友好之后,我们决定使用Pro/Toolkit,进行Pro/E的二次开发。2.2 Pro/E+Visual Studio平台调试开始使用的是Creo Elements/Pro 5.0。我们对照二代龙震工作室的Pro/Toolkit Wildfire 2.0插件设计2,搭配Visual C+6.0进行调试。但遗憾的是,虽然Helloworld.dll的例子可以运行,但编译环境却怎么也调不出来,例子都无法编译。我们尝试了使用nmake命令,与可视化环境,均无法编译。经过检查,随书光盘例子的代码存在部分错误,修正后依然无法通过编译。之后,我们参考了王伟的ProE野火版TOOLKIT二次开发入门与进阶3,文中提及一般来说Visual Studio可以编译Pro/E 2.0至4.0的程序,而Visual C+要编译Pro/E 4.0的程序,则环境设置过于复杂。在换用Visual Studio 2010后,Creo Elements/Pro 5.0的Toolkit官方例程及二代龙震的例程依然无法编译。代码编译已经通过,但各lib之间依然存在问题。在参考了大量文献及源代码后,我们决定降级平台,安装Pro/E 4.0+Visual Studio 2005进行编译。在编译成功后,我们再采取单一变量法实验并写成了一个Excel表格以总结各编译参数对于编译结果的影响,详见附录1 proe二次开发总结 by Tom Willow.xls。2.3 编译及调试事项使用库:wsock32.libVS系统库必需mpr.libVS系统库必需psapi.lib系统进程状态控制库必需netapi32.libWindows网络应用接口库Creo1.0必需protk_dllmd.lib早期:prodev_dllmd.libProe4.0+VS2005,Debug/Release均可注册文件protk.dat文件名不可变容:NAME你好世界可用中文,与dll名称等均无关EXEC_FILEC:ch03Helloworld.dll如果开头是.或无盘符则自动寻找工作路径$MACHINE_TYPE返回i486_ntTEXT_DIRC:ch03text1. 不可无该项目。2. 文本并不嵌入程序,而是在proe第一次执行该程序时载入。之后修改文本须在proe重启并再次执行程序时生效。3. 若proe启动后,第一次运行程序时没找到text,程序不报错。但之后即便修复了text程序依然不运行。菜单不更改,消息不输出。STARTUPdllDll模式:dll多进程模式:spawnALLOW_STOPTRUE允许停止UNICODE_ENCODINGFALSE不支持UNICODE选FALSE,较老的程序需有此项方可运行ENDDELAY_START是否延迟调用应用程序REVISION2001Pro/TOOLKIT版本号,若没有则Pro/E自动寻找版本号同一个注册文件中可以容纳多个应用程序。若将protk.dat文件放在Pro/E工作目录下,则Pro/E启动时自动加载。三、 系统结构系统名称为GBGear,即国标齿轮的意思。工程下包含stdafx和GBGear两个头文件,其包含文件再包含系统标准包含文件及资源。具体结构如图3.1。GBGear工程stdafx.cppstdafx.h标准系统包含文件GBGear.cppGBGear.h主程序DlgGear类Resourse.h资源头文件GBGear.rc资源文件IDD_DIALOG1程序主界面图3.1 系统结构文件结构如图3.2所示。-界面头文件-主程序头文件-资源头文件-界面源文件-主程序头文件-资源文件,包含程序界面图3.2 文件结构四、 关键功能实现4.1 齿轮参数化建模过程1.建立各参数。图4.1 建立各参数2.在关系中加入运算齿根圆等四个圆半径的公式。ha=*mhf=*mr=z*m/2ra=r+harb=r*cosrf=r-hf3.草绘四个圆,并加入关系。图4.2 加入草绘关系4.加入计算渐开线偏移角的关系。ee=pi*m/2-2*x*m*tane_half_reg=ee/2/re_half_deg=e_half_reg*180/piss=pi*m/2+2*x*m*tans_half_reg=ss/2/rs_half_deg=s_half_reg*180/pitheta=tanacos-acos*pi/180偏移角弧度=-偏移角角度=偏移角弧度*180/pi计算偏移角是为了使渐开线最终围成的齿位于正中间,再加入位于齿隙正中的参考平面后,可便于装配时定位,以达到良好的仿真效果,并减少干涉。5.加入基于圆柱坐标系的渐开线,再镜像。图4.3 渐开线镜像前方程:r=rb/costheta=90+tan-t*50*pi/180*180/pi+偏移角角度z=06.拉伸齿根圆,厚度为b。图4.4 拉伸齿根圆7.绘制齿形草绘,并加入关系。图4.5 绘制齿形草绘8.阵列齿形,并加入关系。图4.6 阵列齿形9.加入参考平面,并加入关系。该参考平面用于装配时定位初始角度。图4.7 加入参考平面如此,即完成了直齿圆柱齿轮的参数化建模。图4.8 直齿圆柱齿轮参数化建模模型4.2 程序关键功能实现4.2.1 主程序进入流程由于Pro/Toolkit应用程序工作模式有两种同步模式Synchronous mode和异步模式Asynchronous mode。而同步模式又包含两种模式动态库模式DLL和多进程模式Multiprocess mode。我们这次是针对同步模式中的动态库模式DLL。简单地说,就是Pro/E通过protk.dat文件寻找dll和text的目录,然后通过dll中的user_initialize函数进入二次开发程序。其中text目录用于供程序读取菜单栏,通知信息等文字数据。主程序进入函数流程如图4.8。ProMenubarMenuAdd加入新工具栏项ProCmdActionAdd加入处理事件ProMenubarmenuPushbuttonAdd加入新工具栏项若无ProCmdActionAdd加入工具栏按钮,则工具栏无法显示user_initialize Pro/E标准进入函数UserAccessTestMenu命令传入状态函数名称项引用txt文件CyGear函数图4.9 主程序进入函数流程图主程序进入函数源代码:externCint user_initialize /AfxEnableControlContainer;ProError status;ProName menufil;uiCmdCmdId cmd_id;ProStringToWstring;status = ProMenubarMenuAdd;/名字GBGearstatus = ProCmdActionAddCyGear,CyGear,uiCmdPrioDefault,UserAccessTestMenu,PRO_B_TRUE,PRO_B_TRUE,&cmd_id;status = ProMenubarmenuPushbuttonAdd;ProStringToWstring;ProMessageDisplay;return;命令传入状态函数源代码:static uiCmdAccessState UserAccessTestMenureturn ;在命令处理事件添加函数ProCmdActionAdd中调用了CyGear函数,将函数加载至工具栏按钮。ProCmdActionAddCyGear,CyGear,uiCmdPrioDefault,UserAccessTestMenu, PRO_B_TRUE,PRO_B_TRUE,&cmd_id;CyGear函数:void CyGearAFX_MANAGE_STATEAfxGetStaticModuleState; DlgGear DlgGear; DlgGear.DoModal;CyGear函数中创建了一个DlgGear对象,该对象由DlgGear.cpp及DlgGear.h支持,用于显示对话框,及完成相关命令。4.2.2 对话框与具体实现方法在资源文件GBGear.rc中,新建了一个IDD_DIALOG1对话框资源。并添加控件,布局如图。图4.10 对话框资源IDD_DIALOG1为对话框添加类DlgGear。在DlgGear.h头文件中,可以找到枚举型IDD变量,即为引用了对话框资源。class DlgGear : public CDialogDECLARE_DYNAMICpublic:DlgGear; / 标准构造函数virtual DlgGear;/ 对话框数据enum IDD = IDD_DIALOG1 ;4.2.3 建立模型方法在按钮中加入OnBnClicked函数处理按下事件,建立模型。void DlgGear:OnBnClickedBuildProMdl part;ProError err;wchar_t fname255;wcscpy;err = ProMdlRetrieve;/载入fname文件SetGear;其中,cy_gearfilename为一个全局变量,其定义如下:CString cy_gearfilename=LPTCGBGearcylinder_gear.prt;SetGear为一个自定函数,传入ProMdl类型的形参,在函数将该模型参数设置为全局变量中定义的各参数值,并再生模型,激活窗口。下面为SetGear函数流程图:ProModelitemInit初始化模型特征ProParameterInit初始化参数变量ProMdlIdGet得到模型id设置ProParamvalue类型变量的类型与值UpdateData将控件内容传输到控件变量ProParameterValueSet设置模型参数ProSolidRegenerate再生模型ActivatePart激活模型窗口自定函数ProMdlDisplay显示模型图4.11 SetGear函数流程图源代码因太长,故附于附录中。SetGear函数设置模型参数后,调用ActivePart函数以激活当前窗口。void ActivatePartProName pname;ProType ptype;int window_id;ProMdlNameGet;ProMdlTypeGetcurrent_part,&ptype;ProObjectwindowCreate;ProWindowActivate;其关键函数只有ProObjectwindowCreate和ProWindowActivate,但因为前者需要传入模型名字与类型的形参,所以在其前加入ProMdlNameGet和ProMdlTypeGet函数。4.2.4 读取模型参数方法作为一个齿轮生成系统,如果生成的齿轮不能通过该系统修改,实在是件糟糕的事。如果修改后,丢失了其他特征例如孔,键槽,凸台等,则修改也失去意义。所以,我们为系统加入了读取模型参数的方法,将数据读取后反应至对话框上的控件,让对话框和建立该齿轮时的状态相同,便于用户更改。下面是读取模型参数的流程图:ProMdlIdGet得到模型idProParameterInit初始化参数变量ProMdlCurrentGet得到当前模型句柄将ProParamvalue的值赋给各全局变量,并设置各控件数值,状态ProParameterValueGet得到模型参数ProModelitemInit初始化模型特征图4.12 读取模型参数步骤流程图值得一提的是,Pro/Toolkit开发的程序是需要解锁的,否则只能在开发该程序的计算机运行。解锁过程在官方文档中叙述相当详细,在此不再赘述。五、 系统使用方法5.1 安装系统1.打开GBGear文件夹,其下文件如图:图5.1 GBGear文件夹下文件将GBGear文件夹复制至Pro/E工作目录。2.打开Pro/E,之后 工具 辅助应用程序,弹出如下窗口:图5.2 辅助应用程序窗口3.点击 注册,选中 Pro/E工作目录GBGearprotk.dat 文件,窗口出现国标齿轮列表项。图5.3 加载程序4.点击 启动。之后菜单栏上帮助左边新增了一个国标齿轮菜单项。图5.4 程序菜单5.2 使用方法程序启动后会自动检查当前模型,如果检测到齿轮,会在状态栏进行提示。图5.5 程序界面依次设置各参数值,点击建立。即可生成新的齿轮模型。图5.6建立模型打开一个齿轮文件,如图5.7。该图中孔,键槽等特征是生成模型后加上的。加载国标齿轮程序,对话框开启时会自动检测当前文件。检测成功并读取参数后,会在状态栏更新状态为已激活当前的齿轮。如果程序未激活可手动点击激活当前齿轮按钮。图5.7 激活齿轮设置参数后,齿轮将更新为新参数。可以看到,其余特征并未受到影响。图5.8 更新后的齿轮六、 总结与展望这次做Pro/E的二次开发,虽然作品不算复杂,系统也较为单一,但调试成功就是给予我们最大的鼓励,特别是经过了几天,换着环境的调试,程序通过的一刹那,让人欣喜若狂。这种感觉是单一地建模与Pro/Program的简单程序所不能给予的。此外,在编写程序的过程中,我们克服了对英文文档的恐惧,耐下性子阅读PTC的Pro/Toolkit帮助文档,各个函数,分门别类,各司其职,各种自定义的参数,函数名称的命名规则,让人一看就能够知道其功能,不禁对PTC公司的水平肃然起敬。限于时间关系,这个齿轮参数化设计程序,还有很多有待完善的地方:1. 目前该系统只有直齿圆柱齿轮一种,但基于参数赋值调用并重建模型的方法与模型的建模过程其实是独立的,因而添加其他蜗轮等模型实质上只是增加程序界面与接口的问题。2. Pro/Toolkit的每条函数都会返回一个ProError类型的变量,以说明错误类型。但限于时间我们只对部分关键函数的错误信息进行了反馈。在今后的程序改进中,将其余函数的错误信息进行处理有助于增强程序的强壮性。3. 现在该程序点击建立,则新建的模型会覆盖当前窗口,算是一个BUG。经过努力,该BUG尚未解决。4. 程序窗口激活后,焦点转移至程序,而模型窗口则处于非激活状态。若能使程序和Pro/E本身的弹出窗口一样,不影响模型窗口状态,则程序的便捷性将会提高。七、 附录1. 文件proe二次开发总结 by Tom Willow.xls附于同文件夹下。2. 工程全部源代码附于同文件夹下。此处附主头文件及DlgGear类头文件。GBGear.cpp:/ GBGear.cpp : 定义DLL 的初始化例程。/#includestdafx.h#includeGBGear.h#includeDlgGear.h#include#include#include#include#includeProFileName msgfil;#ifdef _DEBUG#definenew DEBUG_NEW#endif/TODO: 如果此DLL 相对于MFC DLL 是动态的,/则从此DLL 导出的任何调入/MFC 的函数必须将AFX_MANAGE_STATE 宏添加到/该函数的最前面。/例如:/extern C BOOL PASCAL EXPORT ExportedFunction/AFX_MANAGE_STATEAfxGetStaticModuleState;/ 此处为普通函数体/此宏先于任何MFC 调用/出现在每个函数中十分重要。这意味着/它必须作为函数中的第一个语句/出现,甚至先于所有对象变量声明,/这是因为它们的构造函数可能生成MFC/DLL 调用。/有关其他详细信息,/请参阅MFC 技术说明33 和58。/ CGBGearAppBEGIN_MESSAGE_MAPEND_MESSAGE_MAP/ CGBGearApp 构造CGBGearApp:CGBGearApp/ TODO: 在此处添加构造代码,/ 将所有重要的初始化放置在InitInstance 中/ 唯一的一个CGBGearApp 对象CGBGearApp theApp;/ CGBGearApp 初始化BOOL CGBGearApp:InitInstanceCWinApp:InitInstance;return TRUE;/以下为编写容void CyGearAFX_MANAGE_STATEAfxGetStaticModuleState; DlgGear DlgGear; DlgGear.DoModal;static uiCmdAccessState UserAccessTestMenureturn ;externCint user_initialize /AfxEnableControlContainer;ProError status;ProName menufil;uiCmdCmdId cmd_id;ProStringToWstring;status = ProMenubarMenuAdd;/名字GBGearstatus = ProCmdActionAddCyGear,CyGear,uiCmdPrioDefault,UserAccessTestMenu,PRO_B_TRUE,PRO_B_TRUE,&cmd_id;status = ProMenubarmenuPushbuttonAdd;ProStringToWstring;ProMessageDisplay;return;externCvoid user_terminate ProMessageDisplay;return;DlgGear.cpp:/ DlgGear.cpp : 实现文件/#includestdafx.h#includeGBGear.h#includeDlgGear.h#include#include#include#include#include#includeProParameter.h#includeProSolid.h#includeProMdl.h#includeProModelItem.h#includeProUIInputpanel.h/ DlgGear 对话框IMPLEMENT_DYNAMICDlgGear:DlgGear: CDialog/各初始值, Combo_M1_int, Combo_M2_int, Combo_alpha_int, int_z, d_hax, d_cx, d_x, d_b, d_m3DlgGear:DlgGearvoid DlgGear:DoDataExchangeCDialog:DoDataExchange;DDX_Control;DDX_Control;DDX_Control;DDX_CBIndex;DDX_CBIndex;DDX_CBIndex;DDX_Control;DDX_Text;DDX_Control;DDX_Control;DDX_Control;DDX_Text;DDX_Text;DDX_Text;DDX_Text;DDX_Control;DDX_Control;DDX_Control;DDX_Text;DDX_Control;DDX_Control;BEGIN_MESSAGE_MAPON_BN_CLICKEDON_BN_CLICKEDON_BN_CLICKEDON_BN_CLICKEDON_BN_CLICKEDON_BN_CLICKEDON_BN_CLICKEDON_BN_CLICKEDON_BN_CLICKEDON_BN_CLICKEDEND_MESSAGE_MAP/ DlgGear 消息处理程序CString cy_gearfilename=LGBGearGearLibcylinder_gear.prt;constint m1count = 18;double m1m1count=1,1.25,1.5,2,2.5,3,4,5,6,8,10,12,16,20,25,32,40,50;constint m2count = 18;double m2m2count=1.125,1.375,1.75,2.25,2.75,3.5,4.5,5.5,6.5,7,9,11,14,18,22,28,36,45;constint alphacount = 5;double alpha0alphacount=14.5,15,20,22.5,25;CString selffilename;BOOL DlgGear:OnInitDialog/窗口初始化CDialog:OnInitDialog;this-OnBnClickedRadioM1;Combo_M1_int = 3;UpdateData;ReadM;int_z = 21;UpdateData;spin_z.SetRange;Combo_alpha_int = 2;UpdateData;ReadAlpha;this-OnBnClickedRadiohc1;ReadHaxCx;d_x = 0;UpdateData;d_b = 20;UpdateData;spin_b.SetRange;GetDlgItem-SetWindowText;/*TCHAR szPathMAX_PATH;GetModuleFileName;AfxMessageBox;*/得到的是C:.xtop.exethis-OnBnClickedButtonAct;/启动自动检测激活return TRUE; / return TRUE unless you set the focus to a controlint GetIndexFromArrayfor int i=0;iif return i;return -1;void DlgGear:ReadMif GetDlgItem-GetCheckUpdateData;d_m = m1Combo_M1_int;if GetDlgItem-GetCheckUpdateData;d_m = m2Combo_M2_int;if GetDlgItem-GetCheckUpdateData;d_m = d_m3;void DlgGear:ReadAlphaUpdateData;d_alpha = alpha0Combo_alpha_int;void DlgGear:ReadHaxCxif GetDlgItem-GetCheckthis-OnBnClickedRadiohc1;if GetDlgItem-GetCheckthis-OnBnClickedRadiohc2;if GetDlgItem-GetCheckthis-OnBnClickedRadiohc3;void ActivatePartProName pname;ProType ptype;int window_id;ProMdlNameGet;ProMdlTypeGetcurrent_part,&ptype;ProObjectwindowCreate;ProWindowActivate;void ActivateCurrentProMdl current_part;ProError err;err = ProMdlCurrentGet;if ActivatePart;elseAfxMessageBox;void DlgGear:SetGearint i;ProModelitem feature;ProParameter param_m;ProParameter param_z;ProParameter param_alpha;ProParameter param_hax;ProParameter param_cx;ProParameter param_x;ProParameter param_b;ProParamvalue value_m;ProParamvalue value_z;ProParamvalue value_alpha;ProParamvalue value_hax;ProParamvalue value_cx;ProParamvalue value_x;ProParamvalue value_b;ProError err_value_m;ProError err_value_z;ProError err_value_alpha;ProError err_value_hax;ProError err_value_cx;ProError err_value_x;ProError err_value_b;/wchar_t fname255;/wcscpy;/err = ProMdlRetrieve;/获得cy_gear文件名ProMdlIdGet;ProModelitemInit;ProParameterInit;/初始化参数ProParameterInit;ProParameterInit;ProParameterInit;ProParameterInit;ProParameterInit;ProParameterInit;ReadM;/读入mvalue_m.type=PRO_PARAM_DOUBLE;value_m.value.d_val=d_m;UpdateData;value_z.type=PRO_PARAM_INTEGER;value_z.value.i_val=int_z;ReadAlpha;value_alpha.type=PRO_PARAM_DOUBLE;value_alpha.value.d_val=d_alpha;ReadHaxCx;value_hax.type=PRO_PARAM_DOUBLE;value_hax.value.d_val=d_hax;value_cx.type=PRO_PARAM_DOUBLE;value_cx.value.d_val=d_cx;UpdateData;value_x.type=PRO_PARAM_DOUBLE;value_x.value.d_val=d_x;UpdateData;value_b.type=PRO_PARAM_DOUBLE;value_b.value.d_val=d_b;err_value_m = ProParameterValueSet;if GetDlgItem-SetWindowText;err_value_z = ProParameterValueSet;if GetDlgItem-SetWindowText;err_value_alpha = ProParameterValueSet;if GetDlgItem-SetWindowText;err_value_hax = ProParameterValueSet;if GetDlgItem-SetWindowText;err_value_cx = ProParameterValueSet;if GetDlgItem-SetWindowText;err_value_x = ProParameterValueSet;if GetDlgItem-SetWindowText;err_value_b = ProParameterValueSet;if GetDlgItem-SetWindowText;ProSolidRegeneratepart, PRO_B_TRUE;/再生ProMdlDisplay;ActivatePart;void DlgGear:SetComboBox_M/设置m下拉框禁用启用状态switch case 1:GetDlgItem-SetCheck;GetDlgItem-SetCheck;GetDlgItem-SetCheck;ComboBox_M1.EnableWindow;ComboBox_M2.EnableWindow;Edit_M3.EnableWindow;break;case 2:GetDlgItem-SetCheck;GetDlgItem-SetCheck;GetDlgItem-SetCheck;ComboBox_M1.EnableWindow;ComboBox_M2.EnableWindow;Edit_M3.EnableWindow;break;case 3:GetDlgItem-SetCheck;GetDlgItem-SetCheck;GetDlgItem-SetCheck;ComboBox_M1.EnableWindow;ComboBox_M2.EnableWindow;Edit_M3.EnableWindow;break;void DlgGear:OnBnClickedRadioM1SetComboBox_M;void DlgGear:OnBnClickedRadioM2SetComboBox_M;void DlgGear:OnBnClickedRadioM3SetComboBox_M;void DlgGear:OnBnClickedRadiohc1GetDlgItem-SetCheck;GetDlgItem-SetCheck;GetDlgItem-SetCheck;Edit_hax.SetReadOnly;Edit_cx.SetReadOnly;ReadM;if d_md_hax = 1;d_cx = 0.35;/这两个是参数elsed_hax = 1;d_cx = 0.25;UpdateData;void DlgGear:OnBnClickedRadiohc2GetDlgItemIDC_RADIO_hc
展开阅读全文