日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深度解析UG二次开发装配的部件事件、部件原型和部件实例

發布時間:2024/3/13 编程问答 77 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度解析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二次开发装配的部件事件、部件原型和部件实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。