एक अजगर स्क्रिप्ट के साथ कई सामग्रियों में मूल्य नोड बदलना

Aug 16 2020

ब्लेंडर और अजगर न्यूबी यहां।

मुझे बहुत खुशी होगी अगर आप में से कोई एक मेरी समस्या को हल करने में मेरी मदद कर सकता है: मैंने एक स्केल मॉडल को ब्लेंडर में आयात किया है, जिसे मैं वास्तविक जीवन स्तर में प्रस्तुत करना चाहता हूं। जब मैं मॉडल को स्केल करता हूं, तो सामग्री इसके साथ स्केल नहीं करती है और खराब दिखती है। हालांकि सभी सामग्रियों में "स्केल" नाम का एक वैल्यू नोड होता है, अगर मैं इसे उसी स्केल से एडिट करता हूं तो मैं मॉडल को स्केल कर रहा हूं, सबकुछ ठीक करता है और यह सही दिखता है।

यह इतना आसान होगा कि स्क्रिप्ट को अर्ध-स्वचालित रूप से करना होगा, क्योंकि मॉडल विभिन्न सामग्रियों के साथ 100 से अधिक वस्तुओं का उपयोग करता है ...

मैं इस तरह की समस्या को हल कर सकता था , लेकिन मैं अपनी समस्या को हल करने के लिए इसे अनुकूलित नहीं कर पाया, क्योंकि मुझे पटकथा के साथ कोई पूर्व अनुभव नहीं है।

मैं क्या करना चाहूंगा:

  • उन वस्तुओं का चयन करें जिन्हें मैं बदलना चाहता हूं
  • स्क्रिप्टिंग में जाओ
  • इसमें स्क्रिप्ट कॉपी करें
  • सभी चयनित वस्तुओं के "स्केल" लेबल वाले मान नोड में एक संख्या को संपादित करना चाहिए
  • स्क्रिप्ट चलाएं
  • बेहतर प्रतिपादन परिणाम पाने के लिए खुश रहें।

मैं ब्लेंडर 2.83.4 का उपयोग कर रहा हूं, कंसोल में स्क्रिप्टिंग कहता है कि PYTHON INTERACTIVE CONSOLE 3.7.4 (डिफ़ॉल्ट, 17 फरवरी 2020, 16:23:28) [MSC v.1916 64 बिट (AMD64)]

हर मदद बहुत सराहना की है!

जवाब

1 RobertGützkow Aug 16 2020 at 18:07

नीचे दी गई स्क्रिप्ट सभी चयनित ऑब्जेक्ट्स पर पुनरावृत्त करती है और यदि उनके लेबल को सेट किया जाता है, तो निर्दिष्ट सामग्री में मान नोड समायोजित करता है "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)