深度解析UG二次开发装配的部件事件、部件原型和部件实例
做UG二次开发快一年了,每次遇到装配的问题涉及到部件事件、部件原型和部件实例还是一头雾水,什么是实例,什么是原型这些专业术语等等。
针对这个问题,今天专门写了一篇特辑,结合装配实例深度剖析装配过程中的的所有参数。
先来看看装配相关的基本概念:
UG装配是以树型结构组织装配中的部件,一个部件文件中只能有一棵装配树,即只能存在一个装配根节点。装配中的节点由部件原型、部件事件与部件实例3种对象进行描述。
- 部件事件(partoccurrence)是装配环境下对实际存在的部件模型(即部件原型)的一种引用,部件事件也可以理解为指向部件原型的指针。如果需要一次或多次装配一个部件,并不复制该部件的原型,而是建立该部件原型所对应的事件。在装配中,不同的部件事件表征不同的装配节点,因此UG赋予它唯一的标识。
- 部件原型(partPrototype)是真实存在的部件模型,它记录了模型所需的所有数据。当一个部件文件被多次装入时,将产生不同的部件事件,但这些事件都指向相同的部件原型。可以看出,部件原型与部件事件之间形成一对多的映射关系。部件事件随原型的改变而改变,但修改部件事件不会影响它的原型。
- 部件实例(partInstance)记录子节点与其父节点之间的关联关系,从而形成各节点间的层次结构。在装配体重,部件与其子部件之间的装配关系是利用部件实例来描述的。部件实例是指一次或多次装入装配体的部件对象,它描述装配环境下实例之间的层次关系,并表征唯一的上下级部件间的装配关系。部件实例也可以理解为一种指针,由下级部件事件指向上一级部件事件。可以看出,部件实例与部件事件之间形成一对多的映射关系,即不同的装配节点可能具有相同的装配关系。
一、实例截图及免费下载地址
从截图可以看到,本实例创建了一个简单的装配,为了方便区分各节点特意用了:2个球、1个圆柱、一个圆锥和一个长方体来进行案例分析。
实例免费下载地址入口:https://download.csdn.net/download/MarcoPro/87452892
二、 部件事件、部件原型和部件实例分析
光看上面的概念,很难理解部件事件、部件原型和部件实例到底是什么,更不要提怎么用了,那么我们先把所有节点的数据拿出来看一下:
上图的数字都是相关属性的Tag值,从上之下三层代表了装配的层级关系,其中根节点下有:2个球和2个长方体,长方体下面有两个子节点:圆柱和圆锥。下面我会逐个分析所有节点:
1、根节点_asm1
根节点比较特殊,因为他没有原型,实际上是一个虚拟的节点,参数获取方法如下:
workpart = theUFSession.Assem.AskWorkPart(); //获得当前workpart的部件 tag
workocc = theUFSession.Assem.AskWorkOccurrence(); //获得当前workpart的occurrence tag
2、二级节点COMPONENT ball 1、COMPONENT ball 2和COMPONENT block 1
1)为什么这里要做2个球体,就是为了看看来自同一个零件原型的节点,他的部件原型是否相同。
从数据不难发现,他们有相同的部件原型tag:32161,有不同的部件事件33595和33597,不同的部件实例33581和33580,然后他们的父部件和父部件事件是相同的。
2)反观同样在二级目录的球和长方体的数据,他们的部件事件、部件原型和部件实例都是不一样的,父部件和父部件事件是相同的。
3、三级节点COMPONENT Cylinder 1和COMPONENT Cone 1
从长方体和圆柱体、圆锥的数据不难发现,部件事件、部件原型和部件实例以及父节点和子节点的关系已经很明朗了。
三、 部件事件、部件原型和部件实例数据的获取方法
那么,上面的数据是怎么获取的呢?下面直接上源码:
1、调用主方法
theSession = Session.GetSession();
displayPart = theSession.Parts.Display;
List<Component> allComponents = new List<Component>();
List<ComponentModel> componentList = new List<ComponentModel>();
Component root = displayPart.ComponentAssembly.RootComponent;
if (root != null)
{AssemHelper.GetAllComponents(displayPart.ComponentAssembly.RootComponent, allComponents, componentList);
}theUFSession = UFSession.GetUFSession();
Tag workpart;
Tag workocc;
workpart = theUFSession.Assem.AskWorkPart(); //获得当前workpart的prototype tag
workocc = theUFSession.Assem.AskWorkOccurrence(); //获得当前workpart的occurrence tag
if (workocc == Tag.Null) workocc = theUFSession.Assem.AskRootPartOcc(workpart);int ChildOccNum = 0;
Tag[] childOccs; //子组件的occurrence
ChildOccNum = theUFSession.Assem.AskPartOccChildren(workocc, out childOccs);Tag[] childInstances = new Tag[ChildOccNum]; //子组件的instance
for (int i = 0; i < ChildOccNum; i++)
{Tag childInstance = theUFSession.Assem.AskInstOfPartOcc(childOccs[i]);childInstances[i] = childInstance;
}int ChildOccNum1 = 0;
Tag[] childOccs1;
ChildOccNum1 = theUFSession.Assem.AskPartOccChildren((Tag)int.Parse("33592"), out childOccs1);Tag[] childInstances1 = new Tag[ChildOccNum1]; //子组件的instance
for (int i = 0; i < ChildOccNum1; i++)
{Tag childInstance1 = theUFSession.Assem.AskInstOfPartOcc(childOccs1[i]);childInstances1[i] = childInstance1;
}
2、子方法
/// <summary>
/// 用递归获得所有组件的方法
/// </summary>
/// <param name="fatherComponent">父组件</param>
/// <param name="allComponents">全部的组件集合</param>
public static void GetAllComponents(Component fatherComponent, List<Component> allComponents, List<ComponentModel> componentsList)
{theUFSession = UFSession.GetUFSession();Component[] tempComponent = fatherComponent.GetChildren(); //得到子组件数组foreach (Component x in tempComponent)//没有子组件时foreach的语句不会执行,跳出递归{allComponents.Add(x);string partName, refsetName, instanceName;double[] origin = new double[3]; //组件的位置double[] csys_matrix = new double[9]; //坐标系矩阵double[,] transform = new double[4, 4]; //转换矩阵theUFSession.Assem.AskComponentData(x.Tag, out partName, out refsetName, out instanceName, origin, csys_matrix, transform);ComponentModel model = new ComponentModel();model.origin = new double[3];model.csys_matrix = new double[9];model.transform = new double[4, 4];model.origin = origin;model.csys_matrix = csys_matrix;model.transform = transform;model.partName = partName;model.refsetName = refsetName;model.instanceName = instanceName;model.journalIdentifier = x.JournalIdentifier;componentsList.Add(model);GetAllComponents(x, allComponents, componentsList);}
}
四、小节
通过上面的梳理,我们了解了部件事件、部件原型和部件实例的基本概念以及在装配过程中的具体数据表现形式。
但是说实话,在实际项目中这些概念似乎并不是必须有用的,比如在使用Nxopen进行开发的过程中,我们不需要了解部件原型和部件事件,我们只需要找到component Tag就能去操作零件,其实这里的component Tag就是部件事件。
作为一名合格的程序员,我相信大家都有专研精神,对于黑盒的深入了解才是一步一步走向职业生涯巅峰的正确途径。
相关文章:

