做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二次开发装配的部件事件、部件原型和部件实例相关推荐

  1. NX/UG二次开发—装配—克隆相关知识总结

    一.克隆部件或装配-七步法: 1. UF_CLONE_initialise 初始化克隆操作     2. UF_CLONE_add_assembly/UF_CLONE_add_part添加装配/部件文 ...

  2. UG二次开发装配篇 添加/拖动/删除组件方法的实现

    我们在UG装配的过程中,经常会遇到需要调整组件目录位置,在软件设计过程中可以通过在目录树里面拖动组件来完成. 那么,如果要用程序实现组件的移动/拖动,我们要怎么做呢? 本节就完成了添加/拖动/删除组件 ...

  3. UG二次开发在模具行业的应用

    UG二次开发在模具行业的应用 发布时间:2008-7-16 14:59:58 来源:互联网 转载自:http://www.yzw.cc/info/detail/46-11284.html 摘要:本文概 ...

  4. 使软件可二次开发_基于C++的?UG二次开发

    C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计.C++擅长面向对象程序设计的同时,还可以 ...

  5. NX/UG二次开发创建曲面偏置体

    NX/UG二次开发--创建曲面偏置体 创建曲面偏置体 1.曲面偏置 创建曲面偏置体 这里介绍了一种对模型曲面进行偏置来获得偏置体的方法. 1.曲面偏置 void OffsetFace(tag_t fa ...

  6. UG二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突

    文章出自https://blog.csdn.net/qq_41843732/article/details/91422764 在UG二次开发中,若使用MFC库,一旦加上#include<Afx. ...

  7. UG二次开发技术的研究

    摘 要:UG软件是美国EDS公司开发的一套集CAD/CAM/CAE一体的高端软件.UG是一个通用软件,用户必须在此基础上进行二次开发,才能满足专门模具设计的需要,提高设计效率.本文探讨UG二次开发技术 ...

  8. UG 二次开发中文帮助文档,UFun在线帮助文档, NX API 中文帮助文档

    UG 二次开发中文帮助文档,UFun在线帮助文档, NX API 中文帮助文档 在线的中文帮助文档,不用下载,网页直接查询函数: UFun函数中文帮助文档地址:http://www.ugapi.com ...

  9. UG二次开发教程(基于NX12.0/VS2015版本)

    ** UG二次开发教程(基于NX12.0/VS2015版本) 安装教程 ** UG NX12.0安装 NX12.0 安装包下载地址: 链接:https://pan.baidu.com/s/1I0CCF ...

最新文章

  1. 2021年大数据HBase(八):Apache Phoenix的基本介绍
  2. 财务一体化项目,进度与计划17
  3. javascript中的内置对象和数据结构
  4. 介绍一个能避免 CORS 错误的 Chrome 扩展 - Moesif Origin CORS Changer
  5. Mysql 字符操作函数相关
  6. C# 7.0中的解构功能---Deconstruct
  7. JavaScript之eval() 函数
  8. Angular使用总结 --- 模型驱动表单
  9. 鼠标悬浮显示全部内容 不然隐藏部分内容
  10. awstats 日志分析
  11. MASM32汇编SDK安装
  12. win10PE iso镜像制作及问题解决
  13. 秀米排版一篇文章,简简单单
  14. python删除数组元素_如何删除numpy数组中的特定元素
  15. 极力推荐收藏的几个高清免费图片素材网站
  16. ERROR 1018 (HY000): Can‘t read dir of ‘.‘ (errno: 13 - Permission denied)
  17. windows驱动开发8:虚拟摄像头方案
  18. LaTeX 表格标题位置无法移动的问题
  19. RCNN系列发展历程
  20. App开发智能车载应用之概述篇

热门文章

  1. java必会单词_java必会的英语单词
  2. 焊接入门——基础知识整理
  3. jqgrid 列排序
  4. 拼多多直通车推广做好关键性的一步:商品标题如何引流?
  5. 网易笔试001(HR之声)
  6. 详细解说笔记本电脑怎么录视频
  7. 史上最全,几百本常用书籍等你来取(面试,java,c,大数据,AI,python,数据结构等)
  8. 深入理解Nginx:java业务逻辑层都用什么技术
  9. 采用igraph包分析网络数据
  10. CSP 201609-3 炉石传说