NX二次开发中如何从对象选择控件中获得选中面的TAG值

一、概述

        在NX二次开发中所有的对象操作都是通过对对象的TAG值进行操作控制,如何结合BlockUI控件,得到对象的TAG值是十分重要的一步。今天就遇到了这个问题,其实不是不会,而是思维习惯,直接利用对象选择器->Tag(),这个是不对的。应该先利用对象选择器获得选择的对象,在通过对象获得对象的Tag。有时候往往是一个小问题,但是你就是不想起来,这里感谢那些NX二次开发大佬的答疑,同时感谢各位写的博客。

//selection0对象选择器的ID
std::vector<TaggedObject*>objects =selection0->GetSelectedObjects();
tag_t tag=objects[0]->Tag()

二、案例

通过选择对象收集器,进行判断收集到的面是否为平面。

UF_MODL_ask_face_data()和UF_MODL_ask_face_type()函数都可以判断面的类型

关键代码:

#include <uf_modl.h>

//在初始化中过滤
void text111::initialize_cb()
{
    try
    {
        group0 = dynamic_cast<NXOpen::BlockStyler::Group*>(theDialog->TopBlock()->FindBlock("group0"));
        selection0 = dynamic_cast<NXOpen::BlockStyler::SelectObject*>(theDialog->TopBlock()->FindBlock("selection0"));

		/
		//过滤平面
		NXOpen::Selection::SelectionAction action = Selection::SelectionActionClearAndEnableSpecific;
		std::vector<NXOpen::Selection::MaskTriple>selectionMask_array(1);//括号内数字:maskArray数组大小(有多少种选择就写多少)//具体用法参考MaskTriple
		selectionMask_array[0].Type = UF_solid_type;
		selectionMask_array[0].Subtype = UF_solid_face_subtype;
		selectionMask_array[0].SolidBodySubtype = UF_UI_SEL_FEATURE_ANY_FACE;

		NXOpen::BlockStyler::PropertyList *selComponentProps = selection0->GetProperties();//selComp为对象收集器的ID
		selComponentProps->SetSelectionFilter("SelectionFilter", action, selectionMask_array);
		delete selComponentProps;
		selComponentProps = NULL;

    }
    catch(exception& ex)
    {
        //---- Enter your exception handling code here -----
        text111::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
    }
}

int text111::apply_cb()
{
    int errorCode = 0;
    try
    {
        //---- Enter your callback code here -----
		UF_initialize();
		std::vector<TaggedObject*> objects = selection0->GetSelectedObjects();
		int type = 0;
		double point[3];
		double dir[3];
		double box[6];
		double radius;
		double rad_data;
		int norm_dir=0;

		UF_MODL_ask_face_data(objects[0]->Tag(), &type, point, dir, box, &radius, &rad_data, &norm_dir);
		if (type == 22)
		{
			uc1601("温馨提示:选中结果为平面.", 1);
		}
		else
		{
			uc1601("温馨提示:请选择平面.", 1);
		}
		UF_terminate();
    }
    catch(exception& ex)
    {
        //---- Enter your exception handling code here -----
        errorCode = 1;
        text111::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
    }
    return errorCode;
}


int text111::apply_cb()
{
    int errorCode = 0;
    try
    {
        //---- Enter your callback code here -----
		UF_initialize();
		std::vector<TaggedObject*> objects = selection0->GetSelectedObjects();

		int faceTpye = 0;
		UF_MODL_ask_face_type(objects[0]->Tag(), &faceTpye);
		if (faceTpye == UF_MODL_PLANAR_FACE)
		{
			uc1601("温馨提示:选中结果为平面.", 1);
		}
		else
		{
			uc1601("温馨提示:请选择平面.", 1);
		}
		UF_terminate();
    }
    catch(exception& ex)
    {
        //---- Enter your exception handling code here -----
        errorCode = 1;
        text111::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
    }
    return errorCode;
}

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
NX二次开发,可以通过以下步骤实现OBB算法获得实体的最小包容盒: 1.获取实体的所有顶点坐标,可以通过以下方式获取: ```java // 获取实体的所有顶点坐标 NXOpen.Tag partTag = ...; // 实体的标签 NXOpen.Part part = (NXOpen.Part)NXOpen.Utilities.NXObjectManager.Get(partTag); NXOpen.Body body = part.Bodies.ToArray()[0]; NXOpen.Point3d[] vertices = body.Vertices.ToArray().Select(v => v.Coordinates).ToArray(); ``` 2.将顶点坐标转换为本地坐标系下的坐标,可以通过以下方式获取: ```java // 将实体顶点坐标转换为本地坐标系下坐标 NXOpen.Tag wcsTag = NXOpen.Tag.Null; NXOpen.Tag csysTag = ...; // 实体的坐标系标签 NXOpen.CoordinateSystem csys = (NXOpen.CoordinateSystem)NXOpen.Utilities.NXObjectManager.Get(csysTag); NXOpen.Matrix wcsToCsys = NXOpen.NXObjectManager.Get(wcsTag).GetMatrixToGlobal(); NXOpen.Unit vectorUnit = NXOpen.Unit.Null; double[] cSysOrigin = csys.GetOrigin(ref vectorUnit); double[] localVertices = new double[vertices.Length * 3]; for (int i = 0; i < vertices.Length; i++) { double[] wcsVertex = new double[] { vertices[i].X, vertices[i].Y, vertices[i].Z }; double[] csysVertex = new double[3]; for (int j = 0; j < 3; j++) { csysVertex[j] = 0.0; for (int k = 0; k < 3; k++) { csysVertex[j] += wcsToCsys.GetElement(j, k) * wcsVertex[k]; } csysVertex[j] -= cSysOrigin[j]; } localVertices[i * 3] = csysVertex[0]; localVertices[i * 3 + 1] = csysVertex[1]; localVertices[i * 3 + 2] = csysVertex[2]; } ``` 3.使用OBB算法计算实体的最小包容盒,可以使用Jama库的OBB类实现: ```java // 计算实体的最小包容盒 Jama.Matrix vertexMatrix = new Jama.Matrix(localVertices, localVertices.Length / 3); OBB obb = new OBB(vertexMatrix); double[] obbCenter = new double[] { obb.getCenter().get(0, 0), obb.getCenter().get(1, 0), obb.getCenter().get(2, 0) }; double[] obbAxis1 = new double[] { obb.getAxis(0).get(0, 0), obb.getAxis(1).get(0, 0), obb.getAxis(2).get(0, 0) }; double[] obbAxis2 = new double[] { obb.getAxis(0).get(1, 0), obb.getAxis(1).get(1, 0), obb.getAxis(2).get(1, 0) }; double[] obbAxis3 = new double[] { obb.getAxis(0).get(2, 0), obb.getAxis(1).get(2, 0), obb.getAxis(2).get(2, 0) }; double[] obbDimension = new double[] { obb.getExtent(0), obb.getExtent(1), obb.getExtent(2) }; ``` 这样就可以获得实体的最小包容盒的心点坐标、三个主轴向量和三个方向上的尺寸。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白雪公主的后妈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值