当前位置:首页 >> 机械/仪表 >>

基于PROE二次开发的齿轮参数化设计系统


西南交通大学 机械 CAD 课程大作业设计说明书

设计题目:基于 PROE 二次开发的齿轮参数化设计系统 指导教师:熊鹰 组员信息:

2012 年 12 月

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

目录
简 介 ..................

............................................................................... 2 一、 研究现状 .................................................................................... 3 二、 设计思路 .................................................................................... 4
2.1 选定平台........................................................................................... 4 2.2 PRO/E+VISUAL STUDIO 平台调试 ............................................................ 5 2.3 编译及调试事项 ............................................................................... 5

三、 系统结构 .................................................................................... 6 四、 关键功能实现 ............................................................................. 7
4.1 齿轮参数化建模过程 ........................................................................ 7 4.2 程序关键功能实现 ..........................................................................11 4.2.1 主程序进入流程 ........................................................................11 4.2.2 对话框与具体实现方法 .............................................................13 4.2.3 建立模型方法 ............................................................................14 4.2.4 读取模型参数方法 ....................................................................17

五、 系统使用方法 ........................................................................... 18
5.1 安装系统..........................................................................................18 5.2 使用方法..........................................................................................20

六、 总结与展望 .............................................................................. 22 七、 附录 .......................................................................................... 22 参考文献 ........................................................................................... 40

1

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班





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 的齿轮模型,极大地提高了齿轮设计效率。

2

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

一、 研究现状
Pro/E 平台: MONLibs 号称是国内最全的标准件库,其中的齿轮库使用了名为“PTC 国家标准件 库”中的齿轮模型。这些齿轮模型带有参数,并自带 Pro/Program 编写的输入函数。该 库并未添加齿轮内参数设置的内容。

图 1.1

MONLibs 标准件库

就目前互联网上的免费资源而言,Pro/E 平台下的齿轮参数化设计程序还是较为常 见,但其大多界面和功能都较为简单。 Solidworks 平台: Solidworks 平台下的 GearTrax 是享有盛名的齿轮参数化设计系统。能够详细地设置 齿轮的各个参数,绘制动态的啮合图,且能够修改该程序创建的模型。但最大的缺点是 该程序制作的齿轮模型的渐开线是分段取值后连线而成,对系统资源的占用相当高,曲 线分段化后给人以不完美的感觉体验。

3

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

图 1.2

Solidworks 平台下的 GearTrax

由此,自主开发一套齿轮参数化设计程序还是有其实用性。

二、 设计思路
2.1 选定平台
最初我们打算使用 Pro/E 的 Pro/Program 模块进行设计。 但在研究了 Pro/Program 的 共 11 条函数[1],并了解其功能后,我们认为 Pro/Program 虽然能够实现功能,但界面 不够友好。

图 2.1

Pro/Program 的使用步骤还是不够友好
4

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

之后,我们决定使用 Pro/Toolkit,进行 Pro/E 的二次开发。

2.2 Pro/E+Visual Studio 平台调试
开始使用的是 Creo Elements/Pro 5.0。我们对照二代龙震工作室的《Pro/Toolkit Wildfire 2.0 插件设计》 搭配 Visual C++6.0 进行调试。 [2], 但遗憾的是, 虽然 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 编译及调试事项
使用库:
库名 描述 备注 必需 必需 必需 Creo1.0 必需 Proe4.0+VS2005,Debug/Release 均可

wsock32.lib mpr.lib psapi.lib netapi32.lib protk_dllmd.lib

VS 系统库 VS 系统库 系统进程状态控制库 Windows 网络应用接口库
早期:prodev_dllmd.lib

注册文件 protk.dat(文件名不可变)内容:
项目 NAME EXEC_FILE TEXT_DIR 内容 你好世界 C:\ch03\Helloworld.dll C:\ch03\text 备注 可用中文,与 dll 名称等均无关 如果开头是.\或无盘符则自动寻找工作路径 $MACHINE_TYPE 返回 i486_nt 1. 2. 不可无该项目。 文本并不嵌入程序, 而是在 proe 第一次执行该程 序时载入。 之后修改文本须在 proe 重启并再次执 行程序时生效。 3. 若 proe 启动后,第一次运行程序时没找到 text, 程序不报错。但之后即便修复了 text 程序依然不 运行。菜单不更改,消息不输出。 STARTUP dll Dll 模式:dll

5

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班 多进程模式:spawn ALLOW_STOP UNICODE_ENCODING END 可选项 DELAY_START REVISION 2001 是否延迟调用应用程序 Pro/TOOLKIT 版本号, 若没有则 Pro/E 自动寻找版本号 TRUE FALSE 允许停止 不支持 UNICODE 选 FALSE,较老的程序需有此项方可 运行

同一个注册文件中可以容纳多个应用程序。 若将 protk.dat 文件放在 Pro/E 工作目 录下,则 Pro/E 启动时自动加载。

三、 系统结构
系统名称为 GBGear, 即国标齿轮的意思。 工程下包含 stdafx 和 GBGear 两个头文件, 其包含文件再包含系统标准包含文件及资源。具体结构如图 3.1。
GBGear 工程

