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

Share on:

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

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

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

Pythonコード

  1import NXOpen
  2import NXOpen.Gateway
  3import NXOpen.UF
  4import csv
  5import os
  6
  7def main():
  8    theSession  = NXOpen.Session.GetSession()
  9    
 10    # csvを開く
 11    dicts = open_csv()
 12
 13    # 開けなければ終了
 14    if dicts is None:
 15        return
 16    
 17    # NXoutputフォルダが存在するか
 18    if not os.path.exists("D:\\NXoutput"):
 19        os.mkdir("D:\\NXoutput")
 20    
 21    for d in dicts:
 22
 23        # 図面のファイル名を作成
 24        dwg_filename = "@DB/" + d["ID"] + "/" + d["リビジョン"]
 25        
 26        # ファイルを開く
 27        workPart = openPart(theSession, dwg_filename)
 28        
 29        # アプリケーションの切り替え
 30        theSession.ApplicationSwitchImmediate("UG_APP_MODELING")
 31
 32        # 座標系非表示
 33        workPart.WCS.Visibility = False
 34
 35        # ビューネームの非表示
 36        workPart.Preferences.NamesBorderVisualization.ShowModelViewNames = False
 37
 38        # データムの非表示
 39        hiddenDatums(theSession, workPart)
 40        
 41        # 不等角投影
 42        view = workPart.ModelingViews.WorkView
 43        view.Orient("ORIGINAL_TRIMETRIC", NXOpen.View.ScaleAdjustment.Fit)
 44        
 45        # スクリーンショット
 46        filename = "D:\\NXoutput\\" + workPart.GetStringAttribute("2_part_no") + ".png"
 47        theUfSession  = NXOpen.UF.UFSession.GetUFSession()
 48        theSession.Preferences.ScreenVisualization.TriadVisibility = 0
 49        exportPng(workPart, filename)
 50
 51def exportPng(workPart, filename):
 52    theUI = NXOpen.UI.GetUI()
 53    imageExportBuilder1 = theUI.CreateImageExportBuilder()
 54    imageCaptureBuilder1 = workPart.ImageCaptureManager.CreateImageCaptureBuilder()
 55    imageCaptureBuilder1.Size = NXOpen.Gateway.ImageCaptureBuilder.ImageSize.Pixels128
 56    imageExportBuilder1.SetCustomBackgroundColor([1.0, 1.0, 1.0])
 57    imageExportBuilder1.RegionMode = False
 58    imageExportBuilder1.SetRegionTopLeftPoint([0, 0])
 59    imageExportBuilder1.RegionWidth = 1
 60    imageExportBuilder1.RegionHeight = 1
 61    imageExportBuilder1.FileFormat = NXOpen.Gateway.ImageExportBuilder.FileFormats.Png
 62    imageExportBuilder1.FileName = filename
 63    imageExportBuilder1.BackgroundOption = NXOpen.Gateway.ImageExportBuilder.BackgroundOptions.CustomColor
 64    imageExportBuilder1.EnhanceEdges = False
 65    
 66    nXObject1 = imageExportBuilder1.Commit()
 67    
 68    imageExportBuilder1.Destroy()
 69    imageCaptureBuilder1.Destroy()
 70
 71def hiddenDatums(theSession, workPart):
 72    objects = []
 73    objects.extend(workPart.Datums)
 74    objects.extend(workPart.CoordinateSystems)
 75    theSession.DisplayManager.BlankObjects(objects)
 76    workPart.ModelingViews.WorkView.FitAfterShowOrHide(NXOpen.View.ShowOrHideType.HideOnly)
 77
 78def openPart(theSession, id):
 79    try:
 80        # 既にファイルを開いていれば表示パートを変える
 81        part1 = theSession.Parts.FindObject(id)
 82        status1, partLoadStatus1 = theSession.Parts.SetActiveDisplay(
 83            part1, 
 84            NXOpen.DisplayPartOption.AllowAdditional, 
 85            NXOpen.PartDisplayPartWorkPartOption.UseLast
 86        )
 87        partLoadStatus1.Dispose()
 88    except Exception as e:
 89        # 見つからなければファイルを開く
 90        status1 = theSession.Parts.OpenBaseDisplay(id)
 91    return theSession.Parts.Work
 92
 93def open_csv():
 94    try:
 95        # ファイル選択ダイアログ表示
 96        theUfSession  = NXOpen.UF.UFSession.GetUFSession()
 97        theUI = NXOpen.UI.GetUI()
 98        ret = theUfSession.Ui.CreateFilebox("", "CSVファイルを選択", "csv", "*.csv")
 99
100        # CSVを辞書のリストに変換
101        with open(ret[1]) as f:
102            reader = csv.DictReader(f)
103            dicts = [row for row in reader]
104        
105        return dicts
106    except:
107        return None
108    
109if __name__ == '__main__':
110    main()

関連記事