maya窗口添加背景标签
发布日期:2021-05-07 21:44:31 浏览次数:41 分类:精选文章

本文共 8143 字,大约阅读时间需要 27 分钟。

import osfrom functools import partialimport shiboken2from PySide2 import QtCore,QtWidgets,QtGuiimport maya.cmds as cmdsimport maya.OpenMayaUI as OpenMayaUIimport maya.OpenMaya as OpenMayaWEIGHTS = {    'light': QtGui.QFont.Light,    'normal': QtGui.QFont.Normal,    'demibold': QtGui.QFont.DemiBold,    'bold': QtGui.QFont.Bold,    'black': QtGui.QFont.Black,}class ViewportLabel(object):    def __init__(self, m3dview, label, callback):        self.m3dview = m3dview        self.label = label        self._callback = callback    def __del__(self):        self.label.setParent(None)        del(self.label)    def callback(self):        if not self._callback:            return        text = self._callback()        self.label.setText(self._callback())        self.label.setMinimumSize(self.label.minimumSizeHint())class Viewport(object):    identifier_labels = []    def __init__(self, m3dview):        self._m3dview = m3dview        self.text_labels = []        self._update_callback = None        self._destroy_callback = None    def get_widget(self):        w = shiboken2.wrapInstance(long(self._m3dview.widget()),QtWidgets.QMainWindow)        return w    def get_panel(self):        panel = OpenMayaUI.MQtUtil.fullName(long(self._m3dview.widget()))        for p in reversed(panel.split('|')):            if p:                return p    def get_camera(self):        camera = OpenMaya.MDagPath()        self._m3dview.getCamera(camera)        camera.pop()        return camera.partialPathName()    def set_camera(self, camera_path):        sel = OpenMaya.MSelectionList()        sel.add(camera_path)        camera = OpenMaya.MDagPath()        sel.getDagPath(0, camera)        util = OpenMaya.MScriptUtil(0)        int_ptr = util.asUintPtr()        camera.numberOfShapesDirectlyBelow(int_ptr)        num_shapes = util.getUint(int_ptr)        if num_shapes:            camera.extendToShape()        self._m3dview.setCamera(camera)        #self._m3dview.scheduleRefresh()    def get_background(self):        color = self._m3dview.backgroundColor()        return color[0], color[1], color[2]    def set_background(self, values):        cmds.displayRGBColor('background', *values)    def _draw_text(self, **kwargs):        '''Draw text in viewportand return a QLabel        :param text: String to display in viewport        :param color: Color of text        :param size: Point Size of text        :param position: Position of text in viewport        :param weight: Weight of text (light, normal, demibold, bold, black)        :param background: Background color (R, G, B)        :param callback: Text callback        '''        text = kwargs.get('text', 'No Text')        color = kwargs.get('color', (255, 255, 255))        color = QtGui.QColor(*color)        font = kwargs.get('font', 'Monospace')        position = kwargs.get('position', (0, 0))        weight = WEIGHTS[kwargs.get('weight', 'bold')]        bgc = kwargs.get('background', self.get_background())        bgc = bgc[0] * 255, bgc[1] * 255, bgc[2] * 255        background = QtGui.QColor(*bgc)        size = kwargs.get('size', 24)        callback = kwargs.get('callback', None)        qw = self.get_widget()        label = QtWidgets.QLabel(text, parent=qw)        font = QtGui.QFont(font, size, weight)        font.setStyleHint(QtGui.QFont.TypeWriter)        label.setFont(font)        label.setAutoFillBackground(True)        label.setAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft)        palette = QtGui.QPalette()        palette.setColor(label.backgroundRole(), background)        palette.setColor(label.foregroundRole(), color)        label.setPalette(palette)        label.show()        label.setMinimumSize(label.minimumSizeHint())        label.move(*position)        return ViewportLabel(self, label, callback)    def draw_text(self, **kwargs):        '''Draw text in viewport and install post render callback to update hud        Signature to _draw_text method PLUS        '''        if not self._update_callback:            self._create_update_callback()        if not self._destroy_callback:            self._create_destroy_callback()        self.text_labels.append(self._draw_text(**kwargs))        self._update_labels()    def _preset_kwargs(self, **kwargs):        kwargs.setdefault('position', (0, len(self.text_labels) * 30))        kwargs.setdefault('size', 18)        return kwargs    def draw_frame(self, **kwargs):        kwargs = self._preset_kwargs(**kwargs)        def frame_callback():            return "Frame {:<20}".format(int(cmds.getAttr('time1.outTime')))        self.draw_text(callback=frame_callback, **kwargs)    def draw_scene(self, **kwargs):        kwargs = self._preset_kwargs(**kwargs)        def scene_callback():            scene = cmds.file(q=True, shn=True, sn=True)            return "Scene {:<20}".format(os.path.splitext(scene)[0])        self.draw_text(callback=scene_callback, **kwargs)    def draw_camera(self, **kwargs):        kwargs = self._preset_kwargs(**kwargs)        def camera_callback():            return "Camera {:<20}".format(self.get_camera())        self.draw_text(callback=camera_callback, **kwargs)    def draw_focal_length(self, **kwargs):        kwargs = self._preset_kwargs(**kwargs)        def focal_callback():            cam = self.get_camera()            focal_length = float(cmds.getAttr(cam + ".focalLength"))            return "Camera angle {:<20.2f}".format(focal_length)        self.draw_text(callback=focal_callback, **kwargs)    def clear_text(self):        self._destroy_labels()    def register_callback(self, handler):        callback = OpenMayaUI.MUiMessage.add3dViewPostRenderMsgCallback(            self.get_panel(),            handler)        return callback    def register_destroy_callback(self, handler):        callback = OpenMayaUI.MUiMessage.add3dViewDestroyMsgCallback(            self.get_panel(),            handler)        return callback    def _create_update_callback(self):        self._update_callback = self.register_callback(            self._update_labels)    def _create_destroy_callback(self):        self._destroy_callback = self.register_destroy_callback(            self._destroy_labels)    def _update_labels(self, *args):        for label in self.text_labels:            label.callback()    def _destroy_labels(self, *args):        while True:            try:                label = self.text_labels.pop()                del(label)            except IndexError:                break        cb, self._update_callback = self._update_callback, None        dcb, self._destroy_callback = self._destroy_callback, None        if cb and dcb:            OpenMayaUI.MUiMessage.removeCallback(cb)            del(cb)            OpenMayaUI.MUiMessage.removeCallback(dcb)            del(dcb)    @staticmethod    def count():        return OpenMayaUI.M3dView.numberOf3dViews()    @classmethod    def get(cls, index):        m3dview = OpenMayaUI.M3dView()        OpenMayaUI.M3dView.get3dView(index, m3dview)        return cls(m3dview)    @classmethod    def active(cls):        m3dview = OpenMayaUI.M3dView.active3dView()        return cls(m3dview)    @classmethod    def show_identifiers(cls):        for index, viewport in cls.enumerate():            label = viewport._draw_text(                text=str(index),                font='Helvetica',                size=128,                position=(0,0),                weight='bold',            )            cls.identifier_labels.append(label)    @classmethod    def clear_identifiers(cls):        while True:            try:                label = cls.identifier_labels.pop()                del(label)            except IndexError:                break    @classmethod    def enumerate(cls, visible=True):        for index in xrange(cls.count()):            m3dview = OpenMayaUI.M3dView()            OpenMayaUI.M3dView.get3dView(index, m3dview)            if not visible or (visible and m3dview.isVisible()):                yield index, cls(m3dview)def main():    view = Viewport.active()    view.draw_scene()    view.draw_frame()    view.draw_camera()    view.draw_focal_length()    if __name__ == '__main__':    main()

在这里插入图片描述

提示:拍屏时不显示
上一篇:maya python创建迷宫
下一篇:python系统托盘

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月04日 19时55分16秒