회원 로그인
|
스킨 복사
스킨 복사
# -*- 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)
댓글 0개
| 엮인글 0개
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 |