ステップ別 X-Y 分布画像出力(Value をカラーマップ表示)

目的

プロジェクトフォルダ / CSVフォルダ / .ipro を入力として、各ステップの (X/Y) 平面上の Value 分布を画像として出力する。

  • Value はユーザが変数(列)を選択する
  • X/Y は固定(CGNS の座標を使用)
  • 矩形領域で切り抜き(ROI)した範囲のみを出力する
  • 全ステップ分の画像を作成し、ステップごとに比較できるようにする

スコープ

対象

  • 入力: プロジェクトフォルダ / CSVフォルダ(Result_*.csv)/ .ipro
  • 出力: 画像ファイル(PNG を想定、拡張子は将来追加可能)
  • 表示: Matplotlib によるカラーマップ表示(pcolormesh)+ カラーバー

非対象(当面)

  • 境界データの可視化
  • アニメーション(GIF/MP4)出力(将来検討)

入力

1) 入力ファイル

  • ランチャーで選択された入力パスを対象とする
  • プロジェクトフォルダの場合: 内部の CGNS を読み込む
    • result/Solution*.cgn がある場合は 1ファイル=1ステップ として扱う
    • それ以外は Case1.cgn を使用する(将来オプション化予定)
  • CSVフォルダの場合: Result_*.csv を読み込む
  • .ipro の場合: 内部を一時展開してプロジェクトフォルダとして扱う

1-1) CSVフォルダ入力の前提

  • 1ステップ = Result_*.csv 1ファイル
  • CSV は iRIC 互換フォーマット(先頭2行: iRIC output t = ...imax,jmax)を想定
  • ステップ番号はファイル名(Result_{n}.csv)から取得し、取得できない場合はソート順で連番とする

2) 変数(Value)

  • ユーザが選択した 1 変数を Value として使用
  • 前提: CGNS/CSV から生成する DataFrame に列として存在すること
  • 例: ZB, ZS, HS, U, V など

3) 切り抜き領域(ROI)

回転可能な矩形領域を (X/Y) の座標で指定する。

  • 入力形式:
  • 画面上の回転矩形をドラッグして指定(長辺/短辺ハンドルでサイズ変更・回転)
  • 数値入力(Cx/Cy/W/H/Angle
  • 最小サイズ: 推定した格子間隔(base_dx/base_dy)を下限とする

4) プレビュー対象ステップ

プレビュー表示に使うステップを選択できるようにする。

  • 既定: step=1(FlowSolutionPointers の 1 始まり)
  • UI(案): step を Spinbox/Slider で指定
  • 補足: 出力は全ステップ分作成するため、プレビューは「設定確認用」として 1 ステップのみ表示する

出力

出力先

  • ランチャーで指定された出力フォルダ配下
  • 例: output/xy_value_map_<value>/ のように、変数ごとにサブフォルダを作成

出力ファイル

  • ステップごとに 1 枚の画像を出力する
  • 例:
  • step_0001.png
  • step_0002.png
  • ...
  • 画像内に含める要素は出力オプションで制御する
  • タイトル文字列 / 目盛り / 枠線 / カラーバー / カラーバー名
  • タイトル文字列・カラーバー名は空文字なら非表示

