UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer

news2024/11/25 2:43:34

 列文章目录

UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer


目录

 列文章目录

前言

一、知识点提取汇总

二、案例需求分析

1、最终效果图

 2、需求分解

三、程序分析

1、源码所在目录

2、主要功能分析


前言

        随着工业智能化的不断发展,UG二次开发的需求越来越多,也吸引了大批的二开从业人员,本人作为一名资深IT从业者(10年+)也毅然加入二次开发大军。

        然而,和流行IT行业(互联网、金融、医疗等)相比,工业智能化的门槛显得更高一点,专业的工业软件,相对封闭的开发理念和更小的开发圈子,让刚进入二开的从业者有点举步维艰。边学边整理,希望通过这系列文章的整理能给二开的生态增添一叶绿。


一、知识点提取汇总

1、树列表控件的初始化和数据加载

2、选择对象控件过滤器使用

3、对象颜色拾取器的使用

4、遍历组件方法的实现

5、树列表控件通过递归方法实现多层目录加载

二、案例需求分析

1、最终效果图

 

 2、需求分解

本案的需求分解如下:

1)加载装配目录到树列表,通过选取树列表的方式,实现配件的选取

2)也可以通过组件选择器的方式,选取配件

3)为选取的配件设置颜色

三、程序分析

1、源码所在目录

UGOPEN\SampleNXOpenApplications\C++\AssemblyViewer

 2、主要功能分析

1)树列表控件的初始化和回调方法

treeList = dynamic_cast<NXOpen::BlockStyler::Tree*>(theDialog->TopBlock()->FindBlock("treeList"));
//注册回调方法
treeList->SetOnSelectHandler(make_callback(this, &AssemblyViewer::OnSelectCallback));

void AssemblyViewer::OnSelectCallback(NXOpen::BlockStyler::Tree *tree, NXOpen::BlockStyler::Node *, int columnID, bool selected)
{
    try
    {
        if(selected == true)
        {
            PartCleanup();
            ComponentSelection();
        }        
    }
    catch(exception& ex)
    {
    }
}
void AssemblyViewer::ComponentSelection()
{
    try
    {
        bool singleComponent = IsSingleComponentSelection();       
        std::vector<NXOpen::TaggedObject *>selObjectData = GetSelectedObjects();
        std::vector<NXOpen::TaggedObject *>selNodeComps = GetSelectedNodes();    
        // Create a DisplayModification object to set the color
        if (selObjectData.size()>0)
        {
            HighlightComponent(selObjectData,false);
            drawAll = singleComponent?false:true;
            HighlightComponent(selObjectData, true);
        }
        if (selNodeComps.size()>0)
        {                
            HighlightComponent(selNodeComps,false);
            drawAll = singleComponent?false:true;
            HighlightComponent(selNodeComps, true);
        }        
    }
    catch(exception& ex)
    {
    }
}

2) 树列表控件通过递归方法实现多层目录加载

void AssemblyViewer::PopulateTree(NXOpen::Assemblies::Component *component)
{
    std::vector<Component *> childComponent = component->GetChildren();    
    int childComponentCount = childComponent.size();
    for(int i=0; i<childComponentCount; ++i)
    {
        BlockStyler::Node *node = treeList->CreateNode(childComponent[i]->Name());
        NXOpen::DataContainer *nodeData = node->GetNodeData();
        nodeData->AddTaggedObject("Data",childComponent[i]);
        treeNodes.push_back(node);
        delete nodeData;
        nodeData = NULL;
        node->SetForegroundColor(198);
        treeList->InsertNode(node,parentNode,NULL,treeList->NodeInsertOptionLast);
        parentNode = node;
        PopulateTree(childComponent[i]);
        parentNode = node->ParentNode();    
    }
}

3) 选择对象控件过滤器使用

selComponent = dynamic_cast<NXOpen::BlockStyler::UIBlock*>(theDialog->TopBlock()->FindBlock("selComponent"));
 NXOpen::Selection::SelectionAction action = Selection::SelectionActionClearAndEnableSpecific;
        std::vector<NXOpen::Selection::MaskTriple>selectionMask_array(2);
        selectionMask_array[0].Type = UF_component_type ;
        selectionMask_array[0].Subtype = UF_component_subtype  ;
        selectionMask_array[1].Type = UF_component_type;
        selectionMask_array[1].Subtype = UF_part_occurrence_subtype;
		NXOpen::BlockStyler::PropertyList *selComponentProps = selComponent->GetProperties();
        selComponentProps->SetSelectionFilter("SelectionFilter",action,selectionMask_array);
		delete selComponentProps;
		selComponentProps = NULL;

4) 对象颜色拾取器的使用

 NXOpen::BlockStyler::PropertyList *selColorProps =selColor->GetProperties();
std::vector<int > colorValue = selColorProps->GetIntegerVector("Value");            

5) 遍历组件方法的实现

