【NX】NX中将点从一个坐标系映射到另一个坐标系

news2025/1/22 20:59:34

直接上代码吧,主要是使用了UF_CSYS_map_point函数:

bool CAMToolPathToolkit::MapPointThroughRootWork(const AUTUMOONMathPoint3d &iPt, AUTUMOONMathPoint3d &oPt, int nTransMethod)
{
    // 将点坐标转换为工作坐标系下坐标
    double arrPointInput[3] = {0};
    double arrPointOutput[3] = {0};

    iPt.Array(arrPointInput);

    int nRet = -1;

    switch (nTransMethod)
    {
    case 0:
        nRet = UF_CSYS_map_point(UF_CSYS_WORK_COORDS, arrPointInput, UF_CSYS_ROOT_WCS_COORDS, arrPointOutput);
        break;
    case 1:
        nRet = UF_CSYS_map_point(UF_CSYS_ROOT_WCS_COORDS, arrPointInput, UF_CSYS_WORK_COORDS, arrPointOutput);
        break;
    default:
        break;
    }

    oPt = AUTUMOONMathPoint3d(arrPointOutput[0], arrPointOutput[1], arrPointOutput[2]);

    return nRet == 0;
}

但是这里有限制,即只实现了当前工作坐标系和根坐标系之间的转换,那么如果想实现任意坐标系的转换呢,当然我们可以通过根坐标系作为媒介,实现任意坐标系之间的转换,那么有没有更好的办法,实现坐标系之间的直接转换呢?

上面的代码可以理解为简单的UF_CSYS_map_point函数使用范例,而实际上我们更需要的是从任意一个坐标系转换到任意一个坐标系的功能,那么如何实现内容——实际上利用移动对象功能,因为移动对象功能中包含从一个坐标系移动到另一个坐标系的方法。

 

在这里我先分享一下在nx中创建坐标系的代码:

tag_t CAMToolPathToolkit::CreateCSYSByOriginZ(const AUTUMOONMathPoint3d &iPtOrigin, const AUTUMOONMathVector3d &ivecZ,
                                              bool bSetWCS /*= true*/)
{
    int ret = 0;
    double wcs_mtx[9] = {0.0};

    double arrVectorZ[3] = {0};
    ivecZ.Array(arrVectorZ);

    ret = UF_MTX3_initialize_z(arrVectorZ, wcs_mtx);
    if (ret)
    {
        return NULL_TAG;
    }

    tag_t matrix_id = NULL_TAG;
    tag_t csys_id = NULL_TAG;

    UF_CSYS_create_matrix(wcs_mtx, &matrix_id);

    double arrOrigin[3] = {0};
    iPtOrigin.Array(arrOrigin);
    if (matrix_id != NULL_TAG)
    {
        UF_CSYS_create_csys(arrOrigin, matrix_id, &csys_id);
        if (csys_id != NULL_TAG)
        {
            // 设置新建的坐标系为当前工作坐标系
            if (bSetWCS)
            {
                UF_CSYS_set_wcs(csys_id);
            }
            // 设置坐标系为显示状态
            // UF_CSYS_set_wcs_display(1);
            return csys_id;
        }
    }

    return NULL_TAG;
}

