draw_tft3d プログラム仕様

PyVistaベースの3D薄膜トランジスタ(TFT)構造ビューア。

本スクリプトは、オリジナルの tft.py--mode=model3d 部分をPyVistaを使用して再実装したスタンドアロンアプリケーションです。 既存のコードは一切変更せず、適切なDocstringを追加しています。

機能

  • tklibへの依存がありません。

  • Zバッファによる適切な3Dレンダリング(matplotlibのmplot3dよりもこの用途に適しています)。

  • ランチャーフレンドリーな0/1コマンドラインオプション。

  • 対話型表示および/または画像保存。

  • TFT全体が視界に収まるように調整された初期カメラ。

単位

入力ジオメトリはW, L, dgにSI単位(オリジナルスクリプトと同じ)を使用します。 補助的な厚さパラメータはnm単位です。描画はnm単位で行われます。 z方向は`--zscale`で視覚的に拡大できます。

関連リンク: draw_tft3d.py 技術ドキュメント

class tft.draw_tft3d.Layer(name: str, bounds: Tuple[float, float, float, float, float, float], color: str, opacity: float = 1.0, group_label: str | None = None)[ソース]

ベースクラス: object

3D構造の単一レイヤーを表すデータクラス。

各レイヤーは名前、3Dバウンディングボックス、色、不透明度、およびオプションのグループラベルを持ちます。

パラメータ:
  • name -- str レイヤーの名前。

  • bounds -- Tuple[float, float, float, float, float, float] レイヤーのバウンディングボックス (xmin, xmax, ymin, ymax, zmin, zmax)。

  • color -- str レイヤーの色。

  • opacity -- float レイヤーの不透明度 (0.0から1.0)。

  • group_label -- str | None レイヤーのグループを示すオプションのラベル。

bounds: Tuple[float, float, float, float, float, float]
property center: Tuple[float, float, float]

レイヤーのバウンディングボックスの中心座標を返します。

戻り値:

Tuple[float, float, float] レイヤーの中心座標 (x, y, z)。

color: str
group_label: str | None = None
name: str
opacity: float = 1.0
tft.draw_tft3d.add_layer_labels(plotter: Plotter, layers: List[Layer]) None[ソース]

TFT構造の各レイヤーにテキストラベルを追加します。

Layer オブジェクトの中心座標または特定のオフセット位置に、 レイヤー名を示すラベルを配置します。ソース/ドレインレイヤーは、表示のために少し上にオフセットされます。

パラメータ:
  • plotter -- pv.Plotter PyVistaのプロッターインスタンス。

  • layers -- List[Layer] TFT構造の Layer オブジェクトのリスト。

戻り値:

戻り値はありません。

tft.draw_tft3d.add_legend(plotter: Plotter) None[ソース]

PyVistaプロッターに色の凡例を追加します。

TFT構造の主要な材料(基板、ゲート/ソース/ドレイン、絶縁体、半導体)と その対応する色を示す凡例ボックスをプロッターに表示します。

パラメータ:

plotter -- pv.Plotter PyVistaのプロッターインスタンス。

戻り値:

戻り値はありません。

tft.draw_tft3d.build_layers(args: Namespace) Tuple[List[Layer], dict][ソース]

コマンドライン引数に基づいて、TFT構造の各レイヤーを定義します。

基板、ゲート、絶縁体、半導体、ソース/ドレインなどのTFTの物理的な層を Layer オブジェクトのリストとして構築します。 各レイヤーのサイズと位置は、入力された幾何学的パラメータとZ方向の視覚的スケール因子に基づいて計算されます。

パラメータ:

args -- argparse.Namespace コマンドライン引数を格納するオブジェクト。

戻り値:

Tuple[List[Layer], dict] 構築された Layer オブジェクトのリストと、計算された寸法情報を含む辞書のタプル。

tft.draw_tft3d.build_parser() ArgumentParser[ソース]

TFT 3Dビューアのコマンドライン引数を定義するArgparseパーサーを構築します。

TFTの幾何学的パラメータ、視覚的設定、カメラ制御、出力オプションなど、 スクリプトの動作を制御するための多くの引数を設定します。

戻り値:

argparse.ArgumentParser 構築されたArgparseパーサーインスタンス。

tft.draw_tft3d.configure_camera(plotter: Plotter, layers: List[Layer], dims: dict, camera_scale: float, parallel: int, margin: float = 1.08) dict[ソース]

PyVistaプロッターの初期カメラ設定を構成します。

すべてのレイヤーを含むシーンのバウンディングボックスを計算し、その中心を焦点として、 初期の斜め視点カメラを設定します。カメラの距離は camera_scale とシーンの最大寸法に基づいて決定されます。

パラメータ:
  • plotter -- pv.Plotter PyVistaのプロッターインスタンス。

  • layers -- List[Layer] TFT構造の Layer オブジェクトのリスト。

  • dims -- dict TFTの寸法情報を含む辞書。

  • camera_scale -- float カメラの距離を調整するためのスケール因子。

  • parallel -- int 並行投影を使用するかどうか (0: 無効, 1: 有効)。

  • margin -- float カメラフィット時の追加マージン因子。

戻り値:

