NX Journal モデルのスクリーンショットを撮る

モデルを開いてスクリーンショットを撮る処理を繰り返すプログラムを作成しました。パーツリストを作成したり、資料を作成するときに使えると思います。

今回はTeamcenter上のモデルを対象にしましたので、モデルを開くときはIDとリビジョンを指定して開くことになります。そこで処理対象のモデルをCSVから読み込むことにしました。CSVファイルの中身はヘッダーありでIDとリビジョンを羅列した内容にします。

画像は座標系とビューネームを非表示に、 投影はトリメトリックにしてビューにフィットさせて、背景は白としています。



import NXOpen
import NXOpen.Gateway
import NXOpen.UF
import csv
import os

def main():
    theSession  = NXOpen.Session.GetSession()
    
    # csvを開く
    dicts = open_csv()

    # 開けなければ終了
    if dicts is None:
        return
    
    # NXoutputフォルダが存在するか
    if not os.path.exists("D:\\NXoutput"):
        os.mkdir("D:\\NXoutput")
    
    for d in dicts:

        # 図面のファイル名を作成
        dwg_filename = "@DB/" + d["ID"] + "/" + d["リビジョン"]
        
        # ファイルを開く
        workPart = openPart(theSession, dwg_filename)
        
        # アプリケーションの切り替え
        theSession.ApplicationSwitchImmediate("UG_APP_MODELING")

        # 座標系非表示
        workPart.WCS.Visibility = False

        # ビューネームの非表示
        workPart.Preferences.NamesBorderVisualization.ShowModelViewNames = False

        # データムの非表示
        hiddenDatums(theSession, workPart)
        
        # 不等角投影
        view = workPart.ModelingViews.WorkView
        view.Orient("ORIGINAL_TRIMETRIC", NXOpen.View.ScaleAdjustment.Fit)
        
        # スクリーンショット
        filename = "D:\\NXoutput\\" + workPart.GetStringAttribute("2_part_no") + ".png"
        theUfSession  = NXOpen.UF.UFSession.GetUFSession()
        theSession.Preferences.ScreenVisualization.TriadVisibility = 0
        exportPng(workPart, filename)

def exportPng(workPart, filename):
    theUI = NXOpen.UI.GetUI()
    imageExportBuilder1 = theUI.CreateImageExportBuilder()
    imageCaptureBuilder1 = workPart.ImageCaptureManager.CreateImageCaptureBuilder()
    imageCaptureBuilder1.Size = NXOpen.Gateway.ImageCaptureBuilder.ImageSize.Pixels128
    imageExportBuilder1.SetCustomBackgroundColor([1.0, 1.0, 1.0])
    imageExportBuilder1.RegionMode = False
    imageExportBuilder1.SetRegionTopLeftPoint([0, 0])
    imageExportBuilder1.RegionWidth = 1
    imageExportBuilder1.RegionHeight = 1
    imageExportBuilder1.FileFormat = NXOpen.Gateway.ImageExportBuilder.FileFormats.Png
    imageExportBuilder1.FileName = filename
    imageExportBuilder1.BackgroundOption = NXOpen.Gateway.ImageExportBuilder.BackgroundOptions.CustomColor
    imageExportBuilder1.EnhanceEdges = False
    
    nXObject1 = imageExportBuilder1.Commit()
    
    imageExportBuilder1.Destroy()
    imageCaptureBuilder1.Destroy()

def hiddenDatums(theSession, workPart):
    objects = []
    objects.extend(workPart.Datums)
    objects.extend(workPart.CoordinateSystems)
    theSession.DisplayManager.BlankObjects(objects)
    workPart.ModelingViews.WorkView.FitAfterShowOrHide(NXOpen.View.ShowOrHideType.HideOnly)

def openPart(theSession, id):
    try:
        # 既にファイルを開いていれば表示パートを変える
        part1 = theSession.Parts.FindObject(id)
        status1, partLoadStatus1 = theSession.Parts.SetActiveDisplay(
            part1, 
            NXOpen.DisplayPartOption.AllowAdditional, 
            NXOpen.PartDisplayPartWorkPartOption.UseLast
        )
        partLoadStatus1.Dispose()
    except Exception as e:
        # 見つからなければファイルを開く
        status1 = theSession.Parts.OpenBaseDisplay(id)
    return theSession.Parts.Work

def open_csv():
    try:
        # ファイル選択ダイアログ表示
        theUfSession  = NXOpen.UF.UFSession.GetUFSession()
        theUI = NXOpen.UI.GetUI()
        ret = theUfSession.Ui.CreateFilebox("", "CSVファイルを選択", "csv", "*.csv")

        # CSVを辞書のリストに変換
        with open(ret[1]) as f:
            reader = csv.DictReader(f)
            dicts = [row for row in reader]
        
        return dicts
    except:
        return None
    
if __name__ == '__main__':
    main()

コメント

タイトルとURLをコピーしました