Maya에서 Python을 이용해 선택된 Arnold의 StandIn(.ass) 오브젝트들의 경로 업데이트하기

Maya에서 Python을 이용해 선택된 Arnold의 StandIn(.ass) 오브젝트들의 경로 업데이트하기 | 지식에 대한 탐구

Maya와 Arnold 렌더러를 사용하는 3D 아티스트들은 종종 StandIn 오브젝트의 경로를 일괄적으로 업데이트해야 하는 상황에 직면합니다. 이 글에서는 Python 스크립트를 사용하여 선택한 Arnold StandIn 오브젝트의 경로를 효율적으로 업데이트하는 방법을 단계별로 설명하겠습니다.

단계별 가이드

 

1단계: 필요한 모듈 준비

이 스크립트는 Maya의 내장 Python 환경을 사용하므로 추가 모듈 설치가 필요하지 않습니다. Maya에 기본적으로 포함된 `maya.cmds`와 Python 표준 라이브러리의 `os` 모듈만 사용합니다.

2단계: 스크립트 작성

Maya의 스크립트 편집기를 열어 다음 코드를 입력합니다:

import maya.cmds as cmds
import os

class SelectedArnoldStandInPathCorrectorUI:
    def __init__(self):
        self.window_name = "selectedArnoldStandInPathCorrectorUI"
        self.create_ui()

    def create_ui(self):
        # 이미 존재하는 창 삭제
        if cmds.window(self.window_name, exists=True):
            cmds.deleteUI(self.window_name)
        
        # 새 창 생성
        cmds.window(self.window_name, title="Selected Arnold Stand-In Path Corrector", widthHeight=(400, 180))
        cmds.columnLayout(adjustableColumn=True, columnAttach=('both', 5))
        
        # UI 요소 추가
        cmds.text(label="New Path:")
        self.new_path_field = cmds.textField()
        cmds.button(label="Browse New Path", command=self.browse_new_path)
        cmds.separator(height=10, style='in')
        
        self.selected_nodes_text = cmds.text(label="Selected Stand-In nodes: 0")
        cmds.button(label="Refresh Selection", command=self.refresh_selection)
        cmds.separator(height=10, style='in')
        cmds.button(label="Update Paths", command=self.update_paths)
        
        # 창 표시
        cmds.showWindow(self.window_name)
        self.refresh_selection()

    def browse_new_path(self, *args):
        # 폴더 선택 다이얼로그 표시
        path = cmds.fileDialog2(fileMode=3, dialogStyle=2)
        if path and path[0]:
            cmds.textField(self.new_path_field, edit=True, text=path[0])

    def get_stand_in_nodes(self, selected_nodes):
        stand_in_nodes = []
        for node in selected_nodes:
            if cmds.nodeType(node) == "aiStandIn":
                stand_in_nodes.append(node)
            elif cmds.nodeType(node) == "transform":
                shapes = cmds.listRelatives(node, shapes=True, type="aiStandIn") or []
                stand_in_nodes.extend(shapes)
        return stand_in_nodes

    def refresh_selection(self, *args):
        # 선택된 노드 갱신
        selected_nodes = cmds.ls(selection=True, long=True)
        self.selected_stand_ins = self.get_stand_in_nodes(selected_nodes)
        cmds.text(self.selected_nodes_text, edit=True, label=f"Selected Stand-In nodes: {len(self.selected_stand_ins)}")

    def update_paths(self, *args):
        # 새 경로 가져오기
        new_path = cmds.textField(self.new_path_field, query=True, text=True)
        if not new_path:
            cmds.confirmDialog(title="Error", message="Please specify the new path.")
            return
        if not self.selected_stand_ins:
            cmds.confirmDialog(title="Error", message="No Arnold Stand-In nodes selected.")
            return

        updated_count = 0
        
        for node in self.selected_stand_ins:
            # 현재 .ass 파일 경로 가져오기
            current_path = cmds.getAttr(f"{node}.dso")
            
            if current_path and current_path.lower().endswith('.ass'):
                # 현재 경로에서 파일 이름 추출
                file_name = os.path.basename(current_path)
                
                # 새 파일 경로 생성
                new_file_path = os.path.join(new_path, file_name)
                
                # 새 경로로 속성 업데이트
                cmds.setAttr(f"{node}.dso", new_file_path, type="string")
                
                print(f"Updated: {node}")
                updated_count += 1
            else:
                print(f"Skipped: {node} (Not an .ass file or no path)")
        
        # 완료 메시지 표시
        cmds.confirmDialog(title="Complete", message=f"Total Arnold Stand-In nodes updated: {updated_count}")
        self.refresh_selection()

