80 lines
2.2 KiB
Python
80 lines
2.2 KiB
Python
"""
|
|
Import 관련 명령 핸들러
|
|
FBX, DAE 파일 임포트
|
|
"""
|
|
|
|
import bpy
|
|
import os
|
|
from ..utils.logger import get_logger
|
|
from ..utils.security import validate_file_path
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
def import_fbx(filepath: str) -> str:
|
|
"""
|
|
FBX 파일 임포트
|
|
|
|
Args:
|
|
filepath: FBX 파일 경로
|
|
|
|
Returns:
|
|
결과 메시지
|
|
|
|
Raises:
|
|
RuntimeError: 임포트 실패
|
|
ValueError: 잘못된 파일 경로
|
|
"""
|
|
logger.info(f"Importing FBX file: {filepath}")
|
|
|
|
# 경로 보안 검증 (path traversal 방지)
|
|
try:
|
|
# 사용자 홈 디렉토리 또는 현재 작업 디렉토리 내로 제한
|
|
allowed_root = os.path.expanduser("~")
|
|
validated_path = validate_file_path(filepath, allowed_root)
|
|
except ValueError as e:
|
|
logger.error(f"Invalid file path: {e}")
|
|
raise ValueError(f"Invalid file path: {e}")
|
|
|
|
try:
|
|
bpy.ops.import_scene.fbx(filepath=validated_path)
|
|
logger.info(f"FBX import successful: {validated_path}")
|
|
return f"Imported {validated_path}"
|
|
except Exception as e:
|
|
logger.error(f"FBX import failed: {e}", exc_info=True)
|
|
raise RuntimeError(f"Failed to import FBX: {str(e)}")
|
|
|
|
|
|
def import_dae(filepath: str) -> str:
|
|
"""
|
|
DAE (Collada) 파일 임포트
|
|
|
|
Args:
|
|
filepath: DAE 파일 경로
|
|
|
|
Returns:
|
|
결과 메시지
|
|
|
|
Raises:
|
|
RuntimeError: 임포트 실패
|
|
ValueError: 잘못된 파일 경로
|
|
"""
|
|
logger.info(f"Importing DAE file: {filepath}")
|
|
|
|
# 경로 보안 검증 (path traversal 방지)
|
|
try:
|
|
# 사용자 홈 디렉토리 또는 현재 작업 디렉토리 내로 제한
|
|
allowed_root = os.path.expanduser("~")
|
|
validated_path = validate_file_path(filepath, allowed_root)
|
|
except ValueError as e:
|
|
logger.error(f"Invalid file path: {e}")
|
|
raise ValueError(f"Invalid file path: {e}")
|
|
|
|
try:
|
|
bpy.ops.wm.collada_import(filepath=validated_path)
|
|
logger.info(f"DAE import successful: {validated_path}")
|
|
return f"Imported {validated_path}"
|
|
except Exception as e:
|
|
logger.error(f"DAE import failed: {e}", exc_info=True)
|
|
raise RuntimeError(f"Failed to import DAE: {str(e)}")
|