tag_t CAMToolPathToolkit::CreateCSYSByOriginXZ(const AUTUMOONMathPoint3d &iPtOrigin, const AUTUMOONMathVector3d &ivecX,
                                               const AUTUMOONMathVector3d &ivecZ, bool bSetWCS)
{
    double iX[3] = {0};
    double iZ[3] = {0};

    ivecX.Array(iX);
    ivecZ.Array(iZ);

    int errorCode = 0;
    double valueOfX = sqrt(pow(iX[0], 2) + pow(iX[1], 2) + pow(iX[2], 2));
    double valueOfZ = sqrt(pow(iZ[0], 2) + pow(iZ[1], 2) + pow(iZ[2], 2));
    if (fabs(valueOfX) < 0.001 || fabs(valueOfZ) < 0.001)
    {
        errorCode = 1;
        return NULL_TAG;
    }
    UF_initialize();

    double OriginPoint[3];
    iPtOrigin.Array(OriginPoint);
    UF_CSYS_map_point(UF_CSYS_WORK_COORDS, OriginPoint, UF_CSYS_ROOT_COORDS, OriginPoint);

    double y_vec[3];
    y_vec[0] = iZ[1] * iX[2] - iZ[2] * iX[1];
    y_vec[1] = iZ[2] * iX[0] - iZ[0] * iX[2];
    y_vec[2] = iZ[0] * iX[1] - iZ[1] * iX[0];

    double mtx[9] = {0};
    UF_CALL(UF_MTX3_initialize(iX, y_vec, mtx));
    UF_MTX3_ortho_normalize(mtx);

    tag_t matrix_id;
    UF_CALL(UF_CSYS_create_matrix(mtx, &matrix_id));

    tag_t oCsys_tag;
    UF_CALL(UF_CSYS_create_csys(OriginPoint, matrix_id, &oCsys_tag));

    // 设置新建的坐标系为当前工作坐标系
    if (bSetWCS && oCsys_tag)
    {
        UF_CSYS_set_wcs(oCsys_tag);
    }

    return oCsys_tag;
}

接下来是坐标系之间的代码转换:

AUTUMOON::AUTUMOONMathPoint3d CCommonHelper::MapPointFromCSYSToCSYS(const AUTUMOONMathPoint3d &iptInput, tag_t tgFromCSYS,
                                                            tag_t tgToCSYS)
{
    std::vector<NXObject *> vPts = CreatePoints(std::vector<AUTUMOONMathPoint3d>(1, iptInput));

    if (vPts.size() == 1)
    {
        tag_t tgPoint = CCommonHelper::MoveObjects(vPts[0], tgFromCSYS, tgToCSYS);

        double dCoors[3] = {0};
        UF_CURVE_ask_point_data(tgPoint, dCoors);

        DeleteObjectsSafely(tgPoint);

        return AUTUMOONMathPoint3d(dCoors);
    }

    return AUTUMOONMathPoint3d();
}

其中:MoveObjects为关键函数,此函数通过操作记录功能,也就是录制宏,即可实现。

因为项目原因,这里提供代码供参考,当然实际上如果你需要用到,必须做一些修改才可以使用,建议自己录制,对照修改即可。

