회원 로그인
정보기억 정보기억에 체크할 경우 다음접속시 아이디와 패스워드를 입력하지 않으셔도 됩니다.
그러나, 개인PC가 아닐 경우 타인이 로그인할 수 있습니다.
PC를 여러사람이 사용하는 공공장소에서는 체크하지 마세요.
소셜네트워크 서비스를 통해서 로그인하시면 별도의 로그인 절차없이 회원서비스를 이용하실 수 있습니다.


최근 게시물

1.노션에서 작성 중

1.노션에서 작성 중

개편하기 전까지 노션에서 작성 중

2024.04.04//read more

2.ChatGPT

2.ChatGPT

OpenAI로 대규모 언어 모델대화형...

2023.03.16//read more

3.노코딩 게임 엔진 - 빌..

3.노코딩 게임 엔진 - 빌..

빌드 지원안드로이드iOS윈도우즈특이사...

2023.03.14//read more

4.(완료) 미접속 회원 정..

4.(완료) 미접속 회원 정..

[완료] 36명의 회원을 정리하였습니...

2023.02.16//read more

5.매뉴얼 플러스 - 전자제..



안정적인 DNS 서비스 DNSEver
DNS Powered by DNSEver.com


스킨 복사

푸딩뱃살 | 2013.12.01 00:22 | 조회 3444
스킨 복사
# -*- coding: utf-8 -*-
# ptCopySkinTool.py
# 2011.12.22 ~ 2012.10.19
# scripted by kkyu, edited by artsOne

from maya import cmds,mel
#from dwRigLibrary import *

def ptCST_UI():
    cmds.columnLayout(adj=1)
    cmds.frameLayout('ptCST_fL1',l=u'스킨 복사',cll=1,cl=1,bs='etchedIn') #,bgc=[0.5,0.5,0.5])
    cmds.menuBarLayout('ptCST_mBL1')
    cmds.menu('ptCST_m1',l=u'설정',en=1)
    cmds.menuItem('ptCST_mI1-1',l=u'설정 저장',c='ptCST_setting(1)',en=0)
    cmds.menuItem('ptCST_mI1-2',l=u'설정 초기화',c='ptCST_setting(0)',en=1)
    #cmds.menuItem(divider=1)
    #cmds.menu('ptCST_m3',l=u'도움말',en=0)
    #cmds.menuItem('ptCST_mI3-1',l=u'사용법',c='ptCST_help()',en=1)
    cmds.columnLayout(adj=1)
    cmds.rowColumnLayout(nr=1,w=300)
    cmds.button('ptCST_b1',l=u'원본 (0)',c='ptCST_listReplace(0)')
    cmds.button('ptCST_b2',l=u'대상 (0)',c='ptCST_listReplace(1)')
    cmds.setParent('..')
    cmds.rowColumnLayout(nr=1,w=300)
    cmds.textScrollList('ptCST_tSL1',nr=10,ams=1,a=u'오브젝트를 선택하세요.',en=0)
    cmds.textScrollList('ptCST_tSL2',nr=10,ams=1,a=u'오브젝트를 선택하세요.',en=0)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.columnLayout(adj=1)
    cmds.button('ptCST_b3',l=u'1:1 스킨 복사',c='ptCST_OneSkinCopy()')
    cmds.frameLayout('ptCST_fL2',l=u'1:∞ 스킨 복사',fn='smallFixedWidthFont',cll=0,cl=1,bs='etchedIn')
    cmds.columnLayout(adj=1)
    cmds.textFieldButtonGrp('ptCST_tFBG1',l=u'*원본 선택:',bl=u'가져오기',adj=2,cw3=(143,30,40),bc='ptCST_pickSourceObject()',ann=u'*마우스 오른쪽 클릭 사용')
    #기본셋명 팝업
    cmds.popupMenu(b=3)
    cmds.menuItem(l=u'입력 삭제',c="cmds.textFieldButtonGrp('ptCST_tFBG1',e=1,tx='')",en=1)
    cmds.menuItem(divider=1)
    cmds.menuItem(l=u'최근사용이름',en=0)
    cmds.rowLayout(nc=2,cw2=(143,200),adj=2)
    cmds.text(l=u'')
    cmds.button('ptCST_b4',l=u'대상 오브젝트들 선택 후 스킨 복사',c='ptCST_OneByAllSkinCopy()')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.columnLayout(adj=1)
    cmds.frameLayout('ptCST_fL2',l=u'옵션',cll=1,cl=0,bs='etchedIn')
    cmds.columnLayout(adj=1)
    cmds.radioButtonGrp('ptCST_rBG1',l=u'Surface Association: ',la2=['Closest point on surface','Ray cast'],cw3=(140,150,80),nrb=2)
    cmds.radioButtonGrp('ptCST_rBG2',shareCollection='ptCST_rBG1',l=u'',la2=['Closest component','UV space'],cw3=(140,150,80),nrb=2,en2=0)
    cmds.radioButtonGrp('ptCST_rBG1',e=1,sl=1)
    cmds.optionMenuGrp('ptCST_oMG1',el=u'',l=u'Ingluence Association 1: ',en=1)
    cmds.menuItem('ptCST_mI1',l=u'Closest joint') #default
    cmds.menuItem('ptCST_mI2',l=u'Closest bone')
    cmds.menuItem('ptCST_mI3',l=u'One to one')
    cmds.menuItem('ptCST_mI4',l=u'Label')
    cmds.menuItem('ptCST_mI5',l=u'Name')
    cmds.setParent('..')
    cmds.optionMenuGrp('ptCST_oMG1',e=1,v='One to one')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')

