深度解析UG二次开发装配的部件事件、部件原型和部件实例
????????做UG二次開發(fā)快一年了,每次遇到裝配的問題涉及到部件事件、部件原型和部件實例還是一頭霧水,什么是實例,什么是原型這些專業(yè)術語等等。
????????針對這個問題,今天專門寫了一篇特輯,結合裝配實例深度剖析裝配過程中的的所有參數(shù)。
先來看看裝配相關的基本概念:
UG裝配是以樹型結構組織裝配中的部件,一個部件文件中只能有一棵裝配樹,即只能存在一個裝配根節(jié)點。裝配中的節(jié)點由部件原型、部件事件與部件實例3種對象進行描述。
- 部件事件(partoccurrence)是裝配環(huán)境下對實際存在的部件模型(即部件原型)的一種引用,部件事件也可以理解為指向部件原型的指針。如果需要一次或多次裝配一個部件,并不復制該部件的原型,而是建立該部件原型所對應的事件。在裝配中,不同的部件事件表征不同的裝配節(jié)點,因此UG賦予它唯一的標識。
- 部件原型(partPrototype)是真實存在的部件模型,它記錄了模型所需的所有數(shù)據(jù)。當一個部件文件被多次裝入時,將產(chǎn)生不同的部件事件,但這些事件都指向相同的部件原型??梢钥闯?#xff0c;部件原型與部件事件之間形成一對多的映射關系。部件事件隨原型的改變而改變,但修改部件事件不會影響它的原型。
- 部件實例(partInstance)記錄子節(jié)點與其父節(jié)點之間的關聯(lián)關系,從而形成各節(jié)點間的層次結構。在裝配體重,部件與其子部件之間的裝配關系是利用部件實例來描述的。部件實例是指一次或多次裝入裝配體的部件對象,它描述裝配環(huán)境下實例之間的層次關系,并表征唯一的上下級部件間的裝配關系。部件實例也可以理解為一種指針,由下級部件事件指向上一級部件事件。可以看出,部件實例與部件事件之間形成一對多的映射關系,即不同的裝配節(jié)點可能具有相同的裝配關系。
一、實例截圖及免費下載地址
從截圖可以看到,本實例創(chuàng)建了一個簡單的裝配,為了方便區(qū)分各節(jié)點特意用了:2個球、1個圓柱、一個圓錐和一個長方體來進行案例分析。
?實例免費下載地址入口:https://download.csdn.net/download/MarcoPro/87452892
二、?部件事件、部件原型和部件實例分析
光看上面的概念,很難理解部件事件、部件原型和部件實例到底是什么,更不要提怎么用了,那么我們先把所有節(jié)點的數(shù)據(jù)拿出來看一下:
?上圖的數(shù)字都是相關屬性的Tag值,從上之下三層代表了裝配的層級關系,其中根節(jié)點下有:2個球和2個長方體,長方體下面有兩個子節(jié)點:圓柱和圓錐。下面我會逐個分析所有節(jié)點:
1、根節(jié)點_asm1
根節(jié)點比較特殊,因為他沒有原型,實際上是一個虛擬的節(jié)點,參數(shù)獲取方法如下:
workpart = theUFSession.Assem.AskWorkPart(); //獲得當前workpart的部件 tag workocc = theUFSession.Assem.AskWorkOccurrence(); //獲得當前workpart的occurrence tag2、二級節(jié)點COMPONENT?ball?1、COMPONENT?ball 2和COMPONENT?block?1
1)為什么這里要做2個球體,就是為了看看來自同一個零件原型的節(jié)點,他的部件原型是否相同。
從數(shù)據(jù)不難發(fā)現(xiàn),他們有相同的部件原型tag:32161,有不同的部件事件33595和33597,不同的部件實例33581和33580,然后他們的父部件和父部件事件是相同的。
2)反觀同樣在二級目錄的球和長方體的數(shù)據(jù),他們的部件事件、部件原型和部件實例都是不一樣的,父部件和父部件事件是相同的。
3、三級節(jié)點COMPONENT?Cylinder?1和COMPONENT?Cone?1
從長方體和圓柱體、圓錐的數(shù)據(jù)不難發(fā)現(xiàn),部件事件、部件原型和部件實例以及父節(jié)點和子節(jié)點的關系已經(jīng)很明朗了。?
三、?部件事件、部件原型和部件實例數(shù)據(jù)的獲取方法
那么,上面的數(shù)據(jù)是怎么獲取的呢?下面直接上源碼:
1、調(diào)用主方法
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(); //得到子組件數(shù)組foreach (Component x in tempComponent)//沒有子組件時foreach的語句不會執(zhí)行,跳出遞歸{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);} }?四、小結
????????通過上面的梳理,我們了解了部件事件、部件原型和部件實例的基本概念以及在裝配過程中的具體數(shù)據(jù)表現(xiàn)形式。
????????但是說實話,在實際項目中這些概念似乎并不是必須有用的,比如在使用Nxopen進行開發(fā)的過程中,我們不需要了解部件原型和部件事件,我們只需要找到component Tag就能去操作零件,其實這里的component Tag就是部件事件。
????????作為一名合格的程序員,我相信大家都有專研精神,對于黑盒的深入了解才是一步一步走向職業(yè)生涯巔峰的正確途徑。
總結
以上是生活随笔為你收集整理的深度解析UG二次开发装配的部件事件、部件原型和部件实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (附源码)spring boot校园购物
- 下一篇: 【实现】树莓派开机自动向微信发消息报告i