stdafx.cpp stdafx.h 标准系统包含文件

GBGear.cpp GBGear.h 主程序

DlgGear 类

Resourse.h 资源头文件

GBGear.rc 资源文件 IDD_DIALOG1 程序主界面 图 3.1 系统结构

文件结构如图 3.2 所示。

6

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

---界面头文件 ---主程序头文件 ---资源头文件

---界面源文件 ---主程序头文件

-资源文件,包含 程序界面

图 3.2 文件结构

四、 关键功能实现
4.1 齿轮参数化建模过程
1.建立各参数。

图 4.1 建立各参数

2.在关系中加入运算齿根圆等四个圆半径的公式。
ha=(hax+x)*m

7

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
hf=(hax+cx-x)*m r=z*m/2 ra=r+ha rb=r*cos(alpha) rf=r-hf

3.草绘四个圆,并加入关系。

图 4.2 加入草绘关系

4.加入计算渐开线偏移角的关系。
ee=pi*m/2-2*x*m*tan(alpha) e_half_reg=ee/2/r e_half_deg=e_half_reg*180/pi ss=pi*m/2+2*x*m*tan(alpha) s_half_reg=ss/2/r s_half_deg=s_half_reg*180/pi theta=tan(acos(rb/r))-acos(rb/r)*pi/180 偏移角弧度=-(s_half_reg+theta) 偏移角角度=偏移角弧度*180/pi

计算偏移角是为了使渐开线最终围成的齿位于正中间, 再加入位于齿隙正中的参考 平面后,可便于装配时定位,以达到良好的仿真效果,并减少干涉。 5.加入基于圆柱坐标系的渐开线,再镜像。

8

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

图 4.3 渐开线(镜像前)

方程:
r=rb/cos(t*50) theta=90+(tan(t*50)-t*50*pi/180)*180/pi+偏移角角度 z=0

6.拉伸齿根圆,厚度为 b。

图 4.4 拉伸齿根圆

7.绘制齿形草绘,并加入关系。

9

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

图 4.5 绘制齿形草绘

8.阵列齿形,并加入关系。

图 4.6 阵列齿形

9.加入参考平面,并加入关系。该参考平面用于装配时定位初始角度。

10

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

图 4.7 加入参考平面

如此,即完成了直齿圆柱齿轮的参数化建模。

图 4.8 直齿圆柱齿轮参数化建模模型

4.2 程序关键功能实现 4.2.1 主程序进入流程
由于 Pro/Toolkit 应用程序工作模式有两种——同步模式(Synchronous mode)和异
11

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

步模式(Asynchronous mode) 。而同步模式又包含两种模式——动态链接库模式(DLL) 和多进程模式(Multiprocess mode) 。我们这次是针对同步模式中的动态链接库模式 (DLL) 。 简单地说,就是 Pro/E 通过 protk.dat 文件寻找 dll 和 text 的目录,然后通过 dll 中的 user_initialize()函数进入二次开发程序。其中 text 目录用于供程序读取菜单栏,通知信 息等文字数据。 主程序进入函数流程如图 4.8。
user_initialize() Pro/E 标准进入函数

ProMenubarMenuAdd 加入新工具栏项

名称项引用 txt 文件

UserAccessTestMenu 命令传入状态函数

ProCmdActionAdd 加入处理事件 若无 ProCmdActionAdd 加入工具栏按钮, 则工具栏无法显示

CyGear 函数

ProMenubarmenuPushbuttonAdd 加入新工具栏项

图 4.9 主程序进入函数流程图

主程序进入函数源代码:
extern "C" int user_initialize() { // AfxEnableControlContainer();

ProError status; ProName menufil; uiCmdCmdId cmd_id;

ProStringToWstring(menufil,"menu.txt");

status = ProMenubarMenuAdd("GBGear","gbgear","Help", PRO_B_FALSE,menufil);//名字 GBGear

status =

12

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
ProCmdActionAdd("CyGear",(uiCmdCmdActFn)CyGear,uiCmdPrioDefault,UserAccessTestMenu, PRO_B_TRUE,PRO_B_TRUE,&cmd_id);

status = ProMenubarmenuPushbuttonAdd("GBGear","cygear","cylinder_gear","cylinder_gear_tip",N ULL, PRO_B_TRUE,cmd_id,menufil);

ProStringToWstring(msgfil,"msg.txt"); ProMessageDisplay(msgfil,"hello");

return(0); }

命令传入状态函数源代码:
static uiCmdAccessState UserAccessTestMenu(uiCmdAccessMode access_mode) { return (ACCESS_AVAILABLE); }

在命令处理事件添加函数 ProCmdActionAdd 中调用了 CyGear 函数,将函数加载至 工具栏按钮。
ProCmdActionAdd("CyGear",(uiCmdCmdActFn)CyGear,uiCmdPrioDefault,UserAccessTestMenu, PRO_B_TRUE,PRO_B_TRUE,&cmd_id);

CyGear 函数:
void CyGear() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); DlgGear DlgGear; DlgGear.DoModal(); }

CyGear 函数中创建了一个 DlgGear 对象,该对象由 DlgGear.cpp 及 DlgGear.h 支持, 用于显示对话框,及完成相关命令。

