2011-06-27 47 views
5

Đây có thể là một câu hỏi khá phức tạp vì có thể rất nhiều bạn không biết phần mềm mà tôi đang viết nó cho: Autodesk Maya 2011. Tôi đang cố gắng tăng tốc quá trình chậm chạp (gian lận: cho các ký tự 3d khả năng di chuyển) bằng cách viết một tập lệnh tự động thực hiện.Lặp lại qua BA danh sách cùng một lúc bằng Python?

Tôi sẽ cố hết sức để giải thích tình huống.

Tôi có một tập lệnh nhận một đối tượng, lặp qua con của đối tượng đó, lưu trữ chúng trong danh sách, sau đó đặt đối tượng ban đầu ở cuối danh sách, đảo ngược danh sách vì nó sai đường, đặt đối tượng ban đầu ở phía trước.

Sự cố: Có ba danh sách khác nhau tất cả cùng một đối tượng TYPE nhưng có tên khác nhau và chúng thực sự là các đối tượng khác nhau. Mục tiêu của tôi là kết nối chúng với nhau bằng cách tạo ra các nút gọi là 'pha trộn'. Nhưng nếu tôi có một vòng lặp để tạo chúng cho từng đối tượng trong danh sách A, thì tôi cần các vòng lặp kết nối chúng với các đối tượng trong các danh sách khác và tôi không thể tìm ra điều này.

Đây là mã của tôi, nó đã được phát với số lượng không đầy đủ so với trước đây so với vòng lặp thực tế.

import maya.cmds as cmds 

    def crBC(IKJoint, FKJoint, bindJoint, xQuan, switch): 

     # gets children joints of the selected joint 
     chHipIK = cmds.listRelatives(IKJoint, ad = True, type = 'joint') 
     chHipFK = cmds.listRelatives(FKJoint, ad = True, type = 'joint') 
     chHipBind = cmds.listRelatives(bindJoint, ad = True, type = 'joint') 
     # list is built backwards, this reverses the list 
     chHipIK.reverse() 
     chHipFK.reverse() 
     chHipBind.reverse() 
     # appends the initial joint to the list 
     chHipIK.append(IKJoint) 
     chHipFK.append(FKJoint) 
     chHipBind.append(bindJoint) 
     # puts the last joint at the start of the list because the initial joint 
     # was added to the end 
     chHipIK.insert(0, chHipIK.pop()) 
     chHipFK.insert(0, chHipFK.pop()) 
     chHipBind.insert(0, chHipBind.pop()) 


     # pops off the remaining joints in the list the user does not wish to be blended 
     chHipBind[xQuan:] = [] 

     chHipIK[xQuan:] = [] 

     chHipFK[xQuan:] = [] 

     # goes through the bind joints, makes a blend colors for each one, connects 
     # the switch to the blender 

     for a in chHipBind 


      rotBC = cmds.shadingNode('blendColors', asUtility = True, n = a + 'rotate_BC') 
      tranBC = cmds.shadingNode('blendColors', asUtility = True, n = a + 'tran_BC') 
      scaleBC = cmds.shadingNode('blendColors', asUtility = True, n = a + 'scale_BC') 

      cmds.connectAttr(switch + '.ikFkSwitch', rotBC + '.blender') 
      cmds.connectAttr(switch + '.ikFkSwitch', tranBC + '.blender') 
      cmds.connectAttr(switch + '.ikFkSwitch', scaleBC + '.blender') 

     # goes through the ik joints, connects to the blend colors 

      for b in chHipIK: 
       cmds.connectAttr(b + '.rotate', rotBC + '.color1') 
       cmds.connectAttr(b + '.translate', tranBC + '.color1') 
       cmds.connectAttr(b + '.scale', scaleBC + '.color1') 


      # connects FK joints to the blend colors 

      for c in chHipFK: 
       cmds.connectAttr(c + '.rotate', rotBC + '.color2') 
       cmds.connectAttr(c + '.translate', tranBC + '.color2') 
       cmds.connectAttr(c + '.scale', scaleBC + '.color2') 

     # connects blend colors to bind joints 


      cmds.connectAttr(rotBC + '.output', d + '.rotate') 
      cmds.connectAttr(tranBC + '.output', d + '.translate') 
      cmds.connectAttr(scaleBC + '.output', d + '.scale')     






    # executes function 


    crBC('L_hip_IK', 'L_hip_FK', 'L_hip_JNT', 6, 'L_legSwitch_CTRL') 
