NXOpen-python 點坐標的轉換
UG中有各種坐標系,比如說絕對坐標系、WCS、草圖坐標系等等,當我們在UG軟件中畫草圖時,我們輸入的坐標是草圖坐標,這沒有什么問題,但當我們需要通過代碼畫草圖時,問題就來了,例如,我們要在草圖中畫一個圓心坐標(10,10)的圓,在UG軟件中,我們可以直接輸入(10,10),但當我們通過代碼完成這一動作時,如果還把圓心坐標設為(10,10)那就大錯特錯,因為NXOpen中的Point3d是以絕對坐標系構造的,如果我們要在代碼中完成圓的創建,就要把圓心坐標轉換為絕對坐標系中的坐標:
通過journal也可以看出,絕對坐標系中的圓心坐標為(20.0,0.0,14.142),與我們輸入的坐標(10,10)相差甚遠,那么怎樣轉換呢?NXOpen-Python中的NXOpen.UF對uf_mtx.h中的函數進行了包裝,對於上述問題,我們需要用到UFMtx4函數,NXOpen-Python將這些函數包裝在class NXOpen.UF.
Mtx4類中
import NXOpen import NXOpen.UF theSession: NXOpen.Session = NXOpen.Session.GetSession() theUfSession: NXOpen.UF.UFSession = NXOpen.UF.UFSession.GetUFSession() workPart: NXOpen.Part = theSession.Parts.Work lw: NXOpen.ListingWindow = theSession.ListingWindow lw.Open() mtx4: NXOpen.UF.Mtx4 = theUfSession.Mtx4 mtx3: NXOpen.UF.Mtx3 = theUfSession.Mtx3 sketch: NXOpen.Sketch = list(workPart.Sketches)[ 0] # 實際編程時在創建草圖時就可以直接獲取該草圖對象,不用像這樣 lw.WriteLine(str(sketch.Origin)) lw.WriteLine(str(sketch.Orientation.Element)) matrix_sketch = mtx4.Initialize( 1.0, [sketch.Origin.X, sketch.Origin.Y, sketch.Origin.Z], mtx3.Transpose([sketch.Orientation.Element.Xx, sketch.Orientation.Element.Xy, sketch.Orientation.Element.Xz, sketch.Orientation.Element.Yx, sketch.Orientation.Element.Yy, sketch.Orientation.Element.Yz, sketch.Orientation.Element.Zx, sketch.Orientation.Element.Zy, sketch.Orientation.Element.Zz])) lw.WriteLine('草圖坐標(10,10)對應的絕對坐標系中坐標為' + str(mtx4.Vec3Multiply([10.0, 10.0, 0.0], matrix_sketch)))
輸出信息如下:
[X=20,Y=0,Z=0] [Xx=-0,Xy=0.70710678118654757,Xz=0.70710678118654757,Yx=0,Yy=-0.70710678118654757,Yz=0.70710678118654757,Zx=1,Zy=0,Zz=0] 草圖坐標(10,10)對應的絕對坐標系中坐標為[20.0, 0.0, 14.142135623730951]
可以看出,坐標與journal中一致。
如果坐標系只涉及旋轉,不涉及平移,則Mtx3就能處理,如果坐標系原點也發生了改變,則需要借助Mtx4