खोज…


पैरामीटर

पैरामीटर विवरण
ई / संपादित करें माया को बताता है कि आप किसी मौजूदा संपत्ति का मूल्य बदलना चाहते हैं
क्यू / क्वेरी माया को बताता है कि आप किसी मौजूदा संपत्ति का मूल्य प्राप्त करना चाहते हैं

टिप्पणियों

माया काफी पूर्ण यूआई टूलकिट के साथ आता है जिसमें खिड़कियां, लेआउट और विभिन्न प्रकार के नियंत्रण शामिल हैं। यह C ++ में क्यूटी फ्रेमवर्क का उपयोग करके कार्यान्वित किया जाता है, लेकिन MEL और पायथन उपयोगकर्ताओं के लिए डिफ़ॉल्ट माया कमांड सेट के माध्यम से उजागर होता है।

क्यूटी

उन्नत उपयोगकर्ता C ++ या अजगर का उपयोग करके माया UI का विस्तार कर सकते हैं। 2012 से 2016 तक माया संस्करण Pyside और QT4 का उपयोग करते हैं; माया 2017 Pyside2 और qt5 का उपयोग करता है। अधिक जानकारी यहाँ

नोट: वेब पर पुराना संदर्भ माया जीयूआई टूलकिट को "ईएलएफ" के रूप में संदर्भित करता है; यह अभी भी सही नाम है, लेकिन इसका उपयोग शायद ही कभी किया जाता है।

बेसिक UI उदाहरण [पायथन]

माया जीयूआई टूलकिट सरल, अनिवार्य रूप में विभिन्न प्रकार के यूआई तत्व बनाता है। GUI विजेट बनाने और संपादित करने के लिए बुनियादी कमांड हैं; विगेट्स की पहचान एक अद्वितीय स्ट्रिंग नाम से की जाती है।

सभी gui कमांड एक ही मूल रूप लेते हैं: आप एक कमांड प्रकार और उस ऑब्जेक्ट का स्ट्रिंग नाम प्रदान करते हैं जिसे आप काम करना चाहते हैं या बनाना चाहते हैं, साथ ही झंडे के साथ जो विजेट के रूप या व्यवहार को निर्दिष्ट करते हैं। इसलिए, उदाहरण के लिए, एक बटन बनाने के लिए जिसका आप उपयोग करेंगे:

 cmds.button('my_button', label = 'my label')

यह एक नया gui बटन बनाएगा। बटन को संपादित करने के लिए आप edit ध्वज के साथ एक ही कमांड का उपयोग करेंगे (लघु संस्करण बस e )। तो आप इस तरह से बटन का लेबल बदल सकते हैं:

cmds.button('my_button', e=True, label = 'a different label')

और आप किसी संपत्ति के वर्तमान मूल्य को query या q ध्वज के साथ query कर सकते हैं:

cmds.button(`my button`, q=True, label=True)
# 'a different label'

विजेट नामकरण

जब आप UI कमांड के साथ एक नया विजेट बनाते हैं तो आप उस नाम की आपूर्ति कर सकते हैं जिसे आप प्राप्त करना चाहते हैं। हालांकि, इसकी गारंटी नहीं है : माया बटन को आपके द्वारा मांगे गए नाम को दे देगी - यदि आपने इसे एक ऐसा चरित्र दिया है जो इसे नहीं पहचानता है या यदि पहले से ही एक ही नाम वाला एक विजेट है तो आप एक अलग नाम वापस पा सकते हैं। आश्चर्य से बचने के लिए बनाए जाने पर नए विजेट के नाम को पकड़ने के लिए हमेशा एक अच्छा अभ्यास होता है:

 my_button = cmds.button('my_button') 
 cmds.button(my_button, e=True, label = "a new label")

कॉलबैक फ़ंक्शन

कई विजेट्स में इवेंट शामिल होते हैं जो उपयोगकर्ता द्वारा विजेट के साथ बातचीत करने पर कॉलबैक फ़ंक्शन को आग लगा सकते हैं। उदाहरण के लिए जब एक बटन दबाया जाता है, तो एक चेकबॉक्स चेक किया जाता है, या एक ड्रॉपडाउन चुना जाता है जिससे आप एक फ़ंक्शन को आग लगा सकते हैं।