4.2.2 对话框与具体实现方法
在资源文件 GBGear.rc 中,新建了一个 IDD_DIALOG1 对话框资源。并添加控件,布
13

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

局如图。

图 4.10 对话框资源 IDD_DIALOG1

为对话框添加类 DlgGear。在 DlgGear.h 头文件中,可以找到枚举型 IDD 变量,即为 引用了对话框资源。
class DlgGear : public CDialog { DECLARE_DYNAMIC(DlgGear)

public: DlgGear(CWnd* pParent = NULL); virtual ~DlgGear(); // 标准构造函数

// 对话框数据 enum { IDD = IDD_DIALOG1 }; …(其下部分略)

4.2.3 建立模型方法
在按钮中加入 OnBnClicked 函数处理按下事件,建立模型。
void DlgGear::OnBnClickedBuild() { ProMdl part; ProError err; wchar_t fname[255];

14

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
wcscpy(fname,cy_gearfilename); err = ProMdlRetrieve(fname, PRO_MDL_PART, &part);//载入fname文件 SetGear(part); }

其中,cy_gearfilename 为一个全局变量,其定义如下:
CString cy_gearfilename=L"PTCGBGear\\cylinder_gear.prt";

SetGear 为一个自定函数,传入 ProMdl 类型的形参,在函数内将该模型参数设置为 全局变量中定义的各参数值,并再生模型,激活窗口。下面为 SetGear 函数流程图:

15

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

ProMdlIdGet 得到模型 id

ProModelitemInit 初始化模型特征

ProParameterInit 初始化参数变量

UpdateData(true)将控件内容传输到 控件变量

设置 ProParamvalue 类型变量的类型 与值

ProParameterValueSet 设置模型参数

ProSolidRegenerate 再生模型

ProMdlDisplay 显示模型

ActivatePart 激活模型窗口 (自定函数)

图 4.11 SetGear 函数流程图

16

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

源代码因太长,故附于附录中。 SetGear 函数设置模型参数后,调用 ActivePart 函数以激活当前窗口。
void ActivatePart(ProMdl current_part) { ProName pname; ProType ptype; int window_id; ProMdlNameGet(current_part,pname); ProMdlTypeGet(current_part,(ProMdlType*)&ptype); ProObjectwindowCreate(pname,ptype,&window_id); ProWindowActivate(window_id); }

其关键函数只有 ProObjectwindowCreate 和 ProWindowActivate,但因为前者需要传 入模型名字与类型的形参,所以在其前加入 ProMdlNameGet 和 ProMdlTypeGet 函数。

4.2.4 读取模型参数方法
作为一个齿轮生成系统, 如果生成的齿轮不能通过该系统修改, 实在是件糟糕的事。 如果修改后,丢失了其他特征(例如孔,键槽,凸台等) ,则修改也失去意义。所以, 我们为系统加入了读取模型参数的方法,将数据读取后反应至对话框上的控件,让对话 框和建立该齿轮时的状态相同,便于用户更改。 下面是读取模型参数的流程图:

17

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班 ProMdlCurrentGet 得到当前模型句柄

ProMdlIdGet 得到模型 id

ProModelitemInit 初始化模型特征

ProParameterInit 初始化参数变量

ProParameterValueGet 得到模型参数

将 ProParamvalue 的值赋给各全局变 量,并设置各控件数值,状态

图 4.12 读取模型参数步骤流程图

值得一提的是,Pro/Toolkit 开发的程序是需要解锁的,否则只能在开发该程序的计 算机运行。解锁过程在官方文档中叙述相当详细,在此不再赘述。

五、 系统使用方法
5.1 安装系统
1.打开 GBGear 文件夹,其下文件如图:

18

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

图 5.1 GBGear 文件夹下文件

将 GBGear 文件夹复制至 Pro/E 工作目录内。 2.打开 Pro/E,之后 工具 – 辅助应用程序,弹出如下窗口:

图 5.2 辅助应用程序窗口

3.点击 注册,选中 Pro/E 工作目录\GBGear\protk.dat 文件,窗口内出现“国标齿 轮”列表项。

图 5.3 加载程序

19

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

4.点击 启动。之后菜单栏上“帮助”左边新增了一个“国标齿轮”菜单项。

图 5.4 程序菜单

5.2 使用方法
程序启动后会自动检查当前模型,如果检测到齿轮,会在状态栏进行提示。

图 5.5 程序界面

依次设置各参数值,点击建立。即可生成新的齿轮模型。

20

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

图 5.6 建立模型

打开一个齿轮文件,如图 5.7。该图中孔,键槽等特征是生成模型后加上的。加载 “国标齿轮”程序,对话框开启时会自动检测当前文件。检测成功并读取参数后,会在 状态栏更新状态为“已激活当前的齿轮” 。如果程序未激活可手动点击“激活当前齿轮” 按钮。

图 5.7 激活齿轮

设置参数后,齿轮将更新为新参数。可以看到,其余特征并未受到影响。

21

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

图 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 类头文件。
22

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

GBGear.cpp:
// GBGear.cpp : 定义DLL 的初始化例程。 //

#include "stdafx.h" #include "GBGear.h" #include "DlgGear.h"

#include <ProToolkit.h> #include <ProMessage.h> #include <ProMenu.h> #include <ProMenuBar.h> #include <ProUtil.h>

ProFileName msgfil;

#ifdef _DEBUG #define new DEBUG_NEW #endif

// //TODO: 如果此DLL 相对于MFC DLL 是动态链接的, // // // // // // // // // // // // // // // // // // // // 有关其他详细信息, 此宏先于任何MFC 调用 出现在每个函数中十分重要。这意味着 它必须作为函数中的第一个语句 出现,甚至先于所有对象变量声明, 这是因为它们的构造函数可能生成MFC DLL 调用。 } extern "C" BOOL PASCAL EXPORT ExportedFunction() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // 此处为普通函数体 例如: 则从此DLL 导出的任何调入 MFC 的函数必须将AFX_MANAGE_STATE 宏添加到 该函数的最前面。

23

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
// // 请参阅MFC 技术说明33 和58。

// CGBGearApp

BEGIN_MESSAGE_MAP(CGBGearApp, CWinApp) END_MESSAGE_MAP()

// CGBGearApp 构造

CGBGearApp::CGBGearApp() { // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在InitInstance 中 }

// 唯一的一个CGBGearApp 对象

CGBGearApp theApp;

// CGBGearApp 初始化 BOOL CGBGearApp::InitInstance() { CWinApp::InitInstance();

return TRUE; } //以下为编写内容

void CyGear() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); DlgGear DlgGear; DlgGear.DoModal(); }

