باستخدام مكتبات GUI الخارجية لجعل واجهات المستخدم في Autodesk Maya

StackOverflow https://stackoverflow.com/questions/397337

سؤال

أقوم بتطوير أدوات في Autodesk Maya. العديد من الأدوات التي أبنيها لديها واجهات غيانية نافذة بسيطة للرسوم المتحركة والمواديين لاستخدامها. غالبا ما تحتوي هذه الواجهات الخلية الواقعة على ما تتوقعه عادة أن ترى في أي نافذة أساسية؛ المعملات والقوائم والقوائم والأزرار والأزرار والأزرار، إلخ. ومع ذلك، هناك قيود على تعقيد UIS يمكنك البناء مع الأدوات المتاحة، على وجه التحديد في أنواع الحاجيات المتوفرة.

أنا مهتم باستخدام بعض الحاجيات Wxpython الأكثر تقدما مثل ListView (GRID)، Tree، إلخ. هذا سيتضمن استخدام WxFrame الكامل (نافذة) لعرض واجهة المستخدم بأكملها، والتي من شأنها أن تعني بشكل أساسي أن النافذة لن تعد أن تكون مرتبطة مايا. ليس الكسارة الصفقة، ولكن هذا يعني عندما يتم تقليل مايا، لن تناسب النافذة.

لقد جربت شيئا مثل هذا من قبل مع Tkinter كاختبار، لكنه وجد أنه يحتاج إلى تشغيل Mainloop لتشغيله في موضوعه الخاص. هذا منطقي، ولكن في حالتي، فإنه يتعارض مع موضوع مايا الخاص، مما يجعل مايا شنق حتى يتم إغلاق النافذة. يرجع ذلك إلى حقيقة أن مايا يدير جميع البرامج النصية، سواء كانت ميلا أو بيثون، في مؤشر ترابط واحد سهم Maya Gui الرئيسي. هذا هو منع برنامج نصي واحد من، على سبيل المثال، حذف كائن أثناء وجود برنامج نصي آخر يحاول القيام به على نفس الكائن.

Wxpython لديه هذه نفس "Mainloop" المنهجية. أتساءل عما إذا كان هناك أي طريقة حولها حتى تتمكن من العمل داخل مايا؟

هل كانت مفيدة؟

المحلول

لست متأكدا مما إذا كان هذا أمرا أمريا، لكن بعض googling يحول إلى أن pyqt شعبية جدا داخل مايا. يمكنك تجربة التقنية هنا أو هنا (شرح هنا مع شفرة المصدر) من إنشاء خيوط جديدة عبر Maya وتنفيذ داخل ذلك. يبدو MAYA يحتوي على وحدة نمطية تضمنت كائن مؤشر ترابط جديد، مع QApplication داخله:

def initializePumpThread():
    global pumpedThread
    global app
    if pumpedThread == None:
        app = QtGui.QApplication(sys.argv)
        pumpedThread = threading.Thread(target = pumpQt, args = ())
        pumpedThread.start()

ثم يقوم بإعداد وظيفة لمعالجة أحداث QT:

def pumpQt():
    global app
    def processor():
        app.processEvents()
    while 1:
        time.sleep(0.01)
        utils.executeDeferred( processor )

ربما يمكنك القيام بشيء مماثل مع Wxpython أيضا. (Utils.Executedeferred هي وظيفة مايا.) تأكد من مراجعة كيفية إنشاء عدم حظر واجهة المستخدم الرسومية على Wxpython Wiki. بدلا من processevents ()، سترغب في إعداد حلقة حدث وتحقق من الأحداث "المعلقة" داخل وظيفة pumpqt (نأمل إعادة تسمية) أعلاه. (مصدر Wxpython لديه Python التنفيذ من Mainloop.) من المرجح أن يتم ذلك من خلال وظيفة app.yield ()، لكنني لست متأكدا.

def pumpWx():
    global app
    def processor():
        app.Yield(True)
    while 1:
        time.sleep(0.01)
        utils.executeDeferred( processor )

def initializePumpThread():
    global pumpedThread
    global app
    if pumpedThread == None:
        app = wx.App(False)
        pumpedThread = threading.Thread(target = pumpWx, args = ())
        pumpedThread.start()

مستندات Wxpython تشير إلى Safeyield () هو المفضل. مرة أخرى، يبدو أن هذا قد يكون الخطوة الأولى، لكنني لست متأكدا من أنها ستعمل وليس فقط تحطم فظيعة. (هناك بعض النقاش حول ما تريد القيام به على Wxpython القائمة البريدية ولكن من بين عدد قليل من الإصدارات الطفيفة من WX قبل.) هناك أيضا بعض المؤشرات في مختلف المنتديات أن هذه التقنية تسبب مشاكل في إدخال لوحة المفاتيح. قد تحاول أيضا القيام به:

def processor():
  while app.Pending(): app.Dispatch()

للتعامل مع قائمة الأحداث الحالية.

حظ سعيد!

نصائح أخرى

لا أعرف إذا كان هناك طريقة حول Mainloop ل GUI، لأنه ضروري للتعامل مع جميع سلاسل الأحداث وإعادة نشر قوائم الانتظار.

ولكن هناك عدة وسيلة للاتصال بين المعالجة، مثل الأنابيب أو السماطية. ربما يكون خيارا لتقسيم امتداد مايا الخاص بك إلى البرنامج المساعد الفعلي، والضيق إلى مايا، وتطبيق منفصل لوجوي. يمكن لهذين ذلك استخدام هذه الوسائل للتواصل وتبادل المعلومات النموذجية بين البرنامج المساعد و GUI. ومع ذلك، لست متأكدا، ومع ذلك، إذا كان بإمكاني أن أوصي بهذا النهج حقا لأنه يعقد التطبيق كثيرا.

يمكن أن يكون لديك نظرة على ipython، وهي قذيفة بيثون التفاعلية، التي وضع فريق Dev بعض الجهد في دمجها مع Wxpython. لديهم طريقة في مقاطعة حلقة الحدث وتثبيتها للقيام بأشياء خاصة بهم.

أفضل طريقة للذهاب هي إنشاء qwidget مع ما تحتاجه، واستخدامه من داخل MPXCommand من خلال API C ++. بهذه الطريقة لديك أيضا فرصة لحفظ المحررين المخصصين الكاملين في مايا عبر ScriptedPanels.

ولكن إذا كنت مرتبطا ببيثون، فإن Pyqt هو الطريق للذهاب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top