【Creo5.0二次开发参数化】选择装配

通过用户选择装配平面,自动装配

装配函数

/*------------------------------------------------------------------*\
Application includes
\*--------------------------------------   ---------------------------*/
#include <TestError.h>
#include <ProMessage.h>
#include <ProSolid.h>
#include "GetDimension.h"
#include <stdio.h>
#include "MCFdialog.h"
#include <ProModelitem.h>
#include <ProAsmcomp.h> // 新添的头文件
#include <ProWstring.h>
/// <summary>
/// 通过用户选择装配平面,自动装配
/// </summary>
/// <param name="asm_model"> 组装模型</param>
/// <param name="comp_model">装配元件模型</param>
/// <returns></returns>
ProError UserAssembleByDatums(ProAssembly asm_model,
	ProSolid comp_model)
{
	ProError status;
	ProName comp_datums[3];
	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;
	int i;
	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;
	//Set up the arrays of datum names  
	//参考平面,这里的名称要和自己的装配元件的平面名称一样,才能找到
	ProStringToWstring(comp_datums[0], "FRONT");
	ProStringToWstring(comp_datums[1], "TOP");

		ProStringToWstring(comp_datums[2], "RIGHT");
	//Package the component initially
		//把装配元件添加在组装元件之中,identity_matrix表示加载的初始位置,(在空间上)
	ProAsmcompAssemble(asm_model, comp_model, identity_matrix, &asmcomp);
	//Prepare the constraints array
	ProArrayAlloc(0, sizeof(ProAsmcompconstraint), 1,
		(ProArray*)&constraints);

	//用户选择装配平面
	//每选择一个装配平面,就和一个元件平面组成一个约束
	for (i = 0; i < 3; i++)
	{
		//Find the component datum  获取平面模型
		status = ProModelitemByNameInit(comp_model, PRO_SURFACE,
			comp_datums[i], &comp_datum);
		if (status != PRO_TK_NO_ERROR)
		{
			interact_flag = PRO_B_TRUE;
			continue;
		}
		//Allocate the references
		ProSelectionAlloc(NULL, &comp_datum, &comp_sel);
		int n_sel = 0;
		ProSelection* sel;
		//用户选择平面
		status = ProSelect("surface", 1, NULL, NULL, NULL, NULL, &sel, &n_sel);
		if (status != PRO_TK_NO_ERROR || n_sel < 0)
			return (PRO_TK_USER_ABORT);
		ProSelectionCopy(sel[0], &asm_sel);

		//Allocate and fill the constraint.填充约束,循环三次,三个元件平面和三个用户选择的平面
		ProAsmcompconstraintAlloc(&constraint);
		ProAsmcompconstraintTypeSet(constraint, PRO_ASM_ALIGN);
		ProAsmcompconstraintAsmreferenceSet(constraint, asm_sel,
			PRO_DATUM_SIDE_YELLOW);

			ProAsmcompconstraintCompreferenceSet(constraint, comp_sel,
				PRO_DATUM_SIDE_YELLOW);
		ProArrayObjectAdd((ProArray*)&constraints, -1, 1, &constraint);
	}  
	//把三个约束放进组装里完成装配

	status = ProAsmcompConstraintsSet(NULL, &asmcomp, constraints);
	ProSolidRegenerate((ProSolid)asmcomp.owner, PRO_REGEN_CAN_FIX);
	if (interact_flag)
	{
		ProAsmcompConstrRedefUI(&asmcomp);
	}
	return (PRO_TK_NO_ERROR);
}


测试函数