static uiCmdAccessState UserAccessTestMenu(uiCmdAccessMode access_mode)

24

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
{ return (ACCESS_AVAILABLE); }

extern "C" int user_initialize() { // AfxEnableControlContainer();

ProError status; ProName menufil; uiCmdCmdId cmd_id;

ProStringToWstring(menufil,"menu.txt");

status = ProMenubarMenuAdd("GBGear","gbgear","Help", PRO_B_FALSE,menufil);//名字 GBGear

status = ProCmdActionAdd("CyGear",(uiCmdCmdActFn)CyGear,uiCmdPrioDefault,UserAccessTestMenu, PRO_B_TRUE,PRO_B_TRUE,&cmd_id);

status = ProMenubarmenuPushbuttonAdd("GBGear","cygear","cylinder_gear","cylinder_gear_tip",N ULL, PRO_B_TRUE,cmd_id,menufil);

ProStringToWstring(msgfil,"msg.txt"); ProMessageDisplay(msgfil,"hello");

return(0); }

extern "C" void user_terminate() { ProMessageDisplay(msgfil,"byebye"); return; }

DlgGear.cpp:
// DlgGear.cpp : 实现文件 //

#include "stdafx.h" #include "GBGear.h"

25

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
#include "DlgGear.h"

#include <ProToolkit.h> #include <ProMessage.h> #include <ProUtil.h> #include <ProWindows.h> #include <ProDrawing.h> #include "ProParameter.h" #include "ProSolid.h" #include "ProMdl.h" #include "ProModelItem.h" #include "ProUIInputpanel.h" // DlgGear 对话框 IMPLEMENT_DYNAMIC(DlgGear, CDialog)

DlgGear::DlgGear(CWnd* pParent /*=NULL*/) : CDialog(DlgGear::IDD, pParent)//各初始值 , Combo_M1_int(0) , Combo_M2_int(0) , Combo_alpha_int(0) , int_z(0) , d_hax(0) , d_cx(0) , d_x(0) , d_b(0) , d_m3(0) {

}

DlgGear::~DlgGear() { }

void DlgGear::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO_M1, ComboBox_M1); DDX_Control(pDX, IDC_COMBO_M2, ComboBox_M2); DDX_Control(pDX, IDC_RADIO_M1, Radio_M1); DDX_CBIndex(pDX, IDC_COMBO_M1, Combo_M1_int);

26

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
DDX_CBIndex(pDX, IDC_COMBO_M2, Combo_M2_int); DDX_CBIndex(pDX, IDC_COMBO_alpha, Combo_alpha_int); DDX_Control(pDX, IDC_EDIT_M3, Edit_M3); DDX_Text(pDX, IDC_EDIT_Z, int_z); DDX_Control(pDX, IDC_COMBO_alpha, ComboBox_alpha); DDX_Control(pDX, IDC_EDIT_hax, Edit_hax); DDX_Control(pDX, IDC_EDIT_cx, Edit_cx); DDX_Text(pDX, IDC_EDIT_hax, d_hax); DDX_Text(pDX, IDC_EDIT_cx, d_cx); DDX_Text(pDX, IDC_EDIT_x, d_x); DDX_Text(pDX, IDC_EDIT_b, d_b); DDX_Control(pDX, IDC_RADIO_hc1, Radio_hc1); DDX_Control(pDX, IDC_SPIN_Z, spin_z); DDX_Control(pDX, IDC_SPIN_B, spin_b); DDX_Text(pDX, IDC_EDIT_M3, d_m3); DDX_Control(pDX, IDC_BUTTON_UPDATE, Button_update); DDX_Control(pDX, IDC_BUTTON_Act, Button_act); }

