NX Journal 作業パート基準のバウンディングボックスを取得

2022/01/05 categories:NX Journal| tags:NX Journal|Python|

作業パート基準のバウンディングボックスを取得するジャーナルを作成してみました。

概要

下記のコードでボディのバウンディングボックスを取得することが出来ます。

import NXOpen.UF
NXOpen.UF.UFSession.GetUFSession().ModlGeneral.AskBoundingBox(body.Tag)

しかし、アセンブリの子部品のバウンディングボックスを取得した場合、子部品の座標系基準の座標が得られるので、親の座標系基準の座標が欲しい場合は座標の計算をする必要があります。必要な計算内容は以下の通りです。

実行結果

情報ウィンドウに以下のように1階層下の子部品のバウンディングボックスが表示されます。

x min 85.0, x max 115.0, y min 80.0, y max 180.0, z min 105.0, z max 135.0

Pythonコード

import NXOpen
import NXOpen.UF

def main():
    theSession  = NXOpen.Session.GetSession()
    theUfSession  = NXOpen.UF.UFSession.GetUFSession()
    workPart = theSession.Parts.Work
    lw = theSession.ListingWindow
    lw.Open()

    for child in workPart.ComponentAssembly.RootComponent.GetChildren():

        p, m = child.GetPosition()
        bodies = [ body for body in child.Prototype.OwningPart.Bodies ]
        b = theUfSession.ModlGeneral.AskBoundingBox(bodies[0].Tag)
        p1, p2 = NXOpen.Point3d(b[0], b[1], b[2]), NXOpen.Point3d(b[3], b[4], b[5])
        m_inv = invert(m)
        p1, p2 = dot(m_inv, p1), dot(m_inv, p2)
        p1, p2 = addition(p, p1), addition(p, p2)
        arr = sorted([p1.X, p2.X]) + sorted([p1.Y, p2.Y]) + sorted([p1.Z, p2.Z])
        arr = [ round(i, 3) for i in arr ]

        lw.WriteLine( 'x min {}, x max {}, y min {}, y max {}, z min {}, z max {}'.format(
            arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]
        ) )

def addition(p1, p2):
    return NXOpen.Point3d(p1.X + p2.X, p1.Y + p2.Y, p1.Z + p2.Z,)

def dot(m, p):
    return NXOpen.Point3d(
        m.Xx * p.X + m.Xy * p.Y + m.Xz * p.Z,
        m.Yx * p.X + m.Yy * p.Y + m.Yz * p.Z,
        m.Zx * p.X + m.Zy * p.Y + m.Zz * p.Z
    )

def invert(m):
    m1 = NXOpen.Matrix3x3()
    a  =  m.Xx * m.Yy * m.Zz + m.Xy * m.Yz * m.Zx + m.Xz * m.Yx * m.Zy
    a += -m.Xz * m.Yy * m.Zx - m.Xy * m.Yx * m.Zz - m.Xx * m.Yz * m.Zy
    m1.Xx, m1.Xy, m1.Xz = a*(m.Yy * m.Zz - m.Yz * m.Zy), a*(m.Xz * m.Zy - m.Xy * m.Zz), a*(m.Xy * m.Yz - m.Xz * m.Yy)
    m1.Yx, m1.Yy, m1.Yz = a*(m.Yz * m.Zx - m.Yx * m.Zz), a*(m.Xx * m.Zz - m.Xz * m.Zx), a*(m.Xz * m.Yx - m.Xx * m.Yz)
    m1.Zx, m1.Zy, m1.Zz = a*(m.Yx * m.Zy - m.Yy * m.Zx), a*(m.Xy * m.Zx - m.Xx * m.Zy), a*(m.Xx * m.Yy - m.Xy * m.Yx)
    return m1

if __name__ == '__main__':
    main()

Share post

Related Posts

コメント