表示仕様(プロット)

  • 描画(既定): 構造格子(I/J)を補間で細分化し、回転後の座標で matplotlib.axes.Axes.pcolormesh(..., shading="gouraud") を描画
  • 回転: ROI 中心を基準に座標を逆回転し、ROI がまっすぐになる向きで表示する
  • 解像度: 倍率で指定し、基準間隔(推定した隣接距離)を倍率で割って dx/dy を決める
  • 補間: SciPy の ndimage.zoom により X/Y/Value を I/J 方向に補間する
  • 座標系: ROI ローカル座標で表示し、回転後 ROI の左下を (0, 0) とする(プレビュー/出力共通)
  • ROI 外混入対策: ROI 外は重み0として補間し、ROI 外の値が混ざらないようにする(NaN で除外)
  • タイトル: 出力オプションで指定した文字列をそのまま表示(空文字なら非表示)
  • カラーバー: make_axes_locatable を優先し、失敗時は fig.colorbar にフォールバック
  • 形状(縦横比)の保持:
  • ax.set_aspect("equal", adjustable="box") を基本とし、距離のスケールが歪まないようにする
  • ROI の xlim/ylim は固定して、ステップごとにオートスケールで形が変わらないようにする
  • figsize は固定値(既定: 6x4 in)をベースにし、出力は bbox_inches="tight" + pad_inches でトリミングする
  • 出力倍率はプレビューのサイズを基準に dpi をスケールする
  • 色(見た目):
  • カラーマップは「最小/最大の2色」「虹色(iRIC風)」「色相回転」から選択する
  • 最小/最大の2色は線形グラデーション(LinearSegmentedColormap.from_list(...)
  • 虹色(iRIC風)は最小/最大色の指定を使用しない
  • スケール(色に割り当てる値の範囲):
  • global(既定): 回転/解像度を反映した ROI 内の全ステップ min/max で固定
  • manual: ユーザが vmin/vmax を指定
  • ROI 切り抜き:
  • ROI 外は NaN として透明表示(cmap.set_bad
  • 画像は ROI の幅/高さの矩形として出力される

期待するユーザフロー(GUI)

1) ランチャーで入力(プロジェクトフォルダ/CSVフォルダ/.ipro)と出力フォルダを選択 2) 本機能を起動 3) Value 変数を選択 4) ROI(回転矩形)を指定(編集キャンバスでドラッグ or 数値入力) 5) プレビュー対象ステップを選択 6) 色/スケールを指定 - カラーマップ(最小/最大の2色 / 虹色(iRIC風) / 色相回転) - スケール: 自動(全ステップ)/手動(数値入力) - 手動の場合は 表示下限/表示上限 を指定 7) 表示オプションを指定 - 目盛り / 枠線 / カラーバー - タイトル文字列 / カラーバー名(空文字なら非表示) 8) フォントサイズを指定 9) 出力オプションを指定 - 余白(in) / 出力倍率 / 出力ステップ(開始/終了/間引き) 10) 解像度倍率を指定 11) 実行 → 指定ステップ分の画像を出力(「現在のステップを出力」でプレビュー中の step だけ出力) 12) 完了ダイアログで出力先フォルダを案内

プレビュー仕様(UI/挙動)

プレビューは「ユーザが指定した ROI/変数/色/スケールが意図通りか」を確認するための表示とする。

  • 画面構成
  • 左側に設定パネル、右側に プレビュー(上)編集キャンバス(下) を配置
  • 編集キャンバスは全体+10%余白を初期表示し、Ctrl+スクロール でズーム
  • ROI は回転矩形として表示し、長辺/短辺ハンドルでサイズ変更、回転ハンドルで角度変更を行う
  • 底辺が分かるように ROI の底辺ラインを強調表示する
  • 編集キャンバスは目盛りやタイトルを表示せず、プレビューと同じ高さで表示する
  • 編集キャンバスはキャンバス全域を操作領域として扱い、余白も含めて ROI 操作ができる
  • 数値入力(Cx/Cy/W/H/Angle)とドラッグ操作は相互に同期する
  • プレビューで表示する内容
  • 選択した 1 ステップ分の ROI ローカル座標の pcolormesh + カラーバー
  • タイトルは出力オプションの文字列を表示(空文字なら非表示)
  • 出力オプション(目盛り/枠線/カラーバー/タイトル/フォントサイズ/カラーバー名/余白(in)/出力倍率)をプレビューと出力で共通に適用する
  • bbox_inches="tight" 相当の出力範囲を破線で表示する
  • ROI 未確定時は「ROI 確定待ち」の空プレビューを表示する
  • 即時反映(必須)
  • Value 変数変更 → 即座に再描画
  • ROI 変更 → リリース時に再描画(ドラッグ中は ROI のみ更新)
  • 最小/最大色変更 → 即座に再描画
  • 解像度倍率変更 → 即座に再描画
  • スケール変更:
    • manual: vmin/vmax 入力を即反映
    • vmin/vmax はレンジスライダーでも操作でき、範囲は 全ステップの min/max に固定する
    • レンジスライダーは 比率(0-1) を保持し、範囲が変わっても相対位置を維持する
    • global スケールが未計算の間はレンジスライダーを無効化する
    • global: ROI 内の全ステップを通した min/max を再計算して反映
    • 計算はバックグラウンドで行い、計算中はステータス表示を行う
    • 計算完了前は「暫定」として現在ステップの min/max で描画する
  • プレビュー軽量化(現状)
  • ROI ドラッグ中のみ解像度を落とし、推定点数が 60,000 を超える場合は dx/dy を自動調整する
  • 編集キャンバスの背景は最大 40,000 点まで間引いて表示する
  • 画像出力時は指定解像度で描画する(プレビューと出力を分ける)

