Maya导出存储文件工具

笔记记录

效果展示

保存场景为ma文件,并且可以加载,刷新等。

主要思路

主要逻辑在controllerLibrary.py脚本,save,find,load3个方法。创建ControllerLibrary类继承于dict字典类,数据存储name,path,screenshot的相关路径等等。

主要API:cmds.file()进行文件的存储和读取 cmds.viewFit():将摄像机对准物体 cmds.playblast():渲染导出图片 json.dump():json文件的编码写入 json.load():json文件的解码读取

image-20200831160940099

#-*-coding:gbk-*-

from maya import cmds
import os
import json
import pprint

#获取Maya文档路径
USERAPPDIR = cmds.internalVar(userAppDir=True)
#文件夹路径
DIRECTORY = os.path.join(USERAPPDIR, "controllerLibrary")


def createDirectory(directory=DIRECTORY):
    """
    根据文件路径创建文件夹
    Args:
        directory(str): 要创建的文件夹路径

    Returns:

    """
    #首先判断文件夹是否存在
    if not os.path.exists(directory):
        #如果不存在那就创建文件夹
        os.mkdir(directory)


#继承字典类
class ControllerLibrary(dict):

    #保存文件方法
    #**info关键字参数
    def save(self,name,screenshot=True,directory=DIRECTORY,**info):

        #首先要确认要保存的路径是否存在
        createDirectory(directory)

        #保存文件路径
        path = os.path.join(directory,"{0}.ma".format(name))
        #json保存文件
        infoFile = os.path.join(directory,"{0}.json".format(name))
        info["name"] = name
        info["path"] = path

        #判是否需要screenShot
        if screenshot:
            self.saveScreenshot(name,directory)

        #进行场景文件的保存,保存格式为mayaAscii
        cmds.file(rename=path)

        #如果进行了选择,就单独保存选择了的物体场景
        if cmds.ls(selection=True):
            cmds.file(force=True,type="mayaAscii",exportSelected=True)

        #否则保存全部场景物体
        else:
            cmds.file(save=True,type="mayaAscii",force=True)

        #打开infoFile文件,保存为json格式,写入文件
        with open(infoFile,"w") as f:
            json.dump(info,f,indent=4)

        self[name] = path

    #获得文件夹下的所有文件
    def find(self,directory=DIRECTORY):
        # 进行清空,避免删除.ma文件时没有更新
        self.clear()

        if not os.path.exists(directory):
            return None

        files = os.listdir(directory)

        #进行特定筛选,只获取ma文件
        mayaFiles = [f for f in files if f.endswith(".ma")]

        #进行键值对存储
        for ma in mayaFiles:
            #分离文件名和扩展名
            name,ext = os.path.splitext(ma)
            path = os.path.join(directory,ma)

            #查看是否json文件
            infoFile = "{0}.json".format(name)
            if infoFile in files:
                infoFile = os.path.join(directory,infoFile)
                #读取每个场景配置的json文件
                with open(infoFile,"r") as f:
                    #进行读取
                    info = json.load(f)

            else:
                print(u"没有发现{0}文件".format(infoFile))
                info = {}

            #查看是否screenshot图片
            screenshot = "{0}.jpg".format(name)
            if screenshot in files:
                info["screenshot"] = os.path.join(directory,screenshot)

            info["name"]=name
            info["path"]=path

            self[name]=info
            #print(info)

    #加载
    def load(self,name):
        path = self[name]["path"]

        #进行加载
        cmds.file(path,i=True,usingNamespaces=False)

    #保存屏幕截图
    def saveScreenshot(self,name,directory=DIRECTORY):
        #确定图片保存的路径
        path = os.path.join(directory,"{0}.jpg".format(name))

        #将摄像机对准物体,以方便进行截图
        cmds.viewFit()
        #确定保存图片格式为jpg
        cmds.setAttr("defaultRenderGlobals.imageFormat",8)

        #进行截图,这个相当于渲染命令
        """
        completeFilename:导出图片的路径    forceOverwrite:是否覆盖现有的playblast     format:输出的格式
        width,heigt:分辨率     showOrnaments:是否显示轴坐标图      viewer:是否启动播放查看器
        """
        cmds.playblast(completeFilename=path,forceOverwrite=True,format="image",width=200,height=200,
                       showOrnaments=False,startTime=1,endTime=1,viewer=False)

        return path

主要逻辑构建好,就可以构建UI了,UI构建在libraryUI.py中完成

#-*-coding:gbk-*-

import controllerLibrary
from imp import reload
reload(controllerLibrary)
from PySide2 import QtWidgets,QtCore,QtGui
import maya.OpenMayaUI as omui
import maya.cmds as cmds
from shiboken2 import wrapInstance


#获取maya主窗口
def maya_main_window():
    main_window_ptr = omui.MQtUtil.mainWindow()
    return wrapInstance(long(main_window_ptr),QtWidgets.QWidget)


