钻模参数化设计示例.docx
《钻模参数化设计示例.docx》由会员分享,可在线阅读,更多相关《钻模参数化设计示例.docx(21页珍藏版)》请在冰豆网上搜索。
钻模参数化设计示例
ProToolKit+ADO模式的钻模三维参数化设计(示例)
孙光华2011.2.16
软件开发环境:
pro/E4.0+vs2005+SQLServer2000
设计目标:
根据工件钻孔直径,设计相应的钻模(仅为示例)。
钻模参数化设计程序开发完成后的Pro/E工作界面:
主菜单
对话框
参数输入对话框界面钻模板参数修改对话框界面
设计步骤
1.建立pro/E的模型文件
建立两个pro/E零件,一个是固定钻套zuantao.prt,另一个是钻模板zuanmoban.prt,将它们装配成组件asm0001.asm,并保存在某文件夹下。
(因为是示例,这三个文件就代表某套钻模的所有模型文件。
)
钻套钻模板钻模组件
为固定钻套设置4个参数,分别是:
钻套孔径Dhole,外径Doutter,肩径Dshoulder和钻套长度H。
为钻模板设置3个参数,分别是:
孔径Dhole,孔中心到底边距离L和钻模板厚度H。
2.建立工程数据库和固定钻套数据表
使用SQLServer2000建立一个“Engineering”数据库,并在其中建立一个“固定钻套”数据表,表结构为:
并输入以下数据:
以上数据根据“国家标准JB/T8045.1-1999固定钻套”而确定。
下面是“国家标准JB/T8045.1-1999固定钻套”摘录。
……
3.Vs2005配置
启动vs2005。
在“项目和解决方案”中选择“VC++目录”,在“显示以下内容的目录”中选择“包含文件”,加入以下文件(其中,D:
是pro/E的安装盘符):
D:
\proeWildfire4.0\protoolkit\includes
D:
\proeWildfire4.0\protoolkit\protk_appls\includes
D:
\proeWildfire4.0\prodevelop\includes
在“显示以下内容的目录”中选择“库文件”,加入以下文件:
D:
\proeWildfire4.0\protoolkit\i486_nt\obj
D:
\proeWildfire4.0\prodevelop\i486_nt\obj
(注:
请认真检查pro/E的安装目录(路径名)。
在以上配置中,输入路径名时不能有空格,比如在以上设置中输入“D:
\ProgramFiles\proeWildfire4.0”是不对的,要把路径中的空格去掉,如“D:
\proeWildfire4.0”。
如果已经按默认设置安装了pro/E(此时安装目录中是有空格的),则必须用D:
\Progra~1\proeWi~1.0输入。
)
(以上工作仅做一次。
)
4.建立新项目,并做项目配置
在vs2005中,建立一个新项目,使用MFCDLL模板,项目名称为ZuanMo。
vs2005会自动建立名为ZuanMo的文件夹。
配置以下三个项目属性:
(1)常规——字符集,将其中的默认“使用Unicode字符集”改为“使用多字节字符集”
(2)C/C++——预处理器,在“预处理器定义”里加入:
PRO_USE_VAR_ARGS
(3)连接器——输入,在“附加依赖项”里加入:
wsock32.lib
mpr.lib
psapi.lib
protk_dllmd.lib
(如果新建项目,则项目属性配置必须每次都做一遍。
)
5.建立信息和菜单文件
在项目所在目录下,建立一个text目录:
在text目录下,新建一个信息文本文件,取名为msg.txt,文件内容为:
MyHello
&
欢迎使用基于pro/Toolkit的机床夹具三维参数化设计系统!
#
MyBye
&
再见!
#
在text目录下,再新建一个菜单文本文件,取名为menu.txt,文件内容为:
m_zuanmo
&
钻模设计
#
b_para
&
工件参数输入
#
paratip
&
输入工件的孔径等参数
#
b_zuanmoban
&
钻模板
#
zuanmobantip
&
修改钻模板参数
#
6.源代码输入
在ZuanMo.cpp文件中,输入以下代码(删除所有已有代码):
//ZuanMo.cpp:
定义DLL的初始化例程。
#include"stdafx.h"
#include"ZuanMo.h"
#include"dlg_para.h"
#include"dlg_zuanmoban.h"
#include//包含pro/Toolkit必要的头文件
#include
#include
#include
#include
ProFileNamemsgfil;//定义文件类型的变量,用于显示消息
//这三个函数的定义在后面,此处仅说明函数原型
voidMyDLG();
voidMyDLGZuanMoBan();
staticuiCmdAccessStateUserAccessTestMenu(uiCmdAccessMode);
//初始化函数,此函数将在启动钻模设计辅助应用程序时被调用执行
extern"C"intuser_initialize(){
AfxEnableControlContainer();
ProErrorstatus;
ProNamemenumsgfile;//定义名称类型的变量,用于生成菜单
uiCmdCmdIdcmd_id;//定义菜单项标识类型的变量
//在pro/E的主菜单栏上添加一个新的菜单
ProStringToWstring(menumsgfile,"menu.txt");
status=ProMenubarMenuAdd("zuanmo","m_zuanmo","Help",PRO_B_FALSE,menumsgfile);
//添加新菜单下的第一个菜单项
status=ProCmdActionAdd("MyDLG",(uiCmdCmdActFn)MyDLG,uiCmdPrioDefault,UserAccessTestMenu,PRO_B_TRUE,PRO_B_TRUE,&cmd_id);
//先指定回调函数,即点击此菜单后要执行什么动作(本菜单项的功能是打开工件参数输入对话框)
status=ProMenubarmenuPushbuttonAdd("zuanmo","para","b_para","paratip",NULL,PRO_B_TRUE,cmd_id,menumsgfile);
//然后才添加菜单项
//再添加第二个菜单项
status=ProCmdActionAdd("MyDLGZuanMoBan",(uiCmdCmdActFn)MyDLGZuanMoBan,uiCmdPrioDefault,UserAccessTestMenu,PRO_B_TRUE,PRO_B_TRUE,&cmd_id);
status=ProMenubarmenuPushbuttonAdd("zuanmo","zuanmoban","b_zuanmoban","zuanmobantip","para",PRO_B_TRUE,cmd_id,menumsgfile);
//在pro/E的消息区显示消息
ProStringToWstring(msgfil,"msg.txt");
ProMessageDisplay(msgfil,"MyHello");
return(0);
}
//菜单可访问性(此函数的定义一般不需修改!
)
staticuiCmdAccessStateUserAccessTestMenu(uiCmdAccessModeaccess_mode)
{
return(ACCESS_AVAILABLE);
}
voidMyDLG()//自定义的第一个菜单项的菜单回调函数
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
dlg_paradlg_para;//先定义一个对话框类对象
dlg_para.DoModal();//以模态方式打开工件尺寸参数输入对话框(其中内容视对话框类的名称而变)
}
voidMyDLGZuanMoBan()//自定义的第二个菜单项的菜单回调函数
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
dlg_zuanmobandlg_zuanmoban;
dlg_zuanmoban.DoModal();//打开钻模板参数设置对话框
}
//结束函数,此函数将在停止钻模设计辅助应用程序时被调用执行
extern"C"voiduser_terminate()
{
ProMessageDisplay(msgfil,"MyBye");//在pro/E的消息区显示消息
return;
}
(函数用法可参见帮助文档:
D:
\proeWildfire4.0\protoolkit\protkdoc\index.html)
7.加入工件参数输入对话框
事先做好下面这幅图,并保存成位图(BMP)格式的文件:
添加一个位图资源(使用“添加资源”对话框中的“导入”按钮,导入位图):
添加一个对话框资源:
在上面的原始对话框中,添加静态文本控件(StaticText)、编辑控件(EditControl)和图片控件(PictureControl),并将对话框界面修改成以下布局(图片控件的Type属性设为“Bitmap”,Image属性右边下拉列表中选“IDB_BITMAP1”):
8.为工件参数输入对话框添加类并为编辑控件关联成员变量
在对话框空白处点击鼠标右键,在弹出的快捷菜单中选择“添加类”,类名称为dlg_para。
选中编辑控件,点击鼠标右键,在弹出的快捷菜单中选择“添加变量”,为IDC_EDIT1添加一个double类型的变量,变量名取为m_DHole。
这个成员变量的初始值为零,下面改变初始值。
打开dlg_para.cpp源程序文件,找到如下代码段:
dlg_para:
:
dlg_para(CWnd*pParent/*=NULL*/)
:
CDialog(dlg_para:
:
IDD,pParent)
m_DHole(0)
{
}
将其中的m_DHole(0)改为m_DHole(D_HOLE),其中D_HOLE变量的声明在第10步。
9.为“确定”按钮添加消息处理代码
回到对话框设计界面,双击“确定”按钮,会出现以下程序段(这是“确定”按钮的单击事件过程代码):
//dlg消息处理程序
voiddlg_para:
:
OnBnClickedOk()
{
//TODO:
在此添加控件通知处理程序代码
OnOK();
}
将其中的两行代码删除,并用以下的程序段替换:
voiddlg_para:
:
OnBnClickedOk()//OK按钮处理程序
{
UpdateData(true);//将编辑框中的数据(工件孔径)传送到关联变量m_DHole
//根据SQL语句生成记录集
m_pRecordset.CreateInstance(__uuidof(Recordset));
_variant_tRecordsAffected;
CStringvSQL;
vSQL.Format("SELECT*FROM固定钻套WHERE孔径大于<'%f'and孔径到>='%f'",m_DHole,m_DHole);
m_pRecordset=m_pConnection->Execute(_bstr_t(vSQL),&RecordsAffected,adCmdText);
if((m_pRecordset->adoBOF)&&(m_pRecordset->adoEOF))
{
AfxMessageBox("没有满足条件的记录!
");
m_pRecordset->Close();
return;
}
//从记录集获取相应的值,并赋给变量
//while(!
m_pRecordset->adoEOF)//如果要处理多条记录,则可用循环语句
//{//目前记录集中只会有一条记录
//doubled;//存钻套孔径
CStringD,D1,H;//存钻套外径,肩径及长度。
暂时全部设为串类型,后面再进行转换
_variant_tvFieldValue;
D_HOLE=m_DHole;//直接取用文本框中所输入的钻孔直径(关联变量的值)
vFieldValue=m_pRecordset->GetCollect("D");//获取钻套外径
D=(char*)_bstr_t(vFieldValue);//赋给变量
vFieldValue=m_pRecordset->GetCollect("D1");//获取钻套肩径
D1=(char*)_bstr_t(vFieldValue);//赋给变量
vFieldValue=m_pRecordset->GetCollect("H1");//获取钻套长度
H=(char*)_bstr_t(vFieldValue);//赋给变量
//m_pRecordset->MoveNext();//将记录指针移到下一条记录
//}
//声明变量
ProMdlmodel;//模型
ProFamilyNamepartname;//零件模型文件名
intnWindowID;//窗口标识
ProModelitemfeature;//特征
ProParameterparam1,param2,param3,param4;//参数(变量个数应以所有模型中参数最多的为准)
ProParamvaluevalue1,value2,value3,value4;//参数值(同上)
//打开钻套模型
ProStringToWstring(partname,"zuantao.prt");
ProMdlRetrieve(partname,PRO_MDL_PART,&model);//提取工作目录中的零件模型
ProMdlDisplay(model);//显示模型
ProMdlWindowGet(model,&nWindowID);//获取模型窗口标识符
ProWindowActivate(nWindowID);//激活模型窗口
//初始化钻套参数
inti;
ProMdlIdGet(model,&i);
ProModelitemInit(model,i,PRO_PART,&feature);
ProParameterInit(&feature,L"Dhole",¶m1);//这些参数在零件模型中应提前设置好
ProParameterInit(&feature,L"Doutter",¶m2);
ProParameterInit(&feature,L"Dshoulder",¶m3);
ProParameterInit(&feature,L"H",¶m4);
//为钻套参数赋新值(一定要对应上面个参数的顺序)
value1.type=PRO_PARAM_DOUBLE;//在pro/E中,所有的参数都是实数类型
value1.value.d_val=D_HOLE;//钻套孔径即为工件钻孔直径
ProParameterValueSet(¶m1,&value1);//设置新的参数值
value2.type=PRO_PARAM_DOUBLE;
value2.value.d_val=atof(D);//钻套外径,atof函数将串类型转换成实数类型
ProParameterValueSet(¶m2,&value2);
value3.type=PRO_PARAM_DOUBLE;
value3.value.d_val=atof(D1);//钻套肩径
ProParameterValueSet(¶m3,&value3);
value4.type=PRO_PARAM_DOUBLE;
value4.value.d_val=atof(H);//钻套长度
ProParameterValueSet(¶m4,&value4);
ProSolidRegenerate((ProSolid)model,PRO_B_TRUE);//再生模型
//ProMdlSave(model);//保存模型
//////////////////////////以上钻套处理完毕////////////////////////
//打开钻模板
ProStringToWstring(partname,"zuanmoban.prt");
ProMdlRetrieve(partname,PRO_MDL_PART,&model);
ProMdlDisplay(model);
ProMdlWindowGet(model,&nWindowID);
ProWindowActivate(nWindowID);
//初始化钻模板参数
ProMdlIdGet(model,&i);
ProModelitemInit(model,i,PRO_PART,&feature);
ProParameterInit(&feature,L"Dhole",¶m1);
ProParameterInit(&feature,L"L",¶m2);
ProParameterInit(&feature,L"H",¶m3);
//为钻模板的参数赋新值
value1.type=PRO_PARAM_DOUBLE;
value1.value.d_val=atof(D);//钻模板孔径等于钻套外径
ProParameterValueSet(¶m1,&value1);
value2.type=PRO_PARAM_DOUBLE;
value2.value.d_val=88;//目前任意(应根据情况而定)
ProParameterValueSet(¶m2,&value2);
value3.type=PRO_PARAM_DOUBLE;
value3.value.d_val=atof(H);//钻模板厚度等于钻套长度
ProParameterValueSet(¶m3,&value3);
ProSolidRegenerate((ProSolid)model,PRO_B_TRUE);
//ProMdlSave(model);//保存模型
//////////////////////////以上钻模板处理完毕////////////////////////
//打开装配文件
ProMdlRetrieve(L"asm0001.asm",PRO_MDL_ASSEMBLY,&model);
ProMdlDisplay(model);
ProSolidRegenerate((ProSolid)model,PRO_B_TRUE);//一定要再生装配模型
OnOK();//关闭对话框
}
10.为dlg_para.cpp源程序添加必要的头文件、添加ADO类支持和相关变量
将以下代码复制到dlg_para.cpp文件头部:
#include"stdafx.h"
#include"ZuanMo.h"//包含主头文件(这两行顺序不可调换!
)
#include"dlg_para.h"//包含对话框头文件
#include//包含pro/Toolkit必要的头文件
#include
#include
#include"ProParameter.h"
#include"ProSolid.h"
#include"ProMdl.h"
#include"ProModelItem.h"
#include"ProUIInputpanel.h"
#include
#import"c:
\programfiles\commonfiles\system\ado\msado15.dll"no_namespacerename("EOF","adoEOF")rename("BOF","adoBOF")
//上面一行导入ADO相关的类声明
staticdoubleD_HOLE=18;//静态变量,存对话框中输入的工件钻孔直径
_ConnectionPtrm_pConnection;//定义数据库连接对象
_RecordsetPtrm_pRecordset;//定义记录集对象
11.为dlg_para类重载OnInitDialog()函数
在类视图下,选中dlg_para类,在属性面板中点击“重写”按钮,在下方找到OnInitDialog,选择右边的“添加OnInitDialog”:
此时代码窗口中会显示以下内容:
BOOLdlg_para:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//TODO:
在此添加额外的初始化
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
//异常:
OCX属性页应返回FALSE
}
这个函数在对话框显示之前被调用执行。
添加代码到“returnTRUE;”这一行的上方,添加后的代码为:
BOOLdlg_para:
:
OnInitDialog()//重载的对话框初始化函数
{
CDialog:
:
OnInitDialog();
//TODO:
在此添加额外的初始化
/////////////////连接数据库//////////////////////
:
:
CoInitialize(NULL);
HRESULThr;
try
{
hr=m_pConnection.CreateInstance(__uuidof(Connection));
if(SUCCEEDED(hr))
{
m_pConnection->ConnectionString="Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;PersistSecurityInfo=False;InitialCatalog=Engineering;DataSource=PC-2010