//选择装配,从当前内存或路径通过模型名称选择一个模型,调用装配函数
void  UserAssembleTest() {


// 在当前内存中或路径下找到 对应名称的模型的句柄
		ProError status;
		ProMdlType model_type = PRO_MDL_PART;
		ProMdl* session_mdls, find_mdl;
		int mdls_counts;
		ProName target_name;
		ProAssembly assembly;
		ProMdlCurrentGet((ProMdl*)&assembly);
		ProStringToWstring(target_name, "PRT0002");
		ProBoolean was_found = PRO_B_FALSE;
		//在当前内存中查找匹配的模型,工作区,找不到试试设置工作区
		status = ProSessionMdlList(model_type, &session_mdls, &mdls_counts);
		if (status == PRO_TK_NO_ERROR)
		{
			ProName mdl_name;
			for (int i = 0; i < mdls_counts; i++)
			{
				status = ProMdlNameGet(session_mdls[i], mdl_name);
				AfxMessageBox(mdl_name);
				int compare_result = 1;
				ProWstringCompare(target_name, mdl_name, PRO_VALUE_UNUSED,
					&compare_result);
				if (compare_result == 0)
				{
					//找到调用装配
					find_mdl = &session_mdls[i];
					UserAssembleByDatums(assembly, (ProSolid)session_mdls[i]);
				//	ProMdlDisplay(session_mdls[i]);
					was_found = PRO_B_TRUE;

				
				}
			}
			ProArrayFree((ProArray*)&session_mdls);

		}
		// if not found, try to retrieve it from disk
		if (was_found == PRO_B_FALSE)
		{
			status = ProMdlnameRetrieve(target_name, (ProMdlfileType)model_type, &find_mdl);
			if (status == PRO_TK_NO_ERROR)
			{
				//	ProMdlDisplay(find_mdl);
		
			}
		}

	}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Creo是目前市面上较为流行的3D建模软件之一,它具有强大的建模和可视化能力,灵活和高效的工作流程。随着其广泛应用,Creo二次开发也变得越来越受欢迎。Creo二次开发涉及许多技术领域,需要掌握软件开发的基本理论、技能和方法。 为帮助读者更好地理解Creo二次开发的相关知识,市场上出现了许多Creo二次开发的书籍。这些书籍有一定的难度和深度,需要读者具备一定的计算机基础知识和编程技能。同时,这些书籍内容也非常丰富,包括二次开发的基础知识、常用的API、编程实例等。读者可以根据自己的需求和兴趣选择适合自己的书籍进行学习与参考。 总的来说,Creo二次开发书籍是一种学习Creo二次开发技术的有效方式,有助于读者快速掌握有关技术。然而,需要注意的是,只有通过实践并不断学习和思考,才能真正掌握Creo二次开发技术,并将其应用于实际工作中。因此,我们建议读者在学习Creo二次开发的同时,注重实践和应用,不断提升自己的能力和技术水平。 ### 回答2: Creo是一款广受欢迎的CAD软件,许多企业在工程设计方面都会使用它。对于一些高级用户或开发人员来说,他们可能会希望对Creo进行二次开发,以满足个性化需求。Creo二次开发书籍也就应运而生,它可以帮助这类人员更好地理解Creo的内部机制及API,并指导他们如何利用这些知识进行二次开发。 在Creo二次开发书籍中,读者可以学习到如何使用Pro/Toolkit或Creo Toolkit等开发工具进行二次开发,从而进行高级功能扩展。书籍会涵盖Creo二次开发的各种方面,包括基础知识、工作流程、API接口、数据模型等,同时也会提供实用案例及技巧,指导读者如何更好地解决实际问题。 Creo二次开发书籍对于那些利用Creo进行工程设计的企业来说,是一份宝贵的参考资料。它可以帮助企业开发人员更好地理解Creo软件,并根据企业需求进行二次开发,以满足定制化的需求。此外,企业还可以通过在二次开发上的投入,提升员工的技能和能力,确保企业在技术上的领先优势。 总之,Creo二次开发书籍是对于高级Creo用户和开发人员来说,是一种非常重要的资源。它可以帮助读者更好地了解Creo软件的内部机制,并提供全面的开发指导,帮助他们实现定制化的需求,从而提升工作效率和竞争力。 ### 回答3: Creo是一种制造和工程设计软件,它是由PTC公司开发的。 Creo二次开发书籍是一种教育工具,它涵盖了基本的Creo 二次开发知识。如果您需要深入了解Creo二次开发,这些书籍是最好的选择之一。 这些书籍通常包括许多不同的主题,包括Creo的基础知识、API、protoolkit和jlink的使用方法。作为一个Creo二次开发者,您可以使用这些书籍作为参考书,以便在开发的过程中找到所需的信息。 Creo二次开发书籍非常适合对Creo软件和制造工程感兴趣的人们,也适合那些想学习如何开发自定义应用程序的人们。这些书籍可以帮助您更好地掌握Creo二次开发的技术。 总之,Creo二次开发书籍是一种很好的学习工具,如果您想成为一名Creo二次开发者,这些书籍是不可或缺的。它们可以帮助您深入了解Creo开发,为您的未来创造更多的机会。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值