【UG/NX二次开发】获取曲线上某点、某些点的坐标

我已经尽我所能确保信息的准确性,但是如果您发现任何错误或不准确的地方,请随时在评论区指出。我非常感谢您的反馈,这将帮助我改进我的内容。

1. 获取某点坐标

直接展示update_cb中的代码:

void get_curve_point(tag_t curve_edge, double point_pos[3], double relative_pos) {
    double junk[3] = { 0.0, 0.0, 0.0 };
    UF_MODL_ask_curve_props(curve_edge, relative_pos, point_pos, junk, junk, junk, junk, junk);
}

int demo::update_cb(NXOpen::BlockStyler::UIBlock* block)
{
    try
    {
        if (block == blockStyler1){
        	UF_initialize();
        	// 定义接收选择对象的容器
            vector<TaggedObject*> selectobs;
            // 从对象edge_select0中得到选择对象
            selectobs = edge_select0->GetSelectedObjects();
            // 获取的选择对象的tag_t值
			tag_t curve_edge = selectobs[0]->Tag();
			// 想要获取的点在曲线上的相对位置,范围0~1
			double relative_pos = 0.0;
			// 定义获取点
			double point_pos[3];
			get_curve_point(curve_edge, point_pos[3], relative_pos)
        } 
        else if (block == blockStyler2){
        	
        }
    }
    catch(exception& ex)
    {
        //---- Enter your exception handling code here -----
        demo::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
    }
    return 0;
}

2. 获取多个点的坐标

// 通过vector<TaggedObject*>对象获取曲线上多个点的坐标
vector<array<double, 3>> get_selectobs_curves_point_set(vector<TaggedObject*> tag_objs) {
    // 计算在复合曲线上选取点的步长(在NX二次开发中,选取的曲线可能是多条曲线结合的结果,在这里通过求一定点数的坐标,每两点间的弧长取一致,可在此基础上通过设置一定规则灵活选取点)
    double curves_length = 0.0;
    for (TaggedObject* tag_obj : tag_objs) {
        tag_t tag = tag_obj->Tag();
        double curve_length;
        UF_CURVE_ask_arc_length(tag, (0, 0, 0), (0, 0, 1), UF_MODL_MMETER, &curve_length);
        curves_length += curve_length;
    }
	// 此处NUM_POINTS为需要求取的点个数,自己设置
    double stol = curves_length / double(NUM_POINTS);
    vector<array<double, 3>> points_list;
    for (TaggedObject* tag_obj : tag_objs) {
        tag_t tag = tag_obj->Tag();
        double ctol = 0.0;  // 弦长误差
        double atol = 0.0;   // 角度误差
        //double stol = 0.0;   // 最大步长
        double* pts;
        int numpts;
        int flag = UF_MODL_ask_curve_points(tag, ctol, atol, stol, &numpts, &pts);
        if (flag == 0) {
            for (int i = 0; i < numpts; ++i) {
                array<double, 3> point;
                point[0] = pts[i * 3];
                point[1] = pts[i * 3 + 1];
                point[2] = pts[i * 3 + 2];
                points_list.push_back(point);
            }
        } 
    }
    return points_list;
}

int demo::update_cb(NXOpen::BlockStyler::UIBlock* block)
{
    try
    {
        if (block == blockStyler1){
        	UF_initialize();
        	// 定义接收选择对象的容器
            vector<TaggedObject*> selectobs;
            // 从对象edge_select0中得到选择对象
            selectobs = edge_select0->GetSelectedObjects();
            vector<array<double, 3>> points_pos_on_curve = get_selectobs_curves_point_set(selectobs);
        } 
        else if (block == blockStyler2){
        	
        }
    }
    catch(exception& ex)
    {
        //---- Enter your exception handling code here -----
        demo::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError, ex.what());
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值