BEGIN_MESSAGE_MAP(DlgGear, CDialog) ON_BN_CLICKED(IDC_RADIO_M1, &DlgGear::OnBnClickedRadioM1) ON_BN_CLICKED(ID_Build, &DlgGear::OnBnClickedBuild) ON_BN_CLICKED(IDCANCEL, &DlgGear::OnBnClickedCancel) ON_BN_CLICKED(IDC_BUTTON_Act, &DlgGear::OnBnClickedButtonAct) ON_BN_CLICKED(IDC_RADIO_M2, &DlgGear::OnBnClickedRadioM2) ON_BN_CLICKED(IDC_RADIO_M3, &DlgGear::OnBnClickedRadioM3) ON_BN_CLICKED(IDC_RADIO_hc1, &DlgGear::OnBnClickedRadiohc1) ON_BN_CLICKED(IDC_RADIO_hc2, &DlgGear::OnBnClickedRadiohc2) ON_BN_CLICKED(IDC_RADIO_hc3, &DlgGear::OnBnClickedRadiohc3) ON_BN_CLICKED(IDC_BUTTON1, &DlgGear::OnBnClickedButton1) END_MESSAGE_MAP()

// DlgGear 消息处理程序

CString cy_gearfilename=L"GBGear\\GearLib\\cylinder_gear.prt";

const int m1count = 18; double m1[m1count]={1,1.25,1.5,2,2.5,3,4,5,6,8,10,12,16,20,25,32,40,50};

const int m2count = 18;

27

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
double m2[m2count]={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};

const int alphacount = 5; double alpha0[alphacount]={14.5,15,20,22.5,25};

CString selffilename; BOOL DlgGear::OnInitDialog()//窗口初始化 { CDialog::OnInitDialog(); this->OnBnClickedRadioM1(); Combo_M1_int = 3; UpdateData(false); ReadM();

int_z = 21; UpdateData(false);

spin_z.SetRange(0,999); Combo_alpha_int = 2; UpdateData(false); ReadAlpha();

this->OnBnClickedRadiohc1(); ReadHaxCx();

d_x = 0; UpdateData(false);

d_b = 20; UpdateData(false);

spin_b.SetRange(0,999); GetDlgItem(IDC_STATIC_S)->SetWindowText(L"已成功启动。"); /*TCHAR szPath[MAX_PATH]; GetModuleFileName(NULL,szPath,MAX_PATH); AfxMessageBox(szPath);*///得到的是C:\.....\xtop.exe this->OnBnClickedButtonAct();//启动自动检测激活 return TRUE; // return TRUE unless you set the focus to a control } int GetIndexFromArray(double num,double ary[],int arycount) {

28

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
for (int i=0;i<arycount;i++) { if (num==ary[i]) { return i; } } return -1; }

void DlgGear::ReadM() { if (((CButton*)GetDlgItem(IDC_RADIO_M1))->GetCheck()) { UpdateData(true); d_m = m1[Combo_M1_int]; } if (((CButton*)GetDlgItem(IDC_RADIO_M2))->GetCheck()) { UpdateData(true); d_m = m2[Combo_M2_int]; } if (((CButton*)GetDlgItem(IDC_RADIO_M3))->GetCheck()) { UpdateData(true); d_m = d_m3; } } void DlgGear::ReadAlpha() { UpdateData(true); d_alpha = alpha0[Combo_alpha_int]; } void DlgGear::ReadHaxCx() { if (((CButton*)GetDlgItem(IDC_RADIO_hc1))->GetCheck()) { this->OnBnClickedRadiohc1(); } if (((CButton*)GetDlgItem(IDC_RADIO_hc2))->GetCheck()) { this->OnBnClickedRadiohc2();

29

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
} if (((CButton*)GetDlgItem(IDC_RADIO_hc3))->GetCheck()) { this->OnBnClickedRadiohc3(); } }

void ActivatePart(ProMdl current_part) { ProName pname; ProType ptype; int window_id; ProMdlNameGet(current_part,pname); ProMdlTypeGet(current_part,(ProMdlType*)&ptype); ProObjectwindowCreate(pname,ptype,&window_id); ProWindowActivate(window_id); } void ActivateCurrent() { ProMdl current_part; ProError err; err = ProMdlCurrentGet(&current_part); if (err == PRO_TK_NO_ERROR) { ActivatePart(current_part); } else AfxMessageBox(L"激活当前模型出错。"); }

