一、实现功能
在组件下打开零部件的同名工程图,如无同名工程图则新建工程图。如选择的文件为组件则插入材料明细表。
二、新建命令
1、命令图标可不添加。
2、图标存放位置:D:\Program Files\PTC\Creo 7.0.7.0\Common Files\text\resource(根据CREO安装位置下修改)。
extern "C" int user_initialize()
{
ProError status;
uiCmdCmdId cmd_drw;
ProFileName MsgFile;
ProStringToWstring(MsgFile, "Message.txt");
status = ProCmdActionAdd("cmd_create_drw", (uiCmdCmdActFn)Draw, uiCmdPrioDefault, AccessDefault, PRO_B_TRUE, PRO_B_TRUE, &cmd_drw);
status = ProCmdIconSet(cmd_drw, "auto_drawing_large.png");//命令图标,32*32或16*16像素
status = ProCmdDesignate(cmd_drw, "createdrw", "open or creat drw", "open or creat drw", MsgFile);
return status;
}
三、程序主体
1、选择零部件
可使用ProSelect或ProSelbufferSelectionsGet获取选择的零部件。
ProError status;
ProSelection* sels;
int nb_sel;
status = ProSelect("prt_or_asm", 10, NULL, NULL, NULL, NULL, &sels, &nb_sel);
if (status != PRO_TK_NO_ERROR)
{
return(status);
}
2、尝试打开工程图
ProMdlFiletypeLoad仅将工程图读取到内存中,并不打开窗口。可通过ProObjectwindowMdlnameCreate创建窗口。
status = ProSelectionModelitemGet(sels[i], &asmcomp);
ProMdl Model = asmcomp.owner;
ProMdl Drw_model;
ProMdldata mdldata;
ProMdlDataGet(Model, &mdldata);
ProMdlDirectoryPathGet(Model, path);//获取零部件路径
ProWstringConcatenate(mdldata.name, path, PRO_VALUE_UNUSED);
ProWstringConcatenate(_T(".drw"), path, PRO_VALUE_UNUSED);
status = ProMdlFiletypeLoad(path, PRO_MDLFILE_UNUSED, PRO_B_FALSE, &Drw_model);//读取工程图
3、新建工程图
ProMdlFiletypeLoad返回错误是就需新建工程图。ProDrawingFromTmpltCreate可根据模板创建新的工程图。
ProError status;
ProModel Model;
ProPath template_path = _T("...");//模板文件位置
ProMdlMdlnameGet(asmcomp.owner, Model.name);
ProMdlExtensionGet(asmcomp.owner, Model.type);
ProDrawing draw;
ProDwgcreateErrs err;
status = ProDrawingFromTmpltCreate(Model.name, template_path, &Model, PRODWGCREATE_DISPLAY_DRAWING, &draw, &err);//根据模板建立工程图
if (status != PRO_TK_NO_ERROR)
{
AfxMessageBox(_T("图纸生成失败!"));
return(status);
}
4、插入材料明细表
当选择的为组件是则需插入材料明细表。
if (asmcomp.type == PRO_ASSEMBLY)
{
ProDwgtable table;
ProPoint3d point = { 559.52,213.54,0 };//插入坐标位置
status = ProDwgtableByOriginRetrieve(draw, _T("表名称"), _T("表存放位置"), 0, point, (ProSolid)asmcomp.owner, NULL, &table);//插入材料明细表,
if (status != PRO_TK_NO_ERROR)
{
AfxMessageBox(_T("表格插入失败!"));
return(status);
}
}