#ui类
class ControllerLibraryUI(QtWidgets.QDialog):

    #初始化
    def __init__(self,parent=maya_main_window()):
        super(ControllerLibraryUI, self).__init__(parent)
        self.library = controllerLibrary.ControllerLibrary()

        #图标size
        self.size = 64
        #格子Sizd
        self.buffer=12

        #设置窗口标题
        self.setWindowTitle(u"控制Library窗口")
        #关闭问号按钮
        self.setWindowFlags(self.windowFlags() ^ QtCore.Qt.WindowContextHelpButtonHint)

        self.createWidgets()
        self.createLayouts()
        self.createConnects()

        #填充ListWidget
        self.populate()

    def createWidgets(self):
        self.save_btn = QtWidgets.QPushButton("save")
        self.saveName_lineEdit = QtWidgets.QLineEdit()

        #设置listWidget
        self.file_listWidget = QtWidgets.QListWidget()
        #图标模式
        self.file_listWidget.setViewMode(QtWidgets.QListWidget.IconMode)
        #设置图标大小
        self.file_listWidget.setIconSize(QtCore.QSize(self.size,self.size))
        #设置拉伸模式为Adjust
        self.file_listWidget.setResizeMode(QtWidgets.QListWidget.Adjust)
        #设置GridSize
        self.file_listWidget.setGridSize(QtCore.QSize(self.size+self.buffer,self.size+self.buffer))

        self.import_btn = QtWidgets.QPushButton("Import")
        self.refresh_btn = QtWidgets.QPushButton("Refresh")
        self.close_btn = QtWidgets.QPushButton("Close")

    def createLayouts(self):
        main_layout = QtWidgets.QVBoxLayout(self)

        save_layout = QtWidgets.QHBoxLayout()
        save_layout.addWidget(self.saveName_lineEdit)
        save_layout.addWidget(self.save_btn)
        main_layout.addLayout(save_layout)

        main_layout.addWidget(self.file_listWidget)

        btn_layout = QtWidgets.QHBoxLayout()
        btn_layout.addWidget(self.import_btn)
        btn_layout.addWidget(self.refresh_btn)
        btn_layout.addWidget(self.close_btn)
        main_layout.addLayout(btn_layout)



    def createConnects(self):
        self.save_btn.clicked.connect(self.save)

        self.import_btn.clicked.connect(self.load)
        self.refresh_btn.clicked.connect(self.populate)
        self.close_btn.clicked.connect(self.close)

    def populate(self):

        #清空file_list,避免重复增加
        self.file_listWidget.clear()
        #获取Directory文件夹下经过筛选的文件
        self.library.find()

        #获取键值对
        for name,info in self.library.items():
            #创建ListWidegtItem
            item = QtWidgets.QListWidgetItem(name)
            #添加到file_listWidget
            self.file_listWidget.addItem(item)

            #查看是否有截图
            screenshot = info.get("screenshot")
            if screenshot:
                icon = QtGui.QIcon(screenshot)
                item.setIcon(icon)

    def load(self):
        #获取当前选中的ListWidgetItem
        currentItem = self.file_listWidget.currentItem()
        #如果没有选中,则弹出警告
        if not currentItem:
            QtWidgets.QMessageBox.warning(self,"warning",u"请选择文件!!")
            return

        self.library.load(currentItem.text())

    def save(self):
        #首先获取lineEdit的str
        name = self.saveName_lineEdit.text()

        #去除name的首尾空格
        if not name.strip():
            QtWidgets.QMessageBox.warning(self,"warning",u"名字不合法!!")
            return

        self.library.save(name)
        #重新更新ListWidget
        self.populate()
        #重置LineEdit
        self.saveName_lineEdit.setText("")


def showUI():
    ui = ControllerLibraryUI()
    ui.show()

    return ui

QListView和QListWidget的区别

我上次搞图片快速分类工具的时候,对于图片文件的预览我使用了QListView来进行数据的展示。这次我用QListWidget列表展示数据,那么他们到底有什么不一样呢?

QlistView类用于展示数据,它的子类是QListWIdget。QListView是基于模型(Model)的,需要程序来建立模型,然后再保存数据。QListWidget是一个升级版本的QListView,它已经建立了一个数据储存模型(QListWidgetItem),直接调用addItem()函数,就可以添加条目(Item)

图片快速分类中QlistView的使用

        #创建QFileSystemModel
        #QFileSystemModel是一个维护文件目录内容信息的模型,它本身不包含任何数据项,而只是表示本地文件系统上的文件和目录。
        self.file_model = QtWidgets.QFileSystemModel()
        #设置过滤器
        self.file_model.setNameFilters(self.FILTERS)
        #隐藏过滤掉的文件
        self.file_model.setNameFilterDisables(False)
        #设置Model
        self.ui.image_list_view.setModel(self.file_model)

存储导入工具中QListWidget的使用

        #设置listWidget
        self.file_listWidget = QtWidgets.QListWidget()
        #图标模式
        self.file_listWidget.setViewMode(QtWidgets.QListWidget.IconMode)
        #设置图标大小
        self.file_listWidget.setIconSize(QtCore.QSize(self.size,self.size))
        #设置拉伸模式为Adjust
        self.file_listWidget.setResizeMode(QtWidgets.QListWidget.Adjust)
        #设置GridSize                        self.file_listWidget.setGridSize(QtCore.QSize(self.size+self.buffer,self.size+self.buffer))
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2021 Opda
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信