void DlgGear::SetGear(ProMdl part) { int i; ProModelitem feature; ProParameter param_m; ProParameter param_z; ProParameter param_alpha; ProParameter param_hax; ProParameter param_cx; ProParameter param_x; ProParameter param_b;

30

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
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 fname[255]; //wcscpy(fname,cy_gearfilename); //err = ProMdlRetrieve(fname, PRO_MDL_PART, &part);//获得cy_gear文件名 ProMdlIdGet(part,&i); ProModelitemInit(part,i,PRO_PART,&feature); ProParameterInit(&feature, L"m", &param_m);//初始化参数 ProParameterInit(&feature, L"z", &param_z); ProParameterInit(&feature, L"alpha", &param_alpha); ProParameterInit(&feature, L"hax", &param_hax); ProParameterInit(&feature, L"cx", &param_cx); ProParameterInit(&feature, L"x", &param_x); ProParameterInit(&feature, L"b", &param_b);

ReadM();//读入m value_m.type=PRO_PARAM_DOUBLE; value_m.value.d_val=d_m;

UpdateData(true); 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();

31

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
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(true); value_x.type=PRO_PARAM_DOUBLE; value_x.value.d_val=d_x;

UpdateData(true); value_b.type=PRO_PARAM_DOUBLE; value_b.value.d_val=d_b;

err_value_m = ProParameterValueSet(&param_m,&value_m); if (err_value_m != PRO_TK_NO_ERROR) GetDlgItem(IDC_STATIC_S)->SetWindowText(L"设置m出错。"); err_value_z = ProParameterValueSet(&param_z,&value_z); if (err_value_z != PRO_TK_NO_ERROR) GetDlgItem(IDC_STATIC_S)->SetWindowText(L"设置z出错。"); err_value_alpha = ProParameterValueSet(&param_alpha,&value_alpha); if (err_value_alpha != PRO_TK_NO_ERROR) GetDlgItem(IDC_STATIC_S)->SetWindowText(L"设置alpha出错。"); err_value_hax = ProParameterValueSet(&param_hax,&value_hax); if (err_value_hax != PRO_TK_NO_ERROR) GetDlgItem(IDC_STATIC_S)->SetWindowText(L"设置hax出错。"); err_value_cx = ProParameterValueSet(&param_cx,&value_cx); if (err_value_cx != PRO_TK_NO_ERROR) GetDlgItem(IDC_STATIC_S)->SetWindowText(L"设置cx出错。"); err_value_x = ProParameterValueSet(&param_x,&value_x); if (err_value_x != PRO_TK_NO_ERROR) GetDlgItem(IDC_STATIC_S)->SetWindowText(L"设置x出错。"); err_value_b = ProParameterValueSet(&param_b,&value_b); if (err_value_b != PRO_TK_NO_ERROR) GetDlgItem(IDC_STATIC_S)->SetWindowText(L"设置b出错。");

ProSolidRegenerate((ProSolid)part, PRO_B_TRUE);//再生 ProMdlDisplay(part); ActivatePart(part); } void DlgGear::SetComboBox_M(int i)//设置m下拉框禁用启用状态 { switch (i)

32

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
{ case 1: { ((CButton*)GetDlgItem(IDC_RADIO_M1))->SetCheck(1); ((CButton*)GetDlgItem(IDC_RADIO_M2))->SetCheck(0); ((CButton*)GetDlgItem(IDC_RADIO_M3))->SetCheck(0); ComboBox_M1.EnableWindow(true); ComboBox_M2.EnableWindow(false); Edit_M3.EnableWindow(false);break; } case 2: { ((CButton*)GetDlgItem(IDC_RADIO_M1))->SetCheck(0); ((CButton*)GetDlgItem(IDC_RADIO_M2))->SetCheck(1); ((CButton*)GetDlgItem(IDC_RADIO_M3))->SetCheck(0); ComboBox_M1.EnableWindow(false); ComboBox_M2.EnableWindow(true); Edit_M3.EnableWindow(false);break; } case 3: { ((CButton*)GetDlgItem(IDC_RADIO_M1))->SetCheck(0); ((CButton*)GetDlgItem(IDC_RADIO_M2))->SetCheck(0); ((CButton*)GetDlgItem(IDC_RADIO_M3))->SetCheck(1); ComboBox_M1.EnableWindow(false); ComboBox_M2.EnableWindow(false); Edit_M3.EnableWindow(true);break; } } }

void DlgGear::OnBnClickedRadioM1() { SetComboBox_M(1); }

void DlgGear::OnBnClickedRadioM2() { SetComboBox_M(2); }

void DlgGear::OnBnClickedRadioM3()

33

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
{ SetComboBox_M(3); }