深度解析UG二次开发装配的部件事件、部件原型和部件实例
做UG二次开发快一年了,每次遇到装配的问题涉及到部件事件、部件原型和部件实例还是一头雾水,什么是实例,什么是原型这些专业术语等等。 针对这个问题,今天专门写了一篇特辑,结合装配实例深度剖析装配过程中的的所有参数…...

Linux安装elasticsearch-head
elasticsearch-head 是一款专门针对于 elasticsearch 的客户端工具,用来展示数据。 elasticsearch-head 是基于 JavaScript 语言编写的,可以使用 Nodejs 下的包管理器 npm 部署。 1 安装Nodejs nodejs下载地址: https://nodejs.org/en/dow…...

MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)
网络上有很多MySQL表碎片整理的问题,大多数是通过demo一个表然后参考data free来进行碎片整理,这种方式对myisam引擎或者其他引擎可能有效(本人没有做详细的测试).对Innodb引擎是不是准确的,或者data free是不是可以参…...

Leetcode-每日一题1250. 检查「好数组」(裴蜀定理)
题目链接:https://leetcode.cn/problems/check-if-it-is-a-good-array/description/ 思路 方法:数论 题目意思很简单,让你在数组 nums中选取一些子集,可以不连续,子集中的每个数再乘以任意的数的和是否为1ÿ…...

OpenStack手动分布式部署环境准备【Queens版】
目录 1.基础环境准备(两个节点都需要部署) 1.1关闭防火墙 1.2关闭selinux 1.3修改主机名 1.4安装ntp时间服务器 1.5修改域名解析 1.6添加yum源 2.数据库安装配置 2.1安装数据库 2.2修改数据库 2.3重启数据库 2.4初始化数据库 3.安装RabbitMq…...

Web自动化测试——selenium的使用
⭐️前言⭐️ 本篇文章就进入了自动化测试的章节了,如果作为一名测试开发人员,非常需要掌握自动化测试的能力,因为它不仅能减少人力的消耗,还能提升测试的效率。 🍉欢迎点赞 👍 收藏 ⭐留言评论 …...
虚拟交换单元技术
支持VSU(Virtual Switch Unit)即虚拟交换单元技术。通过聚合链路连接,将多台物理设备虚拟为一台逻辑上统一的设备,使其能够实现统一的运行,利用单一IP 地址、单一Telnet 进程、单一命令行接口(CLI)、自动版本检查、自动…...