# UI 생성 및 표시
ui = SelectedArnoldStandInPathCorrectorUI()

 







 

3단계: 코드 실행

  1. Maya를 실행합니다.
  2. 스크립트 편집기를 엽니다 (Windows > General Editors > Script Editor).
  3. Python 탭을 선택합니다.
  4. 위의 코드를 Python 탭에 붙여넣습니다.
  5. 코드를 선택하고 실행 버튼을 클릭합니다.

4단계: UI 사용하기

스크립트를 실행하면 “Selected Arnold Stand-In Path Corrector” 창이 나타납니다:

  1. Maya 씬에서 경로를 업데이트하고 싶은 Arnold StandIn 오브젝트들을 선택합니다.
  2. “Refresh Selection” 버튼을 클릭하여 선택된 StandIn 노드의 수를 확인합니다.
  3. “Browse New Path” 버튼을 클릭하여 새로운 경로를 선택합니다.
  4. 선택한 경로가 텍스트 필드에 표시됩니다.
  5. “Update Paths” 버튼을 클릭하여 선택된 Arnold Stand-In 오브젝트의 경로를 업데이트합니다.
  6. 프로세스가 완료되면 업데이트된 노드의 수를 보여주는 확인 창이 나타납니다.

코드 설명

 

이 스크립트는 다음과 같이 작동합니다:

  1. SelectedArnoldStandInPathCorrectorUI 클래스를 정의하여 사용자 인터페이스를 생성합니다.
  2. create_ui 메소드에서 Maya 명령어를 사용하여 창과 UI 요소들을 생성합니다.
  3. browse_new_path 메소드는 폴더 선택 다이얼로그를 표시하고, 선택된 경로를 텍스트 필드에 설정합니다.
  4. get_stand_in_nodes 메소드는 선택된 노드 중 Arnold StandIn 노드를 찾아 반환합니다.
  5. refresh_selection 메소드는 현재 선택된 StandIn 노드의 수를 업데이트합니다.
  6. update_paths 메소드는 실제 경로 업데이트 작업을 수행합니다:
    • 새 경로를 가져옵니다.
    • 선택된 각 StandIn 노드의 현재 .ass 파일 경로를 가져옵니다.
    • 새 경로와 원래 파일 이름을 조합하여 새 파일 경로를 만듭니다.
    • 노드의 ‘dso’ 속성을 새 경로로 업데이트합니다.
  7. 마지막으로, 업데이트된 노드의 수를 표시하는 확인 창을 보여줍니다.

이 스크립트를 사용하면 프로젝트의 파일 구조가 변경되었을 때 선택한 Arnold Stand-In 오브젝트의 경로를 쉽고 빠르게 업데이트할 수 있습니다. 이는 특히 큰 규모의 프로젝트에서 파일 관리와 워크플로우 최적화에 매우 유용합니다.

주의사항

 

  • 이 스크립트를 실행하기 전에 반드시 작업 중인 Maya 씬의 백업을 만들어두세요.
  • 경로를 업데이트하기 전에 새 경로에 필요한 .ass 파일들이 실제로 존재하는지 확인하세요.
  • 대규모 씬에서는 많은 수의 StandIn 노드를 업데이트하는 데 시간이 걸릴 수 있으므로 인내심을 가지고 기다려주세요.

추가 팁

 

  • 이 스크립트를 Maya의 셸프(Shelf)에 추가하면 더 쉽게 접근할 수 있습니다.
  • 프로젝트의 요구사항에 맞게 스크립트를 수정하거나 확장할 수 있습니다. 예를 들어, 특정 이름 패턴을 가진 StandIn 노드만 업데이트하는 기능을 추가할 수 있습니다.
  • 에러 처리를 더 강화하여 스크립트의 안정성을 높일 수 있습니다.

이 Python 스크립트를 사용하면 Maya에서 Arnold StandIn 오브젝트의 경로를 효율적으로 관리할 수 있습니다. 특히 대규모 프로젝트나 복잡한 씬에서 작업할 때 시간을 크게 절약할 수 있습니다. Python과 Maya API에 대해 더 깊이 이해하게 되면, 여러분의 워크플로우를 더욱 효율적으로 만들 수 있는 다양한 스크립트를 개발할 수 있을 것입니다.

© 2024 지식에 대한 탐구. All rights reserved.