現状の実装

  • GUI: iRIC_DataScope/xy_value_map/gui.py
  • 左側に設定パネル、右側にプレビュー(上)/編集キャンバス(下)を配置
  • 編集キャンバスは全体表示+10%余白を固定し、Ctrl+スクロール でズーム
  • ROI は回転矩形として表示し、長辺/短辺ハンドルでサイズ変更、回転ハンドルで角度変更
  • ROI 底辺ラインを強調表示して向きを明示
  • 編集キャンバスは目盛り・タイトルを表示せず、プレビューと同じ高さで表示する
  • 編集キャンバスの背景はラスタ化した値マップを表示し、ROI 操作中の再描画を抑えて軽量化
  • 編集キャンバスの背景はグレースケールで描画し、プレビューとは見た目で区別する
  • 編集キャンバスの色スケールは ROI に依存せず、全体の min/max(1ステップ・間引き)で固定
  • カラーマップは「最小/最大の2色」「虹色(iRIC風)」「色相回転」を選択可能
  • 虹色(iRIC風)は最小/最大色の指定を使用せず、UI上も無効化する
  • manual の vmin/vmax はレンジスライダーで調整でき、範囲は ROI 内・全ステップの自動計算値に固定
  • プレビュー/出力は ROI ローカル座標で描画し、左下を (0, 0) とする
  • 編集キャンバスには step/value/scale/zoom のオーバーレイを表示する(日本語)
  • 操作ヒント(移動/回転/拡縮/ズーム)を編集キャンバスに日本語で表示する
  • 編集キャンバスには格子領域の外周ラインを描画し、形状が分かるようにする
  • ROI/変数/色/スケール/step の変更はプレビューに反映(ROI ドラッグはリリース時のみ、他は200ms デバウンス)
  • 解像度倍率の基準となる dx/dy は 1 ステップ目の格子隣接距離の中央値から推定
  • global スケールは ROI 確定後のみバックグラウンド計算し、計算中はステータスを表示
  • ROI 未確定時はプレビューを「ROI 確定待ち」として表示する
  • プレビューは出力と同じ描画処理を使用し、figsize(6x4 in)+ pad_inches を枠内に収まるよう縮小表示する
  • プレビューには bbox_inches="tight" 相当の範囲を破線で表示する
  • ROI ドラッグ中は解像度を下げて軽量化し、リリース後に指定解像度で描画する
  • タイトル文字列/カラーバー名は空文字で非表示(タイトル表示のチェックはなし)
  • 目盛り/枠線/カラーバー/フォントサイズ/余白(in)/出力倍率は出力オプションで制御する
  • 出力ステップは範囲スライダー+開始/終了入力で指定し、範囲外は正規化する
  • データ取得: iRIC_DataScope/common/iric_data_source.py
  • DataSourceプロジェクトフォルダ / CSVフォルダ(必要なら .ipro)を統一的に扱う
  • result/Solution*.cgn がある場合は系列として扱い、無ければ Case1.cgn を使用する
  • .ipro は内部の CGNS を一時ディレクトリへ展開し、セッション中は使い回す
  • CGNS 読み込みは iRIC_DataScope/common/cgns_reader.pyresolve_case_cgn, iter_iric_step_frames)を利用
  • CSVフォルダは Result_*.csv を走査し、必要列のみ pandas.read_csv(usecols=...) で読み込む
  • 当面は「ノード座標系(X/Y と同 shape の変数)」のみを扱う
  • 画像出力: iRIC_DataScope/xy_value_map/main.py
  • global は ROI 内の全ステップを 1 回走査して min/max を決め、全ステップで同一スケールに固定
  • ROI 角度と dx/dy を反映した I/J 補間結果を出力する
  • ROI 内が空のステップはスキップし、ログに残す
  • 進捗は GUI の進捗ウィンドウで表示し、完了/失敗はダイアログで通知
  • 出力オプションにより目盛り/枠線/カラーバーを切り替え、タイトルは文字列指定(空で非表示)

依存ライブラリ

  • matplotlib(必須)
  • 画像出力/プレビューに使用
  • PyInstaller では環境により --collect-data matplotlib 等の追加が必要になる場合がある
  • scipy(補間用)
  • ndimage.zoom を使用(I/J 補間とマスク重み付け)

エラーと扱い

  • Value 列が存在しない
  • エラーダイアログで通知し、実行中止
  • ROI 内に点が存在しない
  • プレビューは「ROI 内に点がありません」を表示
  • 全ステップ出力では該当ステップをスキップし、ログに残す
  • このステップのみ出力ではエラーとして扱う
  • 出力先に書き込めない
  • エラーダイアログで通知
  • global スケール計算に失敗
  • エラーダイアログで通知し、計算を中断する

受け入れ条件(最低限)

  • プロジェクトフォルダ / CSVフォルダ / .ipro を入力にして全ステップ分の画像が出力される
  • ROI 指定が反映され、画像が切り抜き範囲のみで生成される
  • Value がカラーマップで表現され、カラーバーが表示される
  • 最小/最大色がユーザ指定に従って反映される
  • ROI 角度(ROI 中心)と dx/dy が出力に反映される