Newer
Older
SmTIAS-LightSim / src / sm_tias_lightsim / scene / paths.py
"""シーン YAML に書くメッシュパスの組み立て.

シーン YAML の `geometry.meshes[].path` は,相対パスなら **YAML 自身のディレクトリ基準**で
解決される(sm-render / sm-visualize / 検証スクリプトはいずれも YAML の親を基点に渡す).
スイープスクリプトが configs/_tmp_*/ に書き出す YAML は,以前は絶対パスを書いていたため
Windows で生成した YAML(C:\\Users\\...)を研究室サーバへ送ると読めなかった
(2026-09-13 Newton で確認).YAML からの相対パスを POSIX 区切りで書けば,
リポジトリごとどこへ移しても(Windows でも Linux でも)そのまま解決できる.
"""

from __future__ import annotations

import logging
import os
from pathlib import Path

_logger = logging.getLogger(__name__)


def relative_mesh_path(target: Path, yaml_dir: Path) -> str:
    """メッシュファイルを,YAML の置き場所からの相対パス(POSIX 区切り)で返す.

    Windows で別ドライブにあるなど相対パスで表せない場合だけ,警告ログを出して
    絶対パスを返す(従来の挙動.サーバへは持ち出せない).

    Args:
        target: メッシュファイルのパス(相対なら CWD 基準).
        yaml_dir: そのパスを書き込むシーン YAML のディレクトリ.

    Returns:
        YAML に書き込むパス文字列(例: `meshes/筐体_L120.stl`,`../meshes/前側.stl`).
    """
    target_abs = target.resolve()
    try:
        rel = os.path.relpath(target_abs, yaml_dir.resolve())
    except ValueError:
        _logger.warning(
            "メッシュ %s は YAML ディレクトリ %s からの相対パスで表せないため"
            "絶対パスを書き込みます(他のマシンでは読めません).",
            target_abs,
            yaml_dir,
        )
        return str(target_abs)
    return Path(rel).as_posix()