void AssemblyViewer::PopulateTree(NXOpen::Assemblies::Component *component)
{
    std::vector<Component *> childComponent = component->GetChildren();    
    int childComponentCount = childComponent.size();
    for(int i=0; i<childComponentCount; ++i)
    {
        BlockStyler::Node *node = treeList->CreateNode(childComponent[i]->Name());
        NXOpen::DataContainer *nodeData = node->GetNodeData();
        nodeData->AddTaggedObject("Data",childComponent[i]);
        treeNodes.push_back(node);
        delete nodeData;
        nodeData = NULL;
        node->SetForegroundColor(198);
        treeList->InsertNode(node,parentNode,NULL,treeList->NodeInsertOptionLast);
        parentNode = node;
        PopulateTree(childComponent[i]);
        parentNode = node->ParentNode();    
    }
}

遍历组件主要用了GetChildren()方法:

std::vector<Component *> childComponent = component->GetChildren();

然后通过PopulateTree递归的方式实现对组件的所有目录的遍历

6)设置所选组件的颜色

void AssemblyViewer::ApplyColor(std::vector<NXOpen::TaggedObject *>&selObjectData)
{
    try
    {
        //---- Enter your callback code here -----
        NXOpen::BlockStyler::PropertyList *selColorProps =selColor->GetProperties();
        std::vector<int > colorValue = selColorProps->GetIntegerVector("Value");            
        delete selColorProps;
        selColorProps = NULL;      

        DisplayModification *displayModification1 = theSession->DisplayManager()->NewDisplayModification();       
        displayModification1->SetApplyToAllFaces(false);
        displayModification1->SetApplyToOwningParts(false);
        displayModification1->SetNewColor(colorValue[0]);
        std::vector<DisplayableObject *> objects1;
		int selObjectCount = selObjectData.size();
        for(int i=0; i<selObjectCount; ++i)
        {
            objects1.push_back(dynamic_cast<NXOpen::DisplayableObject *>(selObjectData[i]));
        }
        displayModification1->Apply(objects1);
        objects1.clear();
        delete displayModification1;
        displayModification1 = NULL;

        PartCleanup();        
    }
    catch(exception& ex)
    {
    }
}

 使用displayModification类,实现了对所选对象的颜色设置

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

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

相关文章

[1]物联网基础知识

前言 学习教程&#xff1a;B站太极创客&#xff0c;原教程采用的开发板为ESP8266&#xff0c;开发环境Arduino 本人使用开发板&#xff1a;ESP32S3&#xff0c;开发环境Vscode中的platformio&#xff0c;框架为Arduino 乐鑫科技&#xff1a;ESPRESSIF 注意&#xff1a;引脚…

机器人开发--CanOpen

机器人开发--CanOpen1 介绍1.1 概述1.2 应用2 历史发展3 协议3.1 协议细节&#xff08;来自CiA文档&#xff09;3.2 协议框架OSI 模型服务COB-IDNMTSYNC紧急事件对象 (EMCY)服务数据对象 (SDO)SDO 下载SDO 上传SDO 加速写传输报文过程数据对象PDO3.3 应用细节&#xff08;伺服电…

基于springboot+mybatis+mysql+layui员工工资管理系统

基于springbootmybatismysqllayui员工工资管理系统一、目的二、需求功能划分系统结构设计软件界面截图三、系统开发配置一、目的 ​ 运用JavaEE企业级系统开发、数据库系统、面向对象技术及UML以及软件需求工程所学专业知识&#xff0c;解决所设定业务领域软件开发中的需求分析…

2021一带一路暨金砖大赛之企业信息系统安全赛项AWD_writeup

更多详情私聊博主 订阅专栏解锁更多~~觉得不错麻烦点个赞~~~ AWD_writeup 主要考点:后门账户、数据库操作、cve漏洞、后门漏洞、自动化攻击 1、解法一 ssh弱口令账户 用户登录后cat /etc/passwd 发现系统存在额外账户 使用msf进行ssh爆破尝试 msfconsole use auxiliary/sca…

洛谷 最长公共子序列

LCS 题面翻译 题目描述&#xff1a; 给定一个字符串 sss 和一个字符串 ttt &#xff0c;输出 sss 和 ttt 的最长公共子序列。 输入格式&#xff1a; 两行&#xff0c;第一行输入 sss &#xff0c;第二行输入 ttt 。 输出格式&#xff1a; 输出 sss 和 ttt 的最长公共子序…

程序的动态链接(4):动态链接信息

前言 操作系统在执行动态链接的可执行文件时&#xff0c;会首先加载动态链接器&#xff0c;然后由动态链接器根据保存在可执行文件中的动态链接信息&#xff0c;完成依赖动态库的加载、符号解析以及重定位等工作。这些动态链接信息包括但不限于&#xff1a; 动态链接器路径&a…

联邦调查局和国际执法合作加强打击非法DDS攻击

©网络研究院 美国司法部在12月14日查封了48个出售“booter”或“stresser”服务的域名&#xff0c;这些服务使非技术用户可以轻松、廉价地发起强大的分布式拒绝服务(DDoS)攻击&#xff0c;旨在离线攻击目标。 司法部还指控六名美国男子犯有计算机罪&#xff0c;他们涉嫌…

