Thay đổi một nút giá trị trong nhiều tài liệu bằng tập lệnh python

Aug 16 2020

Máy xay sinh tố và trăn newbee đây.

Tôi sẽ rất vui nếu một trong các bạn có thể giúp tôi vấn đề sau mà tôi đang gặp phải: tôi đã nhập một mô hình cân vào máy xay sinh tố, mà tôi muốn hiển thị ở quy mô đời thực. Khi tôi chia tỷ lệ mô hình, các vật liệu không theo tỷ lệ và trông xấu. Tuy nhiên, tất cả các vật liệu đều có một nút Giá trị có tên là "Quy mô", nếu tôi chỉnh sửa nó với cùng một tỷ lệ, tôi đang chia tỷ lệ mô hình, sẽ sửa mọi thứ và nó trông như ngay sau đó.

Sẽ dễ dàng hơn nhiều nếu có một tập lệnh để thực hiện điều đó bán tự động, vì mô hình sử dụng hơn 100 đối tượng với các vật liệu khác nhau ...

Những gì tôi có thể tìm thấy là loại vấn đề tương tự này đã được giải quyết , nhưng tôi không thể điều chỉnh nó để giải quyết vấn đề của mình, vì tôi không có kinh nghiệm trước đây về kịch bản.

Những gì tôi muốn làm:

  • Chọn các đối tượng tôi muốn thay đổi
  • Đi vào tập lệnh
  • sao chép một tập lệnh vào nó
  • chỉnh sửa một số sẽ được đưa vào nút giá trị có nhãn "tỷ lệ" của tất cả các đối tượng đã chọn
  • chạy script
  • rất vui khi nhận được kết quả hiển thị tốt hơn.

Tôi đang sử dụng Blender 2.83.4, trong tập lệnh, bảng điều khiển cho biết PYTHON INTERACTIVE CONSOLE 3.7.4 (mặc định, ngày 17 tháng 2 năm 2020, 16:23:28) [MSC v.1916 64 bit (AMD64)]

Mọi sự giúp đỡ đều được đánh giá cao!

Trả lời

1 RobertGützkow Aug 16 2020 at 18:07

Tập lệnh bên dưới lặp lại trên tất cả các đối tượng đã chọn và điều chỉnh các nút giá trị trong các vật liệu được chỉ định nếu nhãn của chúng được đặt thành "Scale".

import bpy
      
       
def set_scale_nodes_selected_objects(scale_val):
    for obj in bpy.context.selected_objects:
        for mat_slot in obj.material_slots:
            set_scale_nodes_material(mat_slot.material, scale_val)
    

def set_scale_nodes_material(mat, scale_val):
    if mat is not None and mat.use_nodes and mat.node_tree is not None:
        for node in mat.node_tree.nodes:
            if node.label == "Scale" and node.type == "VALUE":
                node.outputs["Value"].default_value = scale_val  


if __name__ == "__main__":
    scale_val = 1.0
    set_scale_nodes_selected_objects(scale_val)