【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;
}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
市面上关于UG二次开发的教程很少 这个是最近发布的教程 现在提供光盘资料下载 以下为图书目录: 第1章 参数化特征造型基础  1.1 绪论  1.2 参数化特征造型的基本概念   1.2.1 几何模型类型   1.2.2 参数化特征模型  1.3 曲面造型的基本概念   1.3.1 自由曲线   1.3.2 自由曲线的常用术语   1.3.3 自由曲面   1.3.4 自由曲面特征中常用术语 第2章 VC编程环境简介  2.1 Visual C++6.0的开发环境   2.1.1 VC++6.0简介   2.1.2 VC6项目的建立   2.1.3 VC6项目环境的设置   2.1.4 VC6程序的编译   2.1.5 VC6程序的运行   2.1.6 VC6程序的调试 2.2 VC6编程举例   2.2.1 建立程序框架   2.2.2 编写代码   2.2.3 调试和排错   2.2.4 发布 第3章 UG/Open API编程框架  3.1 UG API基础   3.1.1 UG API基本概念   3.1.2 API帮助文件   3.1.3 开发语言  3.2 内部和外部UF的使用方法   3.2.1 User Exit的概念   3.2.2 ufusr入口   3.2.3 ufsta入口   3.2.4 外部模式的功能  3.3 UF中常见的数据类型   3.3.1 UF函数命名规则   3.3.2 UF中数据结构标识   3.3.3 错误号 3.4 UG系统中对象的基本概念及区别   3.4.1 对象   3.4.2 Object、Body和Feature的区别   3.4.3 UF的License   3.4.4 坐标转换 第4章 特征设计 4.1 UG特征的分类   4.1.1 UG特征的分类   4.1.2 特征的常用操作 4.2 体素特征的创建   4.2.1 创建块   4.2.2 块特征举例 4.3 扫描特征的创建   4.3.1 拉伸特征的创建   4.3.2 回转特征的创建 4.4 成型特征的创建   4.4.1 孔特征的创建   4.4.2 创建孔特征举例 4.5 引用特征的创建   4.5.1 线性阵列特征的创建   4.5.2 镜像特征的创建 4.6 草图特征及其操作   4.6.1 创建草图   4.6.2 初始化草图   4.6.3 添加尺寸   4.6.4 添加尺寸约束   4.6.5 添加几何约束   4.6.6 添加对象   4.6.7 查询表达式   4.6.8 查询几何约束   4.6.9 更新草图   4.6.10 退出草图   4.6.11 程序实例 4.7 基准特征及其操作   4.7.1 创建固定基准面   4.7.2 创建固定基准轴   4.7.3 创建关联基准面   …… 第5章 自由形状特征 第6章 UG/Open API 菜单和界面制作 第7章 装配操作 第8章 文件操作 第9章 属性操作 第10章 表达式 第11章 二维工程图 第12章 KF开发 参考文献
UG/NX二次开发中,可以使用以下方法获取曲线的类型: 1. 获取曲线对象,例如线、圆、椭圆等。 2. 使用UG/Curve_Type.hxx头文件中的枚举类型,通过曲线对象的CurveType()方法获取曲线类型。 以下是一个示例代码,演示如何获取曲线类型: ``` #include <NXOpen/NXException.hxx> #include <NXOpen/Part.hxx> #include <NXOpen/PartCollection.hxx> #include <NXOpen/Features_Feature.hxx> #include <NXOpen/Features_FeatureCollection.hxx> #include <NXOpen/Features_FeatureType.hxx> #include <NXOpen/Features_BodyFeature.hxx> #include <NXOpen/Features_BodyFeatureCollection.hxx> #include <NXOpen/Curve.hxx> #include <NXOpen/Curve_Type.hxx> using namespace NXOpen; void getCurveType(Curve* curve) { if (curve == NULL) { return; } Curve::Type type = curve->CurveType(); switch (type) { case Curve::Type_Line: // do something for line break; case Curve::Type_Circle: // do something for circle break; case Curve::Type_Ellipse: // do something for ellipse break; // add more cases for other curve types default: // do something for unknown curve type break; } } int main(int argc, char* argv[]) { Part* part = NULL; PartCollection* partCollection = NULL; Features::Feature* feature = NULL; Features::FeatureCollection* featureCollection = NULL; Features::BodyFeature* bodyFeature = NULL; Features::BodyFeatureCollection* bodyFeatureCollection = NULL; Curve* curve = NULL; try { partCollection = NXOpen::Session::GetSession()->Parts(); part = partCollection->ActivePart(); featureCollection = part->Features(); feature = featureCollection->FindObject("feature_name", Features::FeatureType_Body); bodyFeatureCollection = feature->BodyFeatures(); bodyFeature = bodyFeatureCollection->FindObject("body_feature_name"); curve = dynamic_cast<Curve*>(bodyFeature->GetGeometryObject()); getCurveType(curve); } catch (NXException& ex) { // handle exception } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值