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()