[Maya] 스티커를 해결하기 위해 플러그인을 썼어요.

10859 단어 Pythonpluginmayatech
Maya Advent Calender가 2020 공백을 메우기 위해 쓴 글이다.
모든 테두리가 묻혀서 거의 다 뛰기 직전이라 바로 공개하기로 했다.
참석해주신 여러분 수고하셨습니다.
https://qiita.com/advent-calendar/2020/maya
에서 언급한 문제, 마야의 논문 평가는 괜찮았습니까?
하여튼
  • 복사와 붙여넣기는 실질적으로 내보내기 및 가져오기
  • 붙여넣은 후 "pasted"의 노드가 대량으로 읽힘
  • 실수로 문자열 입력란에 붙이려고 발동하면 압력(또는 무시)
  • 그게 더 큰 서류라면 압력은 마하
  • 이런 곳에 검은 돌이 모였어요.
    올해 에들러12/10의 프레임에서 언급되었다도 다른 곳에서 찾을 수 있다.
    고려할 만한 대책으로 삼다
    pasted_대량의 이름 바꾸기 처리가 발생한 후, 쉴 새 없이 이름 바꾸기 처리를 반복할 수밖에 없었는데, 매우 재미없었다붙여넣을 때 붙여넣기 여부를 확인하는 확인 대화 상자를 엽니다.

    MSceneMessage를 사용한 다이얼 백 플러그인


    요즘 리베이트에 대한 기사가 자주 나와서 한번 해봤어요.

    python 플러그인


    my_plugin.py
    import maya.OpenMaya as om
    
    def some_func():
        print( 'なにか' )
    
    def initializePlugin(mobject):
        print( 'なにか' )
    
    def uninitializePlugin(mobject):
        print( 'なにか' )
    
    mobject를 매개변수로 하는 initialize Plugin 함수 및
    mobject를 매개 변수로 하는 uninitialize Plugin 함수를 포함합니다.파일 이름
    python 경로에 놓으면 플러그인 관리자에서 플러그인을 읽을 수 있습니다.
    ...위의 각본은 실제로 이런 내용을 쓰지 않고 단지 인상을 잡기 위한 예일 뿐이다.
    플러그인이 활성화된 경우(선택된 경우) initialize Plugin 함수 실행
    uninitialize Plugin 함수는 반대로 플러그인이 비활성화될 때 실행됩니다.

    반송


    겸사겸사 그에게 뭘 좀 시키다
    이런 구조를 콜백이라고 합니다.
    근처에 다르면 훅이라고도 해요.
    콜백과 훅은 호칭이 다를 뿐, 도대체 같은지, 비슷한지, 미묘한 차이가 있는지, 완전히 다르다.
    아직 잘 모르겠어요.Shootgun과 관련된 곳에서 이런 것을 hook이라고 부른다.
    'MSceneMessage call back'이라는 단어로 검색을 해보면...
    마야의 API에서 어떤 메세지를 준비했는지 참고로 나올 것 같습니다.
    이거나 DFTalk의 과거 기사(2013년이라니!)
    예로 들다
    새로운 장면에서 발동하고 싶은'kBefore New','kAfter New', 참조할 때'kBefore Reference','kAfter Reference', 그리고 가져올 때, 내보낼 때, Plugin 읽기, 해제할 때... 등 각종 사건이 발생하는 시기에'땡땡이 치도록 하자'.
    그 밖에
    호출을 등록하는 함수로 "addCallback", "addCheckCallback", "addString ArrayCallback"을 사용합니다.기다리다
    교묘하게 사용할 수 있다면 꿈은 더욱 넓어질 것이다.

    부딪쳐 보다


    initialize Plugin으로 콜백을 등록하는 방법을 고려하여 unitialize Plugin이 등록한 콜백을 제거하십시오.
    my_plugin.py
    import maya.OpenMaya as om
    from maya.OpenMaya import MSceneMessage
    
    IDs = []
    
    def some_func():
        print( 'なにか' )
    
    def initializePlugin(mobject):
        result_id = MSceneMessage.addCallback(MSceneMessage.kBeforeNew,some_func)
        global IDs
        IDs.append(result_id)
    
    def uninitializePlugin(mobject):
        if not IDs is []:
            for callback_id in IDs:
                MSceneMessage.removeCallback(callback_id)
    
    이쪽에서 준비한 "some func"처리를 호출 등록으로 했습니다.
    ddCallback에 건네준 것은'MScene Message.k Before New'였기 때문에'새로운 장면을 찍기 전에'겸사겸사 썸을 탔다.func라고 합니다.
    addCallback 함수가 성공하면 콜백 ID를 반환합니다.
    이것은 처리를 끝내는 데 사용되기 때문에 반드시 미리 제어해야 한다.
    그런 다음 uninitialize Plugin 함수에서 removeCallback을 사용하여 호출을 제거합니다.
    아까 기다리던 호출 ID를 통해 그 ID의 호출이 제거됩니다.
  • initialize Plugin을 통해 콜백 추가 & 콜백 ID 가져오기
  • uninitialize Plugin에서 리콜 ID를removeCallback에 전달하고 제거
  • 이건 필수야.

    이벤트 붙여넣기


    Before New나 After Reference처럼'Before Copy','After Paste'같은 것이 있으면 이해하기 쉬우나 없다.
    글의 첫머리에 예를 들어 설명한 바와 같이 마야의 복사와 붙이기는 사실상 도출과 수입이기 때문에 복사용, 붙이는 활동을 준비하세요. 이런 신분은 사치를 허용하지 않습니다.
    가져오거나 내보내면 이벤트가 준비되어 있기 때문에 사용하기로 했습니다.

    클립보드 위치 지정하기


    '붙여넣을 때 확인 대화상자 보내기' 처리를 고려해야 합니다. 가져올 때의 이벤트를 사용합니다.
    수입할 때마다 확인하면 보통 수입하고 싶을 때 답답해요.
    조건을 붙여서 헤어지고 싶어요.
    Maya 붙여넣기는 복사(실질적 내보내기)를 가져올 때 내보낸 장면을 통해 수행됩니다.
    그럼 그 장면을 읽는 위치는?
    os.environ.get('TEMP')
    
    이렇게 하면 얻을 수 있는 TEMP 폴더에 maya_sceneClipBoard.拡張子라는 이름으로 놓여 있다.
  • 가져오려면 콜백 발동
  • 가져올 파일이 TEMP에 있으면 붙여넣기 시도
  • 로 판단
    나는 이대로 가고 싶다.

    콜백 등록 함수


    방금 쓴 스크립트는 일반적인 "add Callback"을 사용했고, 이번에는 "add Check File Callback"을 사용하기로 결정했습니다.
    # MSceneMessage.addCallback
    MSceneMessage.addCheckFileCallback
    
    이 옵션을 사용하는 경우 등록된 콜백에 대해
  • 현재 처리할 파일 전송
  • 휴가가 전달되면 처리 중단
  • 그렇게 말해도 돼.
    addCheckFileCallback에 전달되는 함수 (여기는 "some func") 에서 MScript Util.setBool에 False를 전달하면 작업이 중단되고 True를 통해 계속됩니다.
    여기는 KBefore Import Check이라는 이벤트에 대한 썸입니다.func가 등록되어 있기 때문에 '가져오기 전에 검사하기' → 'setBool에서 True/False를 통해 중단하거나 계속' 이라는 내용을 쓸 수 있습니다.
    retCode를 setBool의 첫 번째 인자에 건네줍니다. 이것은 호출에 등록된 함수의 첫 번째 인자로 전달되며, 이 함수의 결과를 수신하는 데 사용됩니다.
    이 근처에 쓰여 있어요.
    https://help.autodesk.com/view/MAYAUL/2020/ENU/?guid=__cpp_ref_class_m_scene_message_html
    이렇게 하면 재료가 다 모인다.
    그런 다음 가져올 때 제출한 fileObject 경로와 TEMP 경로를 비교합니다.
    붙여넣기로 판단되면 "붙여넣나요?"확인을 보내다
    취소할 경우 가져오기 중지
    이렇게 처리하면 완성됩니다.

    되다


    이런 느낌을 해봤어요.
    paste_alert.py
    def some_func(retCode, fileObject, clientData):
        filename_raw = fileObject.rawFullName()
        print('いまインポートしようとしてるファイル >',filename_raw)
        
        om.MScriptUtil.setBool(retCode, True)
        # om.MScriptUtil.setBool(retCode, False)    < インポートを中断
    
    def initializePlugin(mobject):
        result_id = MSceneMessage.addCheckFileCallback(MSceneMessage.kBeforeImportCheck,some_func)
        global IDs
        IDs.append(result_id)
    
    이렇게 하면 붙여넣기 시 가져오기가 곧 시작될 경우
    確認ダイアログ
    이런 느낌으로 날 붙잡아.
    참고로 "감시ctl+V"에서 보낸 게 아니니까.
    같은 조건에 적용되는 유사 작업(Maya의 시청각 포트에 TEMP의 클립보드 파일을 직접 던져 가져오는 등)도 나온다.

    총결산


    플러그인으로 제작되었기 때문에 기능을 취소하고 싶을 때 unload를 진행할 수 있습니다
    어떤 오류가 있어도 스크립트에reload가 있고 없어도 unload-load로 업데이트되기 때문에 개발이 수월합니다.
    경솔하게 플러그인을 만들어라.

    좋은 웹페이지 즐겨찾기