#윈도우 UI
def ptCST_winUI(_use):
    if _use == 1:
        if cmds.window('ptCST_w1',ex=1):
            cmds.deleteUI('ptCST_w1',wnd=1)
        cmds.window('ptCST_w1',s=1,t=u'스킨 복사')
        ptCST_UI()
        cmds.showWindow('ptCST_w1')
    else:
        if cmds.window('ptCST_w1',ex=1):
            cmds.deleteUI('ptCST_w1',wnd=1)
        print u'툴을 열 수 없습니다.'

#스크롤리스트 아웃풋
def ptCST_listReplace(_intA):
    if _intA == 0:
        cmds.textScrollList('ptCST_tSL1',e=1,ra=1,en=1)
        cmds.button('ptCST_b1',e=1,l=u'원본 (0)')
    elif _intA == 1:
        cmds.textScrollList('ptCST_tSL2',e=1,ra=1,en=1)
        cmds.button('ptCST_b2',e=1,l=u'대상 (0)')
    _list = cmds.ls(sl=1)
    #리스트 출력
    if len(_list) >= 1:
        #버튼에 리스트 갯수 출력
        if _intA == 0:
            cmds.textScrollList('ptCST_tSL1',e=1,a=_list)
            cmds.button('ptCST_b1',e=1,l=u'원본 (%d)' %len(_list))
        elif _intA == 1:
            cmds.textScrollList('ptCST_tSL2',e=1,a=_list)
            cmds.button('ptCST_b2',e=1,l=u'대상 (%d)' %len(_list))
    else:
        if _intA == 0:
            cmds.textScrollList('ptCST_tSL1',e=1,a=u'오브젝트를 선택하세요.',en=0)
            ptCST_listReplace_cD1 = cmds.confirmDialog(t=u'에러',m=u'오브젝트를 선택하지 않았습니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
            if ptCST_listReplace_cD1 == u'확인':
                pass
            #cmds.error(u'오브젝트를 선택하지 않았습니다.')
        elif _intA == 1:
            cmds.textScrollList('ptCST_tSL2',e=1,a=u'오브젝트를 선택하세요.',en=0)
            ptCST_listReplace_cD2 = cmds.confirmDialog(t=u'에러',m=u'오브젝트를 선택하지 않았습니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
            if ptCST_listReplace_cD2 == u'확인':
                pass
            #cmds.error(u'오브젝트를 선택하지 않았습니다.')

#카피스킨 옵션 리턴
def ptCST_optionAssoReturn(_assoType):
    _surfaceAssoDic = {1:'closestPoint',2:'rayCast',3:'closestComponent',4:'none'}
    _inglAssoDic = {'Closest joint':'closestJoint','Closest bone':'closestBone','One to one':'oneToOne','Label':'label','Name':'name'}
    _surfaceValue = 0
    if _assoType == 'surface':
        #두개의 라디오버튼 추출
        _surfaceValue = cmds.radioButtonGrp('ptCST_rBG1',q=1,sl=1)
        if _surfaceValue == 0:
            _surfaceValue = cmds.radioButtonGrp('ptCST_rBG2',q=1,sl=1)
            _surfaceValue = _surfaceValue + 2
        _surfaceAssoValue = _surfaceAssoDic[_surfaceValue]
        return _surfaceAssoValue
    elif _assoType == 'ingluence':
        _ingluenceValue = cmds.optionMenuGrp('ptCST_oMG1',q=1,v=1)
        _ingAssoValue = _inglAssoDic[_ingluenceValue]
        return _ingAssoValue

#일대일 카피스킨
#차후: 스키닝 되어 있는지 먼저 검사 후 카피스킨
def ptCST_OneSkinCopy():
    _listA = cmds.textScrollList('ptCST_tSL1',q=1,si=1)
    _listB = cmds.textScrollList('ptCST_tSL2',q=1,si=1)
    try:
        _a = len(_listA)
        _b = len(_listB)
    except TypeError:
        ptCST_OneSkinCopy_cD1 = cmds.confirmDialog(t=u'에러',m=u'원본 또는 대상에 오브젝트 리스트가 없거나,\r리스트에서 선택하지 않았습니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
        if ptCST_OneSkinCopy_cD1 == u'확인':
            pass
      #cmds.error(u'원본 또는 대상에 오브젝트 리스트가 없거나, 리스트에서 선택하지 않았습니다.')
    else:
        if _a != _b:
            ptCST_OneSkinCopy_cD2 = cmds.confirmDialog(t=u'에러',m=u'택된 원본과 선택된 대상의 갯수가 다릅니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
            if ptCST_OneSkinCopy_cD2 == u'확인':
                pass
            #cmds.error(u'선택된 원본과 선택된 대상의 갯수가 다릅니다.')
        else:
            ptCST_optionOutput()
            _i = 0
            for _name in _listA:
                try:
                    cmds.select(_name,r=1)
                    cmds.select(_listB[_i],tgl=1)
                    #카피 스킨 명령
                    cmds.copySkinWeights(nm=1,sa=ptCST_optionAssoReturn('surface'),ia=ptCST_optionAssoReturn('ingluence'))
                    print '%s >> %s' %(_name,_listB[_i])
                    _i = _i + 1
                except RuntimeError:
                    ptCST_OneSkinCopy_cD3 = cmds.confirmDialog(t=u'에러',m=u'오브젝트에 스키닝이 되어 있지 않습니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
                    if ptCST_OneSkinCopy_cD3 == u'확인':
                        pass
                    #cmds.error(u'오브젝트에 스키닝이 되어 있지 않습니다.')

#일대다 카피스킨 (스크롤리스트와는 다르게 실행)
#차후: 스키닝 되어 있는지 먼저 검사 후 카피스킨
def ptCST_pickSourceObject():
    selectObject = cmds.ls(sl=1)
    if len(selectObject) == 1:
        selectObjectShape = cmds.listRelatives(selectObject,s=1)[0]
        if cmds.objectType(selectObjectShape) == 'mesh':
            cmds.textFieldButtonGrp('ptCST_tFBG1',e=1,tx=selectObject[0])
        else:
            ptCST_pickSourceObject_cD1 = cmds.confirmDialog(t=u'에러',m=u'Mesh가 아닌 것은 선택할 수 없습니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
            if ptCST_pickSourceObject_cD1 == u'확인':
                pass
            #cmds.error(u'Mesh가 아닌 것은 선택할 수 없습니다.')
    elif len(selectObject) >= 2:
        ptCST_pickSourceObject_cD2 = cmds.confirmDialog(t=u'에러',m=u'오브젝트를 하나만 선택해야 합니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
        if ptCST_pickSourceObject_cD2 == u'확인':
            pass
    else:
        ptCST_pickSourceObject_cD3 = cmds.confirmDialog(t=u'에러',m=u'오브젝트를 선택하지 않았습니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
        if ptCST_pickSourceObject_cD3 == u'확인':
            pass
        #cmds.error(u'오브젝트를 선택하지 않았습니다.')

def ptCST_OneByAllSkinCopy():
    selectSource = cmds.textFieldButtonGrp('ptCST_tFBG1',q=1,tx=1)
    selectTarget = cmds.ls(sl=1)
    if selectSource != '':
        if len(selectTarget) > 0:
            #옵션 출력
            #ptCST_optionOutput()
            nameMesh = []
            nameNoMesh = []
            #메쉬인지 검색
            for sT in selectTarget:
                if cmds.nodeType(sT) == 'transform':
                    sTshape = cmds.listRelatives(sT,s=1)[0]
                    if cmds.objectType(sTshape) == 'mesh':
                        nameMesh.append(sT)
                    else:
                        nameNoMesh.append(sT)
                else:
                  nameNoMesh.append(sT)
            #메쉬가 아닐 때 출력
            if len(nameNoMesh) >= 1:
                print u'\nMesh가 아닌 리스트'
                print u'========================================'
                for nNM in nameNoMesh:
                    nNMshape = cmds.listRelatives(nNM,s=1)[0]
                    objTypeName = cmds.objectType(nNMshape)
                    print u'%s (%s)' %(nNM,objTypeName)
                print u'========================================\n'
                ptCST_OneByAllSkinCopy_cD1 = cmds.confirmDialog(t=u'에러',m=u'Mesh가 아닌 것이 있습니다.\nScript Editor를 확인하세요.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
                if ptCST_OneByAllSkinCopy_cD1 == u'확인':
                    pass
                #cmds.error(u'Mesh가 아닌 것이 있습니다. Script Editor를 확인하세요.')
            #메쉬일 때 출력
            elif len(nameMesh) >= 1:
                for nM in nameMesh:
                    if selectSource != nM:
                        #카피 스킨 명령
                        try:
                            cmds.select(selectSource,r=1)
                            cmds.select(nM,tgl=1)
                            cmds.copySkinWeights(nm=1,sa=ptCST_optionAssoReturn('surface'),ia=ptCST_optionAssoReturn('ingluence'))
                            print '%s >> %s' %(selectSource,nM)
                        except RuntimeError:
                            ptCST_OneByAllSkinCopy_cD2 = cmds.confirmDialog(t=u'에러',m=u'원본 또는 대상에 스키닝이 되어 있지 않습니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
                            if ptCST_OneByAllSkinCopy_cD2 == u'확인':
                                pass
                            #cmds.error(u'원본 또는 대상에 스키닝이 되어 있지 않습니다.')
                    else:
                        print '%s >> %s' %(selectSource,nM)
                        ptCST_OneByAllSkinCopy_cD3 = cmds.confirmDialog(t=u'에러',m=u'원본 오브젝트와 대상 오브젝트의 네임이 같습니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
                        if ptCST_OneByAllSkinCopy_cD3 == u'확인':
                            pass
                        #cmds.error(u'원본 오브젝트와 대상 오브젝트의 네임이 같습니다.')
        else:
            ptCST_OneByAllSkinCopy_cD4 = cmds.confirmDialog(t=u'에러',m=u'대상 오브젝트들을 선택하지 않았습니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
            if ptCST_OneByAllSkinCopy_cD4 == u'확인':
                pass
            #cmds.error(u'대상 오브젝트들을 선택하지 않았습니다.')
    else:
      ptCST_OneByAllSkinCopy_cD5 = cmds.confirmDialog(t=u'에러',m=u'원본이 선택되어 있지 않습니다.',b=[u'확인'],db=u'확인',bgc=[1,0,0])
      if ptCST_OneByAllSkinCopy_cD5 == u'확인':
        pass
      #cmds.error(u'원본이 선택되어 있지 않습니다.')

#설정 초기화
def ptCST_setting(_settingValue):
    #설정초기화
    if _settingValue == 0:
        cmds.button('ptCST_b1',e=1,l=u'원본 (0)')
        cmds.button('ptCST_b2',e=1,l=u'대상 (0)')
        cmds.textScrollList('ptCST_tSL1',e=1,ra=1,a=u'오브젝트를 선택하세요.',en=0)
        cmds.textScrollList('ptCST_tSL2',e=1,ra=1,a=u'오브젝트를 선택하세요.',en=0)
        cmds.radioButtonGrp('ptCST_rBG1',e=1,sl=1)
        cmds.optionMenuGrp('ptCST_oMG1',e=1,v='One to one')
        cmds.textFieldButtonGrp('ptCST_tFBG1',e=1,tx='')
        print u'\n\r스킨복사 설정이 초기화 되었습니다.'
    #설정 저장
    elif _settingValue == 1:
        print 'save'
    #최근사용 저장
    elif _settingValue == 2:
        pass

#도움말
def ptCST_help():
    print 'help'

#옵션 출력
def ptCST_optionOutput():
    print '-----------------------------------------'
    print 'Surface Association : ' + ptCST_optionAssoReturn('surface')
    print 'Ingluence Association : ' + ptCST_optionAssoReturn('ingluence')
    print '-----------------------------------------'

ptCST_winUI(1)
466개(12/24페이지)
마야
번호 제목 글쓴이 조회 날짜
공지 마야 뷰포트 네비게이션 팁 푸딩뱃살 43755 2020.04.06 17:22
공지 Maya 버전 별 Python 버전 푸딩뱃살 64954 2014.01.08 17:59
244 [Plugin] AnimSchool Picker v 1.12 첨부파일 푸딩뱃살 1995 2014.03.01 01:41
243 [Script] MEL syntax highlighting for Notepad++ 첨부파일 푸딩뱃살 5963 2014.02.06 13:46
242 [Modeling] mesh smooth 관한 이야기 첨부파일 푸딩뱃살 3131 2014.01.09 17:37
>> [Script] 스킨 복사 푸딩뱃살 3445 2013.12.01 00:22
240 [참고] 마야 완벽 지우기 푸딩뱃살 10333 2013.11.13 00:40
239 [Script] 스무스 바인드 툴 첨부파일 푸딩뱃살 3626 2013.11.07 13:58
238 [Script] 퍼 켜고 렌더레이어에 넣기 script 푸딩뱃살 3593 2013.08.28 11:43
237 [Script] 선택한 오브젝트 smoothLevel 변경 script 푸딩뱃살 3129 2013.08.23 17:59
236 [Script] 사용하지 않는 furDescroption 삭제 script 푸딩뱃살 2526 2013.08.23 14:42
235 [Script] 선택한 두 오브젝트 중간에 로케이터 생성 script 첨부파일 푸딩뱃살 2851 2013.08.23 14:04
234 [Rigging] 세개의 joint로 구현한 fk, ik 스위치 사진 첨부파일 푸딩뱃살 3084 2013.08.20 18:56
233 [Rigging] joint scale로 stretch 시 하위까지 scale 적용될 때 첨부파일 푸딩뱃살 2736 2013.08.05 16:28
232 [Node] 마야 기본 노드 첨부파일 푸딩뱃살 4739 2013.08.05 15:15
231 [Script] Camera Attr 첨부파일 푸딩뱃살 4296 2013.08.05 14:25
230 [참고] SyntaxHighlighter for Mel (Maya) 첨부파일 푸딩뱃살 4434 2013.07.30 01:16
229 [Base] 마야 다운으로 임시 저장된 ma, mb로 저장하기 첨부파일 푸딩뱃살 6338 2013.04.19 19:29
228 [Base] Maya 2014 New Features: Node Editor 푸딩뱃살 4715 2013.04.17 01:47
227 [Rigging] Maya 2014 New Features: Joint Tool 푸딩뱃살 4594 2013.04.17 01:45
226 [Plugin] Advanced Skeleton 첨부파일 푸딩뱃살 6848 2013.04.14 13:15
225 [참고] Victor Vinyals Character Character Rig Animation Reel 푸딩뱃살 3462 2013.04.14 03:17