+0

Are các chỉ số trong tất cả ba danh sách giống nhau không? I E. 0 là như nhau cho cả ba danh sách? – GWW

+0

Sẽ dễ dàng hơn nếu bạn làm theo những gì mã của bạn đang cố gắng thực hiện nếu các tên biến không phải là nhiễu đường. – Daenyth

+0

@Denyeny: Chúng không phải là nhiễu đường nếu bạn hiểu không gian sự cố. –

Trả lời

23

Tôi hoàn toàn không hiểu câu hỏi, Bạn đang tìm kiếm

import itertools 
for a, b, c in itertools.izip(lst1, lst2, lst3): 
    ... 

?

Số izip là số biến đối số và trả về một trình lặp mà luôn mang lại các mục tương ứng của đối số (một bộ tham số đầu tiên trong lần chạy đầu tiên, một bộ tham số thứ hai trong lần chạy thứ hai , Vân vân và vân vân).

1

Tại sao có "Có ba danh sách khác nhau trong cùng một đối tượng TYPE"? Tại sao không thể sửa lỗi này để tạo một danh sách, trong đó cả ba đối tượng được khớp chính xác?

Tỷ lệ cược là tốt khi ánh xạ đơn giản sẽ tốt hơn ba danh sách song song.

Cụ thể, bạn cần sửa chHipIK = cmds.listRelatives(IKJoint, ad = True, type = 'joint') để làm việc như thế này.

chHipIK = [ { 'IK': ik } for ik in mds.listRelatives(IKJoint, ad = True, type = 'joint') ] 
for i, fk in enumerate(cmds.listRelatives(FKJoint, ad = True, type = 'joint')): 
    chHipIK[i]['FK']= fk 
for i, bind in enumerate(cmds.listRelatives(bindJoint, ad = True, type = 'joint')): 
    chHipIK[i]['FK']= bind 

Vì vậy, chHipIK là danh sách ánh xạ có tất cả ba phần thông tin.

+0

Xin chào, có thể tôi đang làm sai, nhưng điều này không hiệu quả đối với tôi, có thể có bất kỳ số lượng khớp nào trong chuỗi chung, vì vậy tôi không thể chỉ định kết nối nào nếu nó có một danh sách. Tôi đã cố gắng thêm vào một danh sách tổng thể và chỉ sử dụng danh sách [1] vv nhưng cùng một vấn đề. Tôi thực sự mới với python, chỉ có một tuần. Chỉ cần cho các hồ sơ, không có lệnh như cập nhật người thân trong maya do đó phương pháp hapdash của tôi chỉ phụ thêm vào một danh sách tổng thể, tôi hy vọng bạn có thể nghĩ ra một cách khác bởi vì tôi hoàn toàn bị mất ... :) – Jared

+0

@ Jared: Một danh sách ánh xạ không phụ thuộc vào một danh sách chính.Trong trường hợp này, bạn sẽ cần phải viết vòng lặp cập nhật của riêng bạn. –

0

@florian Mayer cách với zip hoặc izip hoạt động thực sự tốt, nhưng bạn cũng có thể sử dụng enumerate để có được số lượng danh sách,

list_a = ["x", "y"] 
list_b = ["k", "j"] 
list_c = ["m", "n"] 

for count, item in enumerate(list_a): 
    print item, list_b[count], list_c[count] 
Các vấn đề liên quan