"""シーン 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()