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

Share post

Related Posts

コメント