NX Journal アセンブリ内の全コンポーネントをSTEPファイルにエクスポートするジャーナル
2022/01/04 categories:NX Journal| tags:NX Journal|Python|
スタンドアロン版のNXでアセンブリの子部品を再帰的に取得し、STEPファイルとしてエクスポートするジャーナルを作成しました。
エクスポートプロセスの制限
部品数が多いアセンブリをエクスポートする場合、エクスポートプロセスが次々実行されてPCのリソースを使いつくしてしまいます。それを防ぐために、同時に事項出来るエクスポートプロセスを制限する処理を入れています。下記のコードは、7行目の「step_export_window_limit = 2」となっており、同時に実行できるプロセスを2個までに制限しています。必要に応じてプロセス数を書き換えてください。
エクスポートするオブジェクト
下記のTrueをFalseに書き換えることでエクスポートするオブジェクトを指定できます。
stepCreator1.ObjectTypes.Solids = True
stepCreator1.ObjectTypes.Surfaces = True
stepCreator1.ObjectTypes.PmiData = True
stepCreator1.ObjectTypes.ProductData = True
stepCreator1.ObjectTypes.Csys = True
stepCreator1.ObjectTypes.Curves = True
例えば、サーフェスと曲線をエクスポートする必要が無い場合は以下のように書き換えます。
stepCreator1.ObjectTypes.Solids = True
stepCreator1.ObjectTypes.Surfaces = False
stepCreator1.ObjectTypes.PmiData = True
stepCreator1.ObjectTypes.ProductData = True
stepCreator1.ObjectTypes.Csys = True
stepCreator1.ObjectTypes.Curves = False
エクスポートの設定ファイル
stepCreator1.SettingsFile = ‘C:/Program Files/Siemens/NX 12.0/step214ug/ugstep214.def’
上記のパスは環境に応じて書き換える必要があります。
エクスポート先
エクスポート元のモデルと同じフォルダに、モデルと同じファイル名のSTEPファイルがエクスポートされます。
Pythonコード
import ctypes
import time
from ctypes import wintypes
from pathlib import Path
import NXOpen
step_export_window_limit = 2
def main():
theSession = NXOpen.Session.GetSession()
workPart = theSession.Parts.Work
parts = recursion(workPart.ComponentAssembly.RootComponent)
for fullpath in parts:
# export step
stepCreator1 = theSession.DexManager.CreateStepCreator()
stepCreator1.ExportAs = NXOpen.StepCreator.ExportAsOption.Ap214
stepCreator1.ObjectTypes.Solids = True
stepCreator1.SettingsFile = 'C:/Program Files/Siemens/NX 12.0/step214ug/ugstep214.def'
stepCreator1.InputFile = fullpath
stepCreator1.ObjectTypes.Surfaces = True
stepCreator1.ObjectTypes.PmiData = True
stepCreator1.ObjectTypes.ProductData = True
stepCreator1.ObjectTypes.Csys = True
stepCreator1.ObjectTypes.Curves = True
stepCreator1.OutputFile = str( Path(fullpath).with_suffix('.stp') )
stepCreator1.FileSaveFlag = False
stepCreator1.LayerMask = '1-256'
nXObject1 = stepCreator1.Commit()
stepCreator1.Destroy()
# limit export process
while True:
time.sleep(1)
windows = list_windows()
step_export_windows = [ i for i in windows if i[1] == 'STEP Export' ]
if len(step_export_windows) < step_export_window_limit:
break
def recursion(component):
part = component.Prototype.OwningPart
parts = { part.FullPath : part }
for child in component.GetChildren():
if not child.IsSuppressed:
parts2 = recursion(child)
for key in parts2:
parts[key] = parts2[key]
return parts
def list_windows():
user32 = ctypes.windll.user32
WNDENUMPROC = ctypes.WINFUNCTYPE(wintypes.BOOL, wintypes.HWND, wintypes.LPARAM,)
result = []
def enum_proc(hWnd, lParam):
if user32.IsWindowVisible(hWnd):
pid = wintypes.DWORD()
tid = user32.GetWindowThreadProcessId(hWnd, ctypes.byref(pid))
length = user32.GetWindowTextLengthW(hWnd) + 1
title = ctypes.create_unicode_buffer(length)
user32.GetWindowTextW(hWnd, title, length)
result.append([pid.value, title.value])
return True
user32.EnumWindows(WNDENUMPROC(enum_proc), 0)
return sorted(result, key=lambda x:x[1])
if __name__ == '__main__':
main()