【STM32笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时
【STM32笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时 外部定时器 采用定时器做延时使用时 需要计算好分频和计数 另外还要配置为不进行自动重载 对于50MHz的工作频率 分频为50-1也就是50M/501M 一次计数为1us 分频为50000-1也就是1k 一次计数为1ms 我配置的是TIM6 只…...
[Springboot 单元测试笔记] - Mock 和 spy的使用
Springboot单元测试 - 依赖类mock测试 通常单元测试中,我们会隔离依赖对于测试类的影响,也就是假设所有依赖的一定会输出理想结果,在测试中可以通过Mock方法来确保输出结果,这也就引入另一个测试框架Mockito。 Mockito框架的作用…...

互联网新时代要来了(二)什么是AIGC?
什么是AIGC? 最近,又火了一个词“**AIGC”**2022年被称为是AIGC元年。那么我们敬请期待,AIGC为我们迎接人工智能的下一个时代。 TIPS:内容来自百度百科、知乎、腾讯、《AIGC白皮书》等网页 什么是AIGC?1.什么是AIGC?…...

75V的TVS二极管有哪些型号?常用的
瞬态抑制TVS二极管工作峰值反向电压最低3.3V,最高可达513V,甚至更高。很多电子工程师都知道,TVS二极管在实际应用选型过程中,第一步要确认的就是其工作峰值反向电压。2023年春节已过,东沃电子正月初八就开工了…...

测试开发之Django实战示例 第十章 创建在线教育平台
第十章 创建在线教育平台在上一章,我们为电商网站项目添加了国际化功能,还创建了优惠码和商品推荐系统。在本章,会建立一个新的项目:一个在线教育平台,并创内容管理系统CMS(Content Management System&…...

Hadoop高可用搭建(二)
目录 解压Hadoop 改名 更改配置文件 workers hdfs-site.xml core-site.xml hadoop-env.sh mapred-site.xml yarn-site.xml 设置环境变量 启动集群 启动zk集群 启动journalnode服务 格式化hfds namenode 启动namenode 同步namenode信息 查看namenode节点状态 …...
如何用企微SCRM管理系统发掘老客户的新增长点?
如何用企微SCRM管理系统发掘老客户的新增长点? 一直做投放拉新,很快营销成本会难以支撑,如果在私域运营中始终留不下老用户,那么运营也是失败的。 开发老客户的成本只需新客户成本的1/6,但很多企业对老客户都忽视了&…...

我用python疯狂爬取公司数据
我是半路从一个纯小白学过来的,学习途中也掉过许多坑,在这里建议新手要先把基础打扎实,然后再去学习自己需要的内容,不要想着全部学完再用,那样你是永远学不完的,用哪方面就学习哪方面的内容,不…...
EMR集群运行TPC-DS在云盘和OSS中的对比
1.简介 TPC-DS是大数据领域最为知名的Benchmark标准。本文介绍使用阿里云EMR集群运行TPC-DS在云盘和OSS中的表现对比。 2.环境准备 1.创建EEMR-5.10.1集群 1个master,2个core,3台机器都s是4c16g。 2.安装Git和Maven sudo yum install -y git maven3.下载TPC-DS Benchmark工…...

菜鸟在 windows 下 python 中安装 jupyter 踩坑要点 、被神化的 VsCode
我平时用不到 python ,更没用过 jupyter ,因此我的 python知识仅限于知道有 python 这么个编程语言,会写个 print("Hello World!!!") 而已,完全没听过 jupyter ,因为某些原因今天需要安装下 jupyter 看看&am…...

k8s简单搭建
前言 最近学习k8s,跟着网上各种教程搭建了简单的版本,一个master节点,两个node节点,这里记录下防止以后忘记。 具体步骤 准备环境 用Oracle VM VirtualBox虚拟机软件安装3台虚拟机,一台master节点,两台…...

计算机SCI期刊审稿人,一般关注论文的那些问题? - 易智编译EaseEditing
编辑主要关心: (1)文章内容是否具有足够的创新性? (2)文章主题是否符合期刊的受众读者? (3)文章方法学是否合理,数据处理是否充分? (…...
Docker迁移以及环境变量问题
问题一描述将docker容器通过docker export命令打包,传输到另外的服务器,再通过docker import命令导入后,发现原来docker容器中的环境变量失效了。解决方案1. 【无效方案】直接在docker容器中通过export命令设置环境变量。export LD_LIBRARY_P…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...

GraphRAG优化新思路-开源的ROGRAG框架
目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...