dict 設定されたカメラ情報(バウンディングボックス、焦点、最大寸法など)を含む辞書。

tft.draw_tft3d.get_scene_bounds(layers: List[Layer], margin_xy: float = 0.04, margin_z: float = 0.06) Tuple[float, float, float, float, float, float][ソース]

すべてのTFTレイヤーを含むシーン全体の最小/最大バウンディングボックスを計算します。

各レイヤーのバウンディングボックスを走査し、シーン全体のX, Y, Z方向の最小値と最大値を決定します。 指定されたマージンファクターを適用して、ビューポートに余白を追加します。

パラメータ:
  • layers -- List[Layer] TFT構造の Layer オブジェクトのリスト。

  • margin_xy -- float X-Y平面におけるバウンディングボックスの追加マージン率。

  • margin_z -- float Z方向におけるバウンディングボックスの追加マージン率。

戻り値:

Tuple[float, float, float, float, float, float] (xmin, xmax, ymin, ymax, zmin, zmax) の形式でシーンのバウンディングボックス。

tft.draw_tft3d.install_camera_keybindings(plotter: Plotter, camera_info: dict) None[ソース]

PyVistaプロッターにカメラ制御用のキーバインドをインストールします。

回転 (j/l/i/k)、ズーム (+/-)、パン (a/d/w/s/u/o)、ビューのリセット (r)、 プリセットビュー (x/y/z)、並行投影の切り替え (p) など、 インタラクティブなカメラ操作のためのキーイベントハンドラを設定します。

パラメータ:
  • plotter -- pv.Plotter PyVistaのプロッターインスタンス。

  • camera_info -- dict configure_camera 関数から返されたカメラ設定情報を含む辞書。

戻り値:

戻り値はありません。

tft.draw_tft3d.main() None[ソース]

スクリプトのメインエントリポイント。

Argparseパーサーを構築し、コマンドライン引数を解析し、 render_tft 関数を呼び出してTFT構造をレンダリングします。 --show=0args.pause が設定されている場合は、終了前にユーザー入力を待ちます。

戻り値:

戻り値はありません。

tft.draw_tft3d.parse_figsize(text: str) Tuple[float, float][ソース]

幅と高さの文字列(例: "8,6")をタプルとして解析するArgparse型チェッカー。

入力文字列をコンマで分割し、それぞれの部分を浮動小数点数に変換して幅と高さのタプルを生成します。 値が正であることを検証します。

パラメータ:

text -- str Argparseによって渡される "幅,高さ" 形式の入力文字列。

戻り値:

Tuple[float, float] 解析された (幅, 高さ) のタプル。

例外:

argparse.ArgumentTypeError -- フォーマットが不正な場合、または幅/高さの値が正でない場合。

tft.draw_tft3d.positive_float(value: str) float[ソース]

正の浮動小数点数を引数として解析するArgparse型チェッカー。

入力文字列を浮動小数点数に変換し、その値が正であることを検証します。 0以下の場合は argparse.ArgumentTypeError を発生させます。

パラメータ:

value -- str Argparseによって渡される入力文字列。

戻り値:

float 解析された正の浮動小数点数。

例外:

argparse.ArgumentTypeError -- 値が正でない場合。

tft.draw_tft3d.render_tft(args: Namespace)[ソース]

コマンドライン引数に基づいてTFTの3Dモデルをレンダリングします。

build_layers 関数でTFTレイヤーを構築し、PyVistaプロッターを初期化します。 各レイヤーを3Dボックスとしてプロッターに追加し、必要に応じてラベル、凡例、軸を表示します。 カメラを設定し、インタラクティブモードの場合はキーバインドをインストールします。 最終的に、表示またはファイルへのスクリーンショット保存を行います。

パラメータ:

args -- argparse.Namespace コマンドライン引数を格納するオブジェクト。

戻り値:

pv.Plotter レンダリングに使用されたPyVistaプロッターインスタンス。

tft.draw_tft3d.set_camera_direction(plotter: Plotter, focal: Tuple[float, float, float], maxdim: float, direction: Tuple[float, float, float], viewup: Tuple[float, float, float], camera_scale: float, bounds: Tuple[float, float, float, float, float, float], parallel: int, margin: float = 1.08) None[ソース]

PyVistaのカメラ位置と視点方向を設定します。

指定された焦点、カメラ距離、方向、ビューアップベクトルに基づいてカメラを設定します。 並行投影の有効/無効を切り替え、シーンのバウンディングボックスに合わせてカメラをリセットします。

パラメータ:
  • plotter -- pv.Plotter PyVistaのプロッターインスタンス。

  • focal -- Tuple[float, float, float] カメラの焦点座標 (x, y, z)。

  • maxdim -- float シーンの最大寸法。

  • direction -- Tuple[float, float, float] カメラから焦点への方向ベクトル。

  • viewup -- Tuple[float, float, float] カメラのビューアップベクトル。

  • camera_scale -- float カメラの距離を調整するためのスケール因子。

  • bounds -- Tuple[float, float, float, float, float, float] シーンのバウンディングボックス。

  • parallel -- int 並行投影を使用するかどうか (0: 無効, 1: 有効)。

  • margin -- float カメラフィット時の追加マージン因子。

戻り値:

戻り値はありません。