इन घटनाओं से जुड़ा सटीक झंडा विजेट पर निर्भर करता है, लेकिन एक सामान्य कॉलबैक इस तरह दिखाई देगा:

 def callback_fn(_ignore):
     print "button pressed"

 button = cmds.button(label='press me', command = callback_fn)

बटन दबाने पर श्रोता विंडो में "बटन दबाया" छप जाएगा। अधिकांश विजेट की आग कुछ तर्क देती है जब उनके कॉलबैक सक्रिय होते हैं - उदाहरण के लिए button हमेशा एक बूलियन मूल्य शामिल होता है - इसलिए आपको यह सुनिश्चित करने की आवश्यकता होगी कि आपके द्वारा उपयोग किए जा रहे विजेट के साथ कॉलबैक हैंडलर के पास सही हस्ताक्षर हैं। इसीलिए callback_fn() एक तर्क लेता है, भले ही उसे इसकी आवश्यकता न हो।

कॉलबैक असाइनमेंट

माया कॉलबैक फ़ंक्शन को संलग्न करने के दो अलग-अलग तरीकों का समर्थन करती है:

   # this works, but is not a great idea
   cmds.button(label = 'string reference', command = 'string_name_of_function')
   # use this form whenever possible
   cmds.button(label = 'direct function reference', command = callback_fn)

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

यदि आप कॉल बैक फ़ंक्शन के लिए एक तर्क मान पास करना चाहते हैं, तो आप कॉलबैक में एक लैम्ब्डा , एक क्लोजर या एक फंक्शनलसेलेशियल बाइंड तर्क का उपयोग कर सकते हैं।

partial का उपयोग करना:

 from functools import partial
 ....
 def callback_fn(myValue, _ignore):  # _ignore swallows the original button argument
     print myValue

 button = cmds.button(label='press me', command = partial(callback_fn, "fooo"))

lambda का उपयोग करना:

 def callback_fn(myValue):
     print myValue

 button = cmds.button(label='press me', command = lambda _ignore: callback_fn("fooo"))
 # here the lambda needs to handle the button argument

क्लोजर का उपयोग करना

b = cmds.button(label = 'press me')
# by defining this function when `b` exists, we can use it later
# without storing it explicitly
def get_button_label(*_):
    print "label of button", b, " is ", cmds.button(b, q=True, l=True)
cmds.button(b, e=True, c=get_button_label)

यहां स्ट्रिंग कॉलबैक नामों बनाम कॉलबैक फ़ंक्शन के बारे में अधिक है

एक खिड़की का निर्माण

# create a window with a button that closes the window when clicked
window = cmds.window(title='example window')       # create the window
layout = cmds.columnLayout(adjustableColumn=True)  # add a vertical layout

def close_window(*_):
    cmds.deleteUI(window)                          # deletes the window above

button = cmds.button(label= 'press to close", command = close_window)

# show the window
cmds.showWindow(window)

लैम्ब्डा और लूप्स

GUI तत्वों के व्यवहार को बढ़ाने के लिए लैम्ब्डा एक उपयोगी शॉर्टकट है।

b = cmds.button("make a cube", command = lambda _: cmds.polyCube())

हालाँकि, पाइथन जिस तरह से लैम्ब्डा के अंदर चर को पकड़ता है, उसके कारण, आप अप्रत्याशित परिणाम प्राप्त कर सकते हैं यदि आप एक लूप के अंदर लैम्ब्डा का उपयोग करके कमांड को बांधते हैं। उदाहरण के लिए ऐसा लगता है कि यह ऐसे बटन का उत्पादन करना चाहिए जो विभिन्न आकारों के गोले बनाते हैं:

# warning: doesn't work like it looks!
for n in range(5):
    b = cmds.button("sphere size %i" % n, command = lambda _: cmds.polySphere(radius=n))

बटनों को सही ढंग से लेबल किया जाएगा, लेकिन सभी एक ही त्रिज्या (4) का उपयोग करेंगे, क्योंकि लूप बंद होने पर लैंबडास सभी उस मूल्य पर कब्जा कर लेंगे। TLDR: यदि आप किसी लूप के अंदर कॉलबैक जेनरेट कर रहे हैं, तो वैल्यू कैप्चर करने के लिए functools.partial या किसी अन्य विधि का उपयोग करें - functools.partial इस एप्लिकेशन के लिए काम नहीं करते हैं। अधिक जानकारी के लिए यहां देखें



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow