野火论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始


查看: 12562|回复: 10

[求助] 请教大神,Creo2.0二次开发实现自动装配 打开零件时creo自动退出是怎么回事?

[复制链接]

1

主题

8

回帖

0

威望

实习生

Rank: 1

积分
10
发表于 2015-5-13 15:36 | 显示全部楼层 |阅读模式
附上程序:
#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;
}

1

主题

8

回帖

0

威望

实习生

Rank: 1

积分
10
 楼主| 发表于 2015-5-13 15:46 | 显示全部楼层
本帖最后由 wangdongw 于 2015-5-13 15:51 编辑

附上截图
a.PNG
回复 支持 反对

使用道具 举报

0

主题

10

回帖

0

威望

实习生

Rank: 1

积分
11
发表于 2015-5-14 21:28 | 显示全部楼层
把状态打出来看下    看跑到哪一步挂掉的
回复 支持 反对

使用道具 举报

1

主题

8

回帖

0

威望

实习生

Rank: 1

积分
10
 楼主| 发表于 2015-5-16 09:41 | 显示全部楼层
zhed1 发表于 2015-5-14 21:28
把状态打出来看下    看跑到哪一步挂掉的

不好意思,我还是菜鸟,不明白你说的把状态打出来是什么意思。
回复 支持 反对

使用道具 举报

0

主题

10

回帖

0

威望

实习生

Rank: 1

积分
11
发表于 2015-5-16 18:33 | 显示全部楼层
每步都返回一个proerror看返回状态,确定出错位置
回复 支持 反对

使用道具 举报

0

主题

10

回帖

0

威望

实习生

Rank: 1

积分
10
发表于 2015-10-27 01:10 | 显示全部楼层
请问LZ调试出来了没有?请问能否通过菜单按钮实现自动装配,不需要选择添加的零件,只需要点下装配按钮,即可完成所有零件的装配,谢谢!
回复 支持 反对

使用道具 举报

2

主题

29

回帖

0

威望

实习生

Rank: 1

积分
37
发表于 2015-11-17 17:18 | 显示全部楼层
JFKang 发表于 2015-10-27 01:10
请问LZ调试出来了没有?请问能否通过菜单按钮实现自动装配,不需要选择添加的零件,只需要点下装配按钮,即 ...


请看这里,最后的回复,是不是这样?最近我也再研究。
如何实现Proe自动载入零件到组件
http://www.proewildfire.cn/thread-130676-1-1.html
(出处: 野火论坛)
回复 支持 反对

使用道具 举报

8

主题

18

回帖

0

威望

实习生

Rank: 1

积分
30
发表于 2018-5-5 20:18 | 显示全部楼层
作者这程序那儿的,调试好了吗
回复 支持 反对

使用道具 举报

0

主题

14

回帖

0

威望

实习生

Rank: 1

积分
17
QQ
发表于 2018-5-22 13:01 | 显示全部楼层
楼主犯了一个低级错误:ProMdlLoad注意类型  
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;
        }
我的开发实战公众号:Creo二次开发
回复 支持 反对

使用道具 举报

8

主题

104

回帖

-2

威望

助工

Rank: 2

积分
114
发表于 2018-6-6 16:32 | 显示全部楼层
yingshuwolf 发表于 2018-5-22 13:01
楼主犯了一个低级错误:ProMdlLoad注意类型  
ProStringToWstring(name2,"F:\webshili\protk_sample_08\re ...

这个怎么解决呀?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站为非营利性站点,部分资源为网友搜集或发布,仅供学习和研究使用,如用于商业用途,请购买正版。站内所发布的资源,如有侵犯你的权益,请联系我们,本站将立即改正或删除。

QQ|手机版|小黑屋|野火论坛(©2007~2024) ( 苏ICP备11036728号-2 )苏公网安备 32039102000103号

GMT+8, 2024-4-25 17:48 , Processed in 0.106923 second(s), 27 queries .

快速回复 返回顶部 返回列表