tag_t CCommonHelper::MoveObjects(NXObject *ipObj, tag_t tgFromCSYS, tag_t tgToCSYS, bool bCopy /*= false*/)
{
    // 获取坐标系
    CartesianCoordinateSystem *cartesianCoordinateSystemFrom =
        static_cast<CartesianCoordinateSystem *>(NXObjectManager::Get(tgFromCSYS));
    CartesianCoordinateSystem *cartesianCoordinateSystemTo =
        static_cast<CartesianCoordinateSystem *>(NXObjectManager::Get(tgToCSYS));

    Features::MoveObject *nullFeatures_MoveObject(NULL);
    Features::MoveObjectBuilder *moveObjectBuilder1;
    moveObjectBuilder1 = AUTUMOONWorkPart->BaseFeatures()->CreateMoveObjectBuilder(nullFeatures_MoveObject);

    Unit *unit1 = moveObjectBuilder1->TransformMotion()->RadialOriginDistance()->Units();

    Point3d manipulatororigin1 = moveObjectBuilder1->TransformMotion()->ManipulatorOrigin();

    Matrix3x3 manipulatormatrix1;
    manipulatormatrix1 = moveObjectBuilder1->TransformMotion()->ManipulatorMatrix();

    moveObjectBuilder1->TransformMotion()->SetOption(GeometricUtilities::ModlMotion::OptionsCsysToCsys);

    moveObjectBuilder1->TransformMotion()->DistanceValue()->SetRightHandSide("20");

    bool added1 = moveObjectBuilder1->ObjectToMoveObject()->Add(ipObj);

    Unit *unit2 = moveObjectBuilder1->TransformMotion()->DistanceAngle()->Angle()->Units();

    moveObjectBuilder1->TransformMotion()->SetFromCsys(cartesianCoordinateSystemFrom);

    moveObjectBuilder1->TransformMotion()->SetToCsys(cartesianCoordinateSystemTo);

    if (bCopy)
    {
        moveObjectBuilder1->SetMoveObjectResult(Features::MoveObjectBuilder::MoveObjectResultOptionsCopyOriginal);
    }

    NXObject *nXObject1 = moveObjectBuilder1->Commit();

    std::vector<NXObject *> objects2 = moveObjectBuilder1->GetCommittedObjects();

    moveObjectBuilder1->Destroy();

    // 成功移动对象
    if (objects2.size())
    {
        return objects2[0]->Tag();
    }

    return NULL_TAG;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/924962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有限与无限游戏 | 真北荐书

2023佛山敏捷之旅暨DevOps Meetup志愿者为进行大会的组织与准备&#xff0c;每周三晚有一个例会。 例会前等人的时间&#xff0c;涌现出一个小的分享环节。今天分享这本书&#xff1a;《有限与无限游戏》。 大家选择成为志愿者&#xff0c;是一个无限游戏。而组织活动和完成各种…

JavaSE 认识String类

目录 1 创建字符串2 字符串比较相等3 字符串常量池4 理解字符串不可变5 字符、字节与字符串5.1 字符与字符串5.2 字节与字符串5.3 小结 6 字符串常见操作6.1 字符串比较6.2 字符串查找6.3 字符串替换6.4 字符串拆分6.5 字符串截取6.6 其他操作方法 7 StringBuffer 和 StringBui…

AIGC ChatGPT 按年份进行动态选择的动态图表

动态可视化分析的好处与优势&#xff1a; 1. 提高信息理解性&#xff1a;可视化分析使得大量复杂的数据变得易于理解&#xff0c;通过图表、颜色、形状、尺寸等方式&#xff0c;能够直观地表现不同的数据关系和模式。 2. 加快决策速度&#xff1a;数据可视化可以帮助用户更快…

stm32 之20.HC-06蓝牙模块

原理图显示使用usart3串口使用的是PB10和PB11引脚 直接配置usart3串口协议 void usart3_init(uint32_t baud) {GPIO_InitTypeDef GPIO_InitStructureure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//端口B硬件时钟打开RCC_AHB1PeriphClockC…

Qt中XML文件创建及解析

一 环境部署 QT的配置文件中添加xml选项&#xff1a; 二 写入xml文件 头文件&#xff1a;#include <QXmlStreamWriter> bool MyXML::writeToXMLFile() {QString currentTime QDateTime::currentDateTime().toString("yyyyMMddhhmmss");QString fileName &…

Codeforces Round 887 Div.3 A~D

文章目录 A. Blackboard ListB. Minimize Permutation SubarraysC. No Prime DifferencesD. Bracket Walk A. Blackboard List Problem - A - Codeforces 一个只有两个数的数组&#xff0c;选择数组中的任意两个数&#xff0c;计算它们差值的绝对值并加入数组 给定一个长度为…

计算机竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

[JavaWeb]【十三】web后端开发-原理篇

目录 一、SpringBoot配置优先级 1.1 配置优先级比较 1.2 java系统属性和命令行参数 1.3 打包运行jar 1.4 综合优先级​编辑 二、Bean管理 2.1 获取bean 2.2 bean作用域 2.2.1 五种作用域 2.2.2 配置作用域 2.3 第三方bean 2.3.1 编写公共配置类 三、SpringBoot原理 …

二级MySQL(六)——表格数据插入

1、插入完整的数据记录&#xff1a; INSERT INTO tb_student VALUES(2014210103,王玲,女,1998-02-21,安徽,汉,CS1401); 结果&#xff1a; 2、插入指定位置的数据&#xff1a; 直接输入是错的&#xff1a; 需要指出插入的列名称&#xff1a; 结果&#xff1a; 中间两列允许输入…

cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 等等开头

不与世俗为伍。哪怕这是自己许给自己的诅咒。 —— 宫崎骏 《红猪》 最近&#xff0c;在使用最新版的AndroidStudio打开一个两年前的项目时候&#xff0c;报了一个如下的错误&#xff1a;【cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容】。应以 ‘…

基于PyTorch框架下网络模型的使用与修改

目录 1 损失函数和反向传播1.1 损失函数1.2 反向传播 2 优化器3 现有网络模型的使用及修改4 网络模型的保存与读取4.1 网络模型的保存4.2 网络模型的读取&#xff08;加载&#xff09; 5 完整的模型训练套路6 利用GPU训练模型7 完整的模型验证套路&#xff1a; 1 损失函数和反向…

基于DolphinScheduler的调度流程梳理及落地实践

目 录 01 背景‍ 02 主流调度引擎 ‍‍‍‍‍‍‍ 03 DolphinScheduler核心概念及调度过程‍‍‍‍‍‍ 04 开发实践 01‍ 背景‍‍ 随着数据中台概念及相关技术逐渐成熟、落地&#xff0c;不断有企业将其应用到自身业务中&#xff0c;将原本分散的各系统数据进行整合、分析…

【FAQ】安防监控视频汇聚平台EasyCVR接入GB国标设备,无法显示通道信息的排查方法

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

http协议与apache

http概念&#xff1a; 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络。即因特网概念从属于互联网概念 万维网&#xff1a;万维网并非某种特殊的计算机网络&#xff0c;是一个大规模的、联机式的信息贮藏库&…

【前端从0开始】JavaSript——Date对象

创建Date对象 var dateObjnew Date(); 方法 将日期转为字符串 toLocaleString() toLocaleDateString() toLocaleTimeString()获取年、月、日、小时、分、秒 ○1&#xff09;getYear() //两位的年(2000年前)或三位的年[1900] 获取两位数的年&#xff0c;从1900年开始计算&…

硬件知识积累 USB 接口 type - A type - B type - C 的介绍与功能说明 (简单介绍)

1. USB 的介绍 1.1 USB 的定义 USB : 通用串行总线(英语: Universal Serial Bus&#xff0c;缩写:USB)是一种串口总线标准&#xff0c;也是一种输入输出接口的技术规范&#xff0c;被广泛地应用于个人电脑和移动设备等信息通讯产品&#xff0c;并扩展至摄影器材、数字电视&a…

第四节 C++ 选择结构

文章目录 前言介绍1. if 选择结构1.1 概述1.2. 单 if 语句执行1.2.1 分号和中括号注意事项1.2.2 案例&#xff1a;判断天气 1.3. if - else 语句结构1.3.1 案例1&#xff1a;考试成绩1.3.2 案例2&#xff1a;判断闰年1.3.3 案例3&#xff1a;判断三角形 1.4. 多分支结构1.4.1 语…

VIT Swin Transformer

VIT&#xff1a;https://blog.csdn.net/qq_37541097/article/details/118242600 Swin Transform&#xff1a;https://blog.csdn.net/qq_37541097/article/details/121119988 一、VIT 模型由三个模块组成&#xff1a; Linear Projection of Flattened Patches(Embedding层) Tran…

linux服务TCP参数配置

Linux TCP参数配置 阿里云规范 1.【推荐】高并发服务器建议调小 TCP 协议的 time_wait 超时时间。 说明&#xff1a;操作系统默认 240 秒后&#xff0c;才会关闭处于 time_wait 状态的连接&#xff0c;在高并发访问下&#xff0c;服务器端会因为处于 time_wait 的连接数太多&am…

创邻科技张晨:图数据库,激活数据要素的新基建

“数据经济时代&#xff0c;数据要素产业链的各细分领域均蕴含机遇&#xff0c;图技术作为网络协同和数据智能的底层发动机&#xff0c;将深度掘金数字中国价值潜能”。 8月22日&#xff0c;在2023中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会的信息技术…