void DlgGear::OnBnClickedRadiohc1() { ((CButton*)GetDlgItem(IDC_RADIO_hc1))->SetCheck(1); ((CButton*)GetDlgItem(IDC_RADIO_hc2))->SetCheck(0); ((CButton*)GetDlgItem(IDC_RADIO_hc3))->SetCheck(0); Edit_hax.SetReadOnly(true); Edit_cx.SetReadOnly(true); ReadM(); if (d_m<1) {d_hax = 1;d_cx = 0.35;}//这两个是链接参数 else {d_hax = 1;d_cx = 0.25;} UpdateData(false); } void DlgGear::OnBnClickedRadiohc2() { ((CButton*)GetDlgItem(IDC_RADIO_hc1))->SetCheck(0); ((CButton*)GetDlgItem(IDC_RADIO_hc2))->SetCheck(1); ((CButton*)GetDlgItem(IDC_RADIO_hc3))->SetCheck(0); Edit_hax.SetReadOnly(true); Edit_cx.SetReadOnly(true); d_hax = 0.8;d_cx = 0.3; UpdateData(false); }

void DlgGear::OnBnClickedRadiohc3() { ((CButton*)GetDlgItem(IDC_RADIO_hc1))->SetCheck(0); ((CButton*)GetDlgItem(IDC_RADIO_hc2))->SetCheck(0); ((CButton*)GetDlgItem(IDC_RADIO_hc3))->SetCheck(1); Edit_hax.SetReadOnly(false); Edit_cx.SetReadOnly(false); }

void DlgGear::OnBnClickedBuild() {

34

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
ProMdl part; ProError err; wchar_t fname[255]; wcscpy(fname,cy_gearfilename); err = ProMdlRetrieve(fname, PRO_MDL_PART, &part);//载入fname文件 SetGear(part); } void DlgGear::OnBnClickedCancel()//按下关闭按钮 { int window_id; ProError err; err = ProWindowCurrentGet(&window_id); if (err == PRO_TK_NO_ERROR) ProWindowActivate(window_id); else ActivateCurrent(); OnOK(); }

void DlgGear::OnBnClickedButtonAct()//激活按钮 { ProMdl part; int i; double m,hax,cx,alpha,x,b; int z; CString s_m3,s_alpha,s_hax,s_cx,s_x,s_b; int allerr = 0; 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;

35

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
ProError err; 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;

err = ProMdlCurrentGet(&part); if (err == PRO_TK_NO_ERROR)//当前有模型 { ProMdlIdGet(part,&i); ProModelitemInit(part,i,PRO_PART,&feature); ProParameterInit(&feature, L"m", &param_m);//初始化参数 ProParameterInit(&feature, L"z", &param_z); ProParameterInit(&feature, L"alpha", &param_alpha); ProParameterInit(&feature, L"hax", &param_hax); ProParameterInit(&feature, L"cx", &param_cx); ProParameterInit(&feature, L"x", &param_x); ProParameterInit(&feature, L"b", &param_b); err_value_m = ProParameterValueGet(&param_m,&value_m); err_value_z = ProParameterValueGet(&param_z,&value_z); err_value_alpha = ProParameterValueGet(&param_alpha,&value_alpha); err_value_hax = ProParameterValueGet(&param_hax,&value_hax); err_value_cx = ProParameterValueGet(&param_cx,&value_cx); err_value_x = ProParameterValueGet(&param_x,&value_x); err_value_b = ProParameterValueGet(&param_b,&value_b);

if (err_value_m==PRO_TK_NO_ERROR) { int mindex; m=value_m.value.d_val;

//检查是否为第一系列 if ((mindex = GetIndexFromArray(m,m1,m1count))!=-1) { this->OnBnClickedRadioM1(); UpdateData(false); Combo_M1_int = mindex; } else

36

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
if ((mindex = GetIndexFromArray(m,m2,m2count))!=-1) { this->OnBnClickedRadioM2(); UpdateData(false); Combo_M2_int = mindex; } else { this->OnBnClickedRadioM3(); s_m3.Format(L"%f",m); SetDlgItemTextW(IDC_EDIT_M3,s_m3); } d_m = m; } else allerr = 1;//载入m结束

if (err_value_z==PRO_TK_NO_ERROR) { if (value_z.type == PRO_PARAM_INTEGER) z = value_z.value.i_val; if (value_z.type == PRO_PARAM_DOUBLE) z = (int)value_z.value.d_val; UpdateData(false); int_z = z; } else allerr = 2;//载入z结束

if (err_value_alpha==PRO_TK_NO_ERROR)//载入alpha { int afound; alpha=value_alpha.value.d_val; if ((afound = GetIndexFromArray(alpha,alpha0,alphacount))!=-1) { Combo_alpha_int = afound; UpdateData(false); } else { s_alpha.Format(L"%f",alpha); SetDlgItemText(IDC_COMBO_alpha,s_alpha);

37

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
} d_alpha = alpha; } else allerr = 3;//载入alpha结束

if ((err_value_hax==PRO_TK_NO_ERROR)&&(err_value_cx==PRO_TK_NO_ERROR))//载入 hax和cx { int sd_hc=3; hax=value_hax.value.d_val; cx=value_cx.value.d_val; if (hax == 1) if (((d_m<1)&&(cx==0.35))||((d_m>=1)&&(cx==0.25))) sd_hc = 1; if ((hax==0.8)&&(cx==0.3)) sd_hc = 2; switch (sd_hc) { case 1:this->OnBnClickedRadiohc1();break; case 2:this->OnBnClickedRadiohc2();break; case 3:this->OnBnClickedRadiohc3();break; } d_hax = hax; d_cx = cx; } else allerr = 4;//载入hax和cx结束

if (err_value_x==PRO_TK_NO_ERROR)//载入x { x=value_x.value.d_val; d_x = x; } else allerr = 6;

if (err_value_b==PRO_TK_NO_ERROR)//载入b { b=value_b.value.d_val; d_b = b; UpdateData(false);

38

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班
} else allerr = 7;

