|
附上程序:
#include "stdafx.h"
#include " TKHeaders.h"
// 函数声明
uiCmdAccessState Sample08_Access(uiCmdAccessMode access_mode);
int TestAssembly001(uiCmdCmdId command,
uiCmdValue *p_value,
void *p_push_command_data);
int TestAssembly002(uiCmdCmdId command,
uiCmdValue *p_value,
void *p_push_command_data);
// Pro/TOOLKIT初始化函数
extern "C" int user_initialize()
{
ProError err;
// 信息文件名称
ProFamilyName MsgFile;
ProStringToWstring(MsgFile, "Test_Msg.txt");
// 添加菜单:TestMenu
err = ProMenubarMenuAdd("TestMenu", "TestMenu", "Help", PRO_B_TRUE, MsgFile);
//-------------------------------------------
// 添加命令和菜单项
//-------------------------------------------
// 1.测试组装01
uiCmdCmdId cmd_id1;
err = ProCmdActionAdd("TestAssembly001", TestAssembly001, uiCmdPrioDefault, Sample08_Access,
PRO_B_FALSE, PRO_B_FALSE, &cmd_id1);
err = ProMenubarmenuPushbuttonAdd("TestMenu", "TestAssembly001", "TestAssembly001", "TestAssembly001_Help",
NULL, PRO_B_TRUE, cmd_id1, MsgFile);
// 2.测试组装02
uiCmdCmdId cmd_id2;
err = ProCmdActionAdd("TestAssembly002", TestAssembly002, uiCmdPrioDefault, Sample08_Access,
PRO_B_FALSE, PRO_B_FALSE, &cmd_id2);
err = ProMenubarmenuPushbuttonAdd("TestMenu", "TestAssembly002", "TestAssembly002", "TestAssembly002_Help",
NULL, PRO_B_TRUE, cmd_id2, MsgFile);
return 0;
}
// Pro/TOOLKIT结束时调用的函数
extern "C" void user_terminate()
{
}
ProError UserAssembleByDatums(ProAssembly asm_model,
ProSolid comp_model)
{
ProError err;
ProMatrix identity_matrix = {
{ 1.0, 0.0, 0.0, 0.0 },
{ 0.0, 1.0, 0.0, 0.0 },
{ 0.0, 0.0, 1.0, 0.0 },
{ 0.0, 0.0, 0.0, 1.0 } };
ProAsmcomp asmcomp;
ProAsmcompconstraint* constraints;
ProAsmcompconstraint constraint;
ProBoolean interact_flag = PRO_B_FALSE;
ProModelitem asm_datum, comp_datum;
ProSelection asm_sel, comp_sel;
ProAsmcomppath comp_path;
ProIdTable c_id_table;
c_id_table [0] = -1;
// 参考特征名称
ProName asm_datums[3];
ProName comp_datums[3];
ProStringToWstring(asm_datums[0], "ASM_FRONT");
ProStringToWstring(asm_datums[1], "ASM_TOP");
ProStringToWstring(asm_datums[2], "ASM_RIGHT");
ProStringToWstring(comp_datums[0], "FRONT");
ProStringToWstring(comp_datums[1], "TOP");
ProStringToWstring(comp_datums[2], "RIGHT");
// 组装
ProAsmcompAssemble(asm_model, comp_model, identity_matrix, &asmcomp);
// 添加约束
ProArrayAlloc(0, sizeof(ProAsmcompconstraint), 1, (ProArray*)&constraints);
for (int i = 0; i < 3; i++)
{
err = ProModelitemByNameInit(asm_model, PRO_SURFACE, asm_datums[i], &asm_datum);
if (err != PRO_TK_NO_ERROR)
{
interact_flag = PRO_B_TRUE;
continue;
}
err = ProModelitemByNameInit(comp_model, PRO_SURFACE, comp_datums[i], &comp_datum);
if (err != PRO_TK_NO_ERROR)
{
interact_flag = PRO_B_TRUE;
continue;
}
// 元件路径
err = ProAsmcomppathInit(asm_model, c_id_table, 0, &comp_path);
// 参考
err = ProSelectionAlloc(&comp_path, &asm_datum, &asm_sel);
err = ProSelectionAlloc(NULL, &comp_datum, &comp_sel);
// 约束
err = ProAsmcompconstraintAlloc(&constraint);
err = ProAsmcompconstraintTypeSet(constraint, PRO_ASM_ALIGN);
err = ProAsmcompconstraintAsmreferenceSet(constraint, asm_sel, PRO_DATUM_SIDE_YELLOW);
err = ProAsmcompconstraintCompreferenceSet(constraint, comp_sel, PRO_DATUM_SIDE_YELLOW);
err = ProArrayObjectAdd((ProArray*)&constraints, -1, 1, &constraint);
}
// 设置元件特征的约束
err = ProAsmcompConstraintsSet(NULL, &asmcomp, constraints);
// 重生
ProSolidRegenerate((ProSolid)asmcomp.owner, PRO_REGEN_CAN_FIX);
if (interact_flag)
{
ProAsmcompConstrRedefUI(&asmcomp);
}
// 释放数组空间
ProArrayFree((ProArray*)&constraints);
return PRO_TK_NO_ERROR;
}
//测试组装
int TestAssembly001(uiCmdCmdId command,
uiCmdValue *p_value,
void *p_push_command_data)
{
/*AFX_MANAGE_STATE(AfxGetStaticModuleState());*/
ProError err;
ProMdl mdlAsm,mdlComp;
ProName name1,name2;
int AssemblyWindowID; //当前组件环境的窗口ID
ProStringToWstring(name1,"F:\webshili\protk_sample_08\res\asm0001.asm");
err =ProMdlLoad(name1,PRO_MDL_ASSEMBLY,PRO_B_FALSE,&mdlAsm);
if (PRO_TK_E_NOT_FOUND == err)
{
MessageBoxW(NULL, L"未打开ASM0001.ASM", L"www.icaxdev.com", MB_OK);
return -1;
}
ProMdlWindowGet(mdlAsm,&AssemblyWindowID); //得到装配容器assembly的窗口ID值
ProStringToWstring(name2,"F:\webshili\protk_sample_08\res\prt0001.prt");
err =ProMdlLoad(name2,PRO_MDL_ASSEMBLY,PRO_B_FALSE,&mdlComp);
if (PRO_TK_E_NOT_FOUND == err)
{
MessageBoxW(NULL, L"未打开PRT0001.PRT", L"www.icaxdev.com", MB_OK);
return -1;
}
UserAssembleByDatums((ProAssembly)mdlAsm, (ProSolid)mdlComp);
err=ProMdlDisplay(mdlAsm); //显示装配的结果
err=ProWindowCurrentGet(&AssemblyWindowID);
err=ProWindowActivate(AssemblyWindowID); //激活当前窗口
//ProWindowRepaint(-1);
//ProTreetoolRefresh(&mdlAsm);
return 0;
}
ProError UserAssembly002(ProAssembly asm_model,
ProSolid comp_model_a,
ProSolid comp_model_b)
{
ProError err;
ProMatrix identity_matrix = {
{ 1.0, 0.0, 0.0, 0.0 },
{ 0.0, 1.0, 0.0, 0.0 },
{ 0.0, 0.0, 1.0, 0.0 },
{ 0.0, 0.0, 0.0, 1.0 } };
ProAsmcomppath comp_path;
ProIdTable c_id_table;
c_id_table[0] = -1;
//--------------------------------------------------------
// 将A.PRT组装到TEST.ASM下
// 通过坐标系组装 1)坐标系:ACS0(TEST.ASM) <> 坐标系 RT_CSYS_DEF(A.PRT)
// (2)坐标系:ACS1(TEST.ASM) <> 坐标系 RT_CSYS_DEF(A.PRT)
// TEST.ASM
// |__A.PRT
// |__A.PRT
//--------------------------------------------------------
ProAsmcomp asmcomp_a[2];
ProName asmCsysName[2];
ProStringToWstring(asmCsysName[0], "ACS0");
ProStringToWstring(asmCsysName[1], "ACS1");
for (int i = 0; i < 2; ++i)
{
ProModelitem asmCsys;
err = ProModelitemByNameInit(asm_model, PRO_CSYS, asmCsysName[i], &asmCsys);
if (err != PRO_TK_NO_ERROR)
{
return PRO_TK_GENERAL_ERROR;
}
ProModelitem compCsys;
err = ProModelitemByNameInit(comp_model_a, PRO_CSYS, L" RT_CSYS_DEF", &compCsys);
if (err != PRO_TK_NO_ERROR)
{
return PRO_TK_GENERAL_ERROR;
}
// 元件路径
err = ProAsmcomppathInit(asm_model, c_id_table, 0, &comp_path);
// 参考
ProSelection asmCsysSel;
err = ProSelectionAlloc(&comp_path, &asmCsys, &asmCsysSel);
ProSelection compCsysSel;
err = ProSelectionAlloc(NULL, &compCsys, &compCsysSel);
// 约束
ProAsmcompconstraint* constraints;
err = ProArrayAlloc(0, sizeof(ProAsmcompconstraint), 1, (ProArray*)&constraints);
ProAsmcompconstraint constraint;
err = ProAsmcompconstraintAlloc(&constraint);
err = ProAsmcompconstraintTypeSet(constraint, PRO_ASM_CSYS);
err = ProAsmcompconstraintAsmreferenceSet(constraint, asmCsysSel, PRO_DATUM_SIDE_YELLOW);
err = ProAsmcompconstraintCompreferenceSet(constraint, compCsysSel, PRO_DATUM_SIDE_YELLOW);
err = ProArrayObjectAdd((ProArray*)&constraints, -1, 1, &constraint);
// 组装
err = ProAsmcompAssemble(asm_model, comp_model_a, identity_matrix, &asmcomp_a[i]);
err = ProAsmcompConstraintsSet(NULL, &asmcomp_a[i], constraints);
err = ProSolidRegenerate((ProSolid)asmcomp_a[i].owner, PRO_REGEN_NO_FLAGS);
// 释放数组空间
ProArrayFree((ProArray*)&constraints);
}
//--------------------------------------------------------
// 将B.PRT组装到TEST.ASM下
// 参考第一步中组装的第一个A.PRT的轴和面
// TEST.ASM
// |__A.PRT
// |__A.PRT
// |__B.PRT
//--------------------------------------------------------
ProModelitem compAxis_a;
err = ProModelitemByNameInit(comp_model_a, PRO_AXIS, L"A_2", &compAxis_a);
if (err != PRO_TK_NO_ERROR)
{
return PRO_TK_GENERAL_ERROR;
}
ProModelitem compAxis_b;
err = ProModelitemByNameInit(comp_model_b, PRO_AXIS, L"A_1", &compAxis_b);
if (err != PRO_TK_NO_ERROR)
{
return PRO_TK_GENERAL_ERROR;
}
ProModelitem compDatum_a;
err = ProModelitemByNameInit(comp_model_a, PRO_SURFACE, L"TOP", &compDatum_a);
if (err != PRO_TK_NO_ERROR)
{
return PRO_TK_GENERAL_ERROR;
}
ProModelitem compDatum_b;
err = ProModelitemByNameInit(comp_model_b, PRO_SURFACE, L"TOP", &compDatum_b);
if (err != PRO_TK_NO_ERROR)
{
return PRO_TK_GENERAL_ERROR;
}
// 元件路径
c_id_table[0] = asmcomp_a[0].id;
err = ProAsmcomppathInit(asm_model, c_id_table, 1, &comp_path);
// 参考
ProSelection asmAxisSel;
err = ProSelectionAlloc(&comp_path, &compAxis_a, &asmAxisSel);
ProSelection compAxisSel;
err = ProSelectionAlloc(NULL, &compAxis_b, &compAxisSel);
ProSelection asmDatumSel;
err = ProSelectionAlloc(&comp_path, &compDatum_a, &asmDatumSel);
ProSelection compDatumSel;
err = ProSelectionAlloc(NULL, &compDatum_b, &compDatumSel);
// 约束
ProAsmcompconstraint* constraints;
err = ProArrayAlloc(0, sizeof(ProAsmcompconstraint), 1, (ProArray*)&constraints);
ProAsmcompconstraint constraintAxis;
err = ProAsmcompconstraintAlloc(&constraintAxis);
err = ProAsmcompconstraintTypeSet(constraintAxis, PRO_ASM_ALIGN);
err = ProAsmcompconstraintAsmreferenceSet(constraintAxis, asmAxisSel, PRO_DATUM_SIDE_YELLOW);
err = ProAsmcompconstraintCompreferenceSet(constraintAxis, compAxisSel, PRO_DATUM_SIDE_YELLOW);
err = ProArrayObjectAdd((ProArray*)&constraints, -1, 1, &constraintAxis);
ProAsmcompconstraint constraintDatum;
err = ProAsmcompconstraintAlloc(&constraintDatum);
err = ProAsmcompconstraintTypeSet(constraintDatum, PRO_ASM_ALIGN);
err = ProAsmcompconstraintAsmreferenceSet(constraintDatum, asmDatumSel, PRO_DATUM_SIDE_YELLOW);
err = ProAsmcompconstraintCompreferenceSet(constraintDatum, compDatumSel, PRO_DATUM_SIDE_YELLOW);
err = ProArrayObjectAdd((ProArray*)&constraints, -1, 1, &constraintDatum);
// 组装
ProAsmcomp asmcomp_b;
err = ProAsmcompAssemble(asm_model, comp_model_b, identity_matrix, &asmcomp_b);
err = ProAsmcompConstraintsSet(NULL, &asmcomp_b, constraints);
err = ProSolidRegenerate((ProSolid)asmcomp_b.owner, PRO_REGEN_NO_FLAGS);
// 释放数组空间
ProArrayFree((ProArray*)&constraints);
return PRO_TK_NO_ERROR;
}
// 测试组装
int TestAssembly002(uiCmdCmdId command,
uiCmdValue *p_value,
void *p_push_command_data)
{
ProError err;
// 获取组立档案:TEST.ASM
ProMdl mdlAsm;
err = ProMdlInit(L"TEST", PRO_MDL_ASSEMBLY, &mdlAsm);
if (PRO_TK_E_NOT_FOUND == err)
{
MessageBoxW(NULL, L"未打开TEST.ASM", L"www.icaxdev.com", MB_OK);
return -1;
}
// 获取零件档案:A.PRT
ProMdl mdlCompA;
err = ProMdlInit(L"A", PRO_MDL_PART, &mdlCompA);
if (PRO_TK_E_NOT_FOUND == err)
{
MessageBoxW(NULL, L"未打开A.PRT", L"www.icaxdev.com", MB_OK);
return -1;
}
// 获取零件档案:B.PRT
ProMdl mdlCompB;
err = ProMdlInit(L"B", PRO_MDL_PART, &mdlCompB);
if (PRO_TK_E_NOT_FOUND == err)
{
MessageBoxW(NULL, L"未打开B.PRT", L"www.icaxdev.com", MB_OK);
return -1;
}
// 组装
UserAssembly002((ProAssembly)mdlAsm, (ProSolid)mdlCompA, (ProSolid)mdlCompB);
return 0;
}
// 命令访问权限函数
uiCmdAccessState Sample08_Access(uiCmdAccessMode access_mode)
{
return ACCESS_AVAILABLE;
} |
|