基于simulink的PV光伏发电MPPT仿真

up目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 由于人口增加、城市化和工业化&#xff0c;能源需求与日俱增&#xff0c;可再生能源是我们传统能源的替代品&#xff0c;因为传统能源是有限的&#xff0c;而且会过期。 太阳能、风能和水能等清洁能源变得越来越…

老生常谈React的diff算法原理-面试版

第一次发文章 not only&#xff08;虽然&#xff09;版式可能有点烂 but also &#xff08;但是&#xff09;最后赋有手稿研究 finally看完他你有收获 diff算法&#xff1a;对于update的组件&#xff0c;他会将当前组件与该组件在上次更新是对应的Fiber节点比较&#xff0c;将比…

关于2022年国内软件质量调查问卷的一些感悟与收获

&#x1f4cb;前言 1️⃣关于2022年国内软件质量调查主题征文活动 CSDN《2022年国内软件质量调查》正式开启&#xff0c;我们诚邀各位博主&#xff0c;特别是测试领域的各位技术er参与调查&#xff0c;并围绕主题&#xff0c;撰写《我填写“2022年国内软件质量调查问卷”的感想…

刷了一个月面试题,终于拿到了字节跳动的offer

一面 自我介绍项目中的监控&#xff1a;那个监控指标常见的有哪些&#xff1f;微服务涉及到的技术以及需要注意的问题有哪些&#xff1f;注册中心你了解了哪些&#xff1f;consul 的可靠性你了解吗&#xff1f;consul 的机制你有没有具体深入过&#xff1f;有没有和其他的注册…

(二)fiber的基本认识

上一篇文章我们了解了react新老结构的差异以及存在的缺点&#xff0c;其中react的解决方案就是采用fiber架构和添加Schedule模块。 ✍️&#xff1a;Schedule模块的主要工作是任务的调度&#xff0c;负责调度不同优先级任务的执行时机&#xff0c;这个我们后面再讲&#xff0c;…

Ardor公链生态与Jelurida产业区块链布局

Ardor公链 Ardor公链&#xff08;ARDR&#xff09;基于NXT公链&#xff0c;并于2018年1月1日推出了多链架构&#xff0c;旨在克服单链本质上的局限性。根据Ardor平台的白皮书&#xff0c;其主要目标是&#xff1a; 解决最终用户必须拥有作为手续费&#xff08;Gas费&#xff…

FineReport复杂表格软件- 相对层次坐标

1. 概述 相对层次坐标是用来描述目标单元格和当前单元格之间的位置关系的表达式&#xff0c;概念图如下图所示&#xff1a; 说明&#xff1a; 参数 说明 Cellx 表示需要返回结果的单元格 Celly 表示位移时参考的单元格 z 代表相对位移的位置 注&#xff1a;相对后移需要…

【Linux】必须掌握的Linux常见指令分类讲解

目录一.Linux下的文件树二.工作目录切换命令1.ls——显示当前路径下的文件和目录2.pwd——显示当前目录的绝对值路径3.cd——切换至指定目录三.文件目录管理命令1.touch——创建空文件2.tree——树状打印目录3.mkdir——创建目录4.rmdir 和 rm ——删除目录5.cp——拷贝文件或目…

Python编程小白入门技巧,从入门到精通只需一个月。

毫无疑问&#xff0c;Python 是当下最火的编程语言之一。对于许多未曾涉足计算机编程的领域「小白」来说&#xff0c;深入地掌握 Python 看似是一件十分困难的事。其实&#xff0c;只要掌握了科学的学习方法并制定了合理的学习计划&#xff0c;Python 从 入门到精通只需要一个月…

【iOS】接口与API设计

文章目录前言用前缀避免命名空间冲突提供“全能初始化方法”实现description方法尽量使用不可变对象使用清晰而协调的命名方式方法命名类与协议的命名为私有方法名加前缀理解Objective-C错误模型理解NSCopying协议前言 我们在构建程序应用时&#xff0c;如果决定重用代码&…

DPDK 网卡驱动学习

DPDK版本19.02 初始化&#xff1a; /* Launch threads, called at application init(). */ int rte_eal_init(int argc, char **argv) {.../* rte_eal_cpu_init() ->* eal_cpu_core_id()* eal_cpu_socket_id()* 读取/sys/devices/system/[cpu|node]* 设置lcore_con…

考试管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;老师模块、班级模块、学生模块、课程模块、试题模块、试卷模块、 组卷模块、考试模块、答题模块 管…

Python数据分析实战之用户消费行为数据分析

任务1&#xff1a;数据预处理 表格数据资源如下百度网盘&#x1f447; 链接&#xff1a;https://pan.baidu.com/s/1pUYfRIe557v6O9ByB2rhEw 提取码&#xff1a;ovgl import numpy as np import pandas as pd import matplotlib.pyplot as plt # %matplotlib inline # 更改绘…