switch (allerr) { case 0: Button_update.EnableWindow(true); //CString hmsg; wchar_t hmsg[255]; wchar_t wpname[100]; ProMdlNameGet(part,wpname); wcscat(hmsg,L"已激活当前的齿轮"); wcscat(hmsg,wpname); wcscat(hmsg,L"。"); //AfxMessageBox(hmsg); GetDlgItem(IDC_STATIC_S)->SetWindowText(L"已激活当前的齿轮。"); //Button_act.EnableWindow(false);//激活按钮禁用 break; case 1:GetDlgItem(IDC_STATIC_S)->SetWindowText(L"读取m出错。");break; case 2:GetDlgItem(IDC_STATIC_S)->SetWindowText(L"读取z出错。");break; case 3:GetDlgItem(IDC_STATIC_S)->SetWindowText(L"读取alpha出错。");break; case 4:GetDlgItem(IDC_STATIC_S)->SetWindowText(L"读取hax出错。");break; case 5:GetDlgItem(IDC_STATIC_S)->SetWindowText(L"读取cx出错。");break; case 6:GetDlgItem(IDC_STATIC_S)->SetWindowText(L"读取x出错。");break; case 7:GetDlgItem(IDC_STATIC_S)->SetWindowText(L"读取b出错。");break; } } else { Button_update.EnableWindow(false); GetDlgItem(IDC_STATIC_S)->SetWindowText(L"未检测到打开的齿轮。"); //Button_act.EnableWindow(false);//激活按钮启用 } }

void DlgGear::OnBnClickedButton1() { ProMdl current_part; ProMdlCurrentGet(&current_part); SetGear(current_part); }

39

基于 PROE 二次开发的齿轮参数化设计系统 09 机械 12,13 班

参考文献
[1] 袖珍天使 PROE_program(程序) http://bbs.icax.org/viewthread.php?tid=223698&extra=&highlight=PROE%2FPROGRAM %B3%CC%D0%FF2%C9%E8%BC%C6%C8%AB%BD%E2%%CE%F6&page=1 [2] 二代龙震工作室.Pro/Toolkit Wildfire 2.0 插件设计[M].北京:电子工业出版 社,2005 [3] 王伟 ProE 野火版 TOOLKIT 二次开发入门与进阶 [4] 孙光华.Pro/TOOLKIT 应用举例——齿轮三维参数化设计,2010.7.19

40


相关文章:
基于ProE的齿轮参数化设计系统开发
基于Proe的齿轮参数化设... 5页 10财富值如要投诉违规内容,请到百度文库投诉...2 Pro/E 系统二次开发技术---6 3. ...
proe二次开发 标准件库 齿轮参数化设计 毕业设计
毕业设计-Proe参数化齿轮... 36页 2下载券 基于Proe二次开发齿轮参... 7页...(1)参数化技术 正当实体造型技术在 CAD 系统中广泛运用时,出现了一种比无约束...
基于ProE二次开发齿轮参数化模型库
基于Pro/E 二次开发齿轮参数化模型库 作者:吴卓-来源:icad 本文介绍了 Pro/Engineer 参数化设计的基本原理和基于 Pro/Program 二次开发实现参数化建库的 方法,...
proe二次开发标准件库齿轮参数化设计模型库毕业设计
proe二次开发标准件库齿轮参数化设计模型库毕业设计_工学_高等教育_教育专区。...3 基于 Pro/E Wildfire 建立常用件参数化模型库 +申请认证 文档贡献者 赵鑫 ...
基于ProE二次开发齿轮参数化模型库
基于ProE二次开发齿轮参数化模型库 PROE齿轮设计PROE齿轮设计隐藏>> 分享到: X 分享到: 使用一键分享,轻松赚取财富值, 了解详情 嵌入播放器: 普通尺寸(450*...
基于ProE二次开发的直齿圆柱齿轮二级减速器参数化设计
基于Pro/E 二次开发的 直齿圆柱齿轮二级减速器参 数化设计 I 摘要 基于 Pro/E 的参数化建模及单一数据库技术,建立了齿轮、轴、箱体及减速器传 动系统的参数...
基于ProE二次开发平台的旋涡泵叶轮参数化模型设计
基于ProE二次开发平台的旋涡泵叶轮参数化模型设计_计算机硬件及网络_IT/计算机_专业资料。基于 Pro/E 二次开发平台的旋涡泵叶轮参数化模型设计 摘要:叶轮是旋涡泵的...
基于PROE平台行星齿轮系统组件参数化设计
基于PROE 平台行星齿轮系统参数化设计及功能仿真摘要:基于 PROE 装配环境下,利用模型组件参数化技术,通过 VC++与 PRO/TOOLKIT 对 PROE 进行二次开发实现行星轮的...
基于ProE二次开发齿轮
基于ProE二次开发齿轮_机械/仪表_工程科技_专业资料。proE二次开发中的齿轮实例...齿轮实体造型的自动化设计程序, 用户只要输入齿轮的设计 参数(齿数 z1、z2,...
PROE齿轮的参数化设计
PROE 齿轮的参数化设计各类三维软件之中, 最早实现全参数化建模的是 PROE, 下面简单分享下 如何利用 PROE参数化设计齿轮: 齿轮的分类很多,比如,按照外形可分...
更多相关标签:
proe齿轮参数化设计 | proe参数化设计教程 | proe参数化设计 | catia齿轮参数化设计 | proe5.0参数化设计 | proe参数化设计高级 | proe二次开发 | proe二次开发论坛 |