文章目录
- 1、前言
- 2、用UF_MODL_create_block1创建一个块
- 3、将Tag_t转换为Body出现错误
- 3、解决方法
- 4、结论
1、前言
经常采用UG NX二次开发(NXOpen C#)(UG NX二次开发(C#)专栏),在用UFun创建一个实体时,采用强制转换,能将tag对象转换为body对象,但是在C++时却不能直接强制转换,经过多次测试,我找到一种方法,现在分享给大家,如果有其他更好的方法,请留言指正。
2、用UF_MODL_create_block1创建一个块
在UFun函数中,创建一个长方体,如果没有布尔操作,用UF_MODL_create_block1,其帮助说明如下:
其输入参数有三个:
- 操作类型
- 长方体角点
- 三个边长
其输出参数有一个: - 生成的长方体Tag_t
我们现在改变输入参数,和输出参数,即是,输入参数有两个:
- 长方体角点-Point3d类型
- 三个边长-char*length[]
- 输出为Body类型
我们仅仅是测试,所以不关心操作类型。
所有,我们构造一个新的函数为:
void CreateBlock(Point3d* point3D, char*length[], Body* body)
其完整的代码如下:
void UFModel::CreateBlock(Point3d* point3D, char*length[], Body* body)
{
double origionPnt[3] = {point3D->X,point3D->Y,point3D->Z};
tag_t bodyTag;
UF_MODL_create_block1(UF_FEATURE_SIGN::UF_NULLSIGN,origionPnt,length,&bodyTag);
body = dynamic_cast<NXOpen::Body*>(NXObjectManager::Get(bodyTag));
}
然后,编译链接完成生成dll,在UG NX中测试,确实生成了一个长方体,这是对的。
3、将Tag_t转换为Body出现错误
但是,代码中添加了一行,即获取实体的面,代码如下:
void UFModel::CreateBlock(Point3d* point3D, char*length[], Body* body)
{
double origionPnt[3] = {point3D->X,point3D->Y,point3D->Z};
tag_t bodyTag;
UF_MODL_create_block1(UF_FEATURE_SIGN::UF_NULLSIGN,origionPnt,length,&bodyTag);
body = dynamic_cast<NXOpen::Body*>(NXObjectManager::Get(bodyTag));
std::vector<Face*>faces = body->GetFaces();
}
其就爆出空指针的错误:
其就是强制转换不成功。
3、解决方法
其中一种有效的解决方法是通过以下代码实现:
void UFModel::CreateBlock(Point3d* point3D, char*length[], Body* body)
{
double origionPnt[3] = {point3D->X,point3D->Y,point3D->Z};
tag_t bodyTag;
UF_MODL_create_block1(UF_FEATURE_SIGN::UF_NULLSIGN,origionPnt,length,&bodyTag);
TaggedObject *taggedObject = NXObjectManager::Get(bodyTag);
NXObject *nXObject = dynamic_cast<NXOpen::NXObject*>(taggedObject);
NXString JI = nXObject->JournalIdentifier();
Body* body1(dynamic_cast<Body*>(workPart->Bodies()->FindObject(JI)));
tag_t tag0 = body1->Tag();
std::vector<Face*>faces = body1->GetFaces();
}
通过JournalIdentifier来做一个中转,这个经过测试是可以的。
4、结论
在NXOpen二次开发(C#)中,我不太关心JournalIdentifier,因为强制转换一般都没有问题,但是在C++中可能就不同了,还是需要JournalIdentifier的,以后多学习多注意