braidTool_Maya_script_error # NameError: имя 'QtGui' не определено - PullRequest
0 голосов
/ 11 декабря 2018

Я нашел в сети чужой инструмент для тесьмы, и он, похоже, работает для других, но не для меня.Я не могу связаться с этим человеком за помощью, поэтому я пишу здесь.Есть 2 сценария, один из которых предназначен для создания оплетки, а другой - для загрузки пользовательского интерфейса.Я продолжаю получать следующую ошибку:

# Error: Traceback (most recent call last):
# File "<maya console>", line 2, in <module>
#   File "/home/ykim/private/maya/2018/scripts/JUM/scripts/braid.py", line 12, in <module>
#     list_form, list_base = load_ui_type(ui_file)
#   File "/home/ykim/private/maya/2018/scripts/JUM/core/loadUIFile.py", line 30, in load_ui_type
#     form_class = frame['Ui_{0}'.format(form_class)]
#   File "<string>", line 1, in <module>
# NameError: name 'QtGui' is not defined
 # 

Ниже приведен 1-й скрипт, создающий косу

import os
from JUM.core.loadUIFile import get_maya_window, load_ui_type
import random
import maya.cmds as cmds

ui_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'UI','braid.ui')
list_form, list_base = load_ui_type(ui_file)

class espiral(list_form, list_base):

    def __init__(self, parent = get_maya_window()):
        self.__radius = 0.0
        self.__side = 6
        self.__variation = 0
        self.__circle = ''
        self.__pt_position_A = []
        self.__pt_position_B = []
        self.__pt_position_C = []
        self.__path = ''
        self.__quantidade = 0.0
        self.clock = True

    ##########################################################
    #                                                        #
    #                    UI elements                         #
    #                                                        #
    ##########################################################
        self.window_name = 'makeSpiralWin'

        if cmds.window(self.window_name, exists = True):
            cmds.deleteUI(self.window_name)

        super(espiral, self).__init__(parent)

        self.setupUi(self)

        self.btn_selectPath.clicked.connect(self.getPath)
        self.btn_create.setDisabled(True)
        self.btn_create.clicked.connect(self.create)

    def __makeEight(self):
        side = 16
        offset = self.spin_offset.value()

        eight = cmds.circle(nr=(0, 1, 0), c=(0, 0, 0), degree=3, sections=side)
        cmds.select(eight[0])
        lattice = cmds.lattice(dv = (3, 2, 3), objectCentered  = True )
        cmds.setAttr(lattice[0]+'.local', 0)


        cmds.select(lattice[1]+'.pt[2][0:1][0]',lattice[1]+'.pt[2][0:1][1]',lattice[1]+'.pt[2][0:1][2]')
        cmds.scale(1, 1, -1, pivot = (1.108194, 0 , 0), relative = True)
        cmds.select(lattice[1]+'.pt[1][0:1][0]',lattice[1]+'.pt[1][0:1][1]',lattice[1]+'.pt[1][0:1][2]')
        cmds.scale(0, 0, 0, pivot = (0, 0 , 0), relative = True)
        cmds.select(lattice[1]+'.pt[0][0:1][0]',lattice[1]+'.pt[2][0:1][2]',lattice[1]+'.pt[2][0:1][0]',lattice[1]+'.pt[0][0:1][2]')

        cmds.scale(1, 1, 1.455556, pivot = (0, 0 , 0), relative = True)
        cmds.scale(0.929167, 1, 1, pivot = (0, 0 , 0), relative = True)

        cmds.select(eight[0])
        cmds.delete(ch = True)


        cmds.rotate(0,offset,0,eight[0])
        cmds.makeIdentity(eight[0],apply = True, t = True, r = True, s = True, n = 0, pn = True)
        return eight

    def __next(self, porcentagem,eight,scale):
        #print porcentagem
        curva = self.ln_path.text()


        position = cmds.pointOnCurve(curva, top=True, pr=porcentagem, position=True)
        tangent  = cmds.pointOnCurve(curva, top=True, pr=porcentagem, tangent=True)
        angle    = cmds.angleBetween(er=True, v1=(0.0, 1.0, 0.0), v2=tangent)



        cmds.scale((scale * random.uniform((1-self.spin_random.value()), 1.0)),
                   (scale * random.uniform((1-self.spin_random.value()), 1.0)),
                   (scale * random.uniform((1-self.spin_random.value()), 1.0)),
                   eight[0])
        cmds.move(position[0],
                  position[1],
                  position[2],
                  eight[0])
        cmds.rotate(angle[0],
                    angle[1],
                    angle[2],
                    eight[0])


    def __voltas(self):
        steps = 16 * float(self.spin_loops.value())
        porcent = 1.0 / steps
        return int(steps), porcent

    def __makeMesh(self,curva):
        scale_0 = self.spin_radius.value()
        scale_1 = self.spin_radius_1.value()
        scale = self.spin_radius.value()
        if (scale_0 >= scale_1):
            tempMaior = scale_0
            tempMenor = scale_1
        else:
            tempMaior = scale_1
            tempMenor = scale_0

        scale_extrude = tempMenor/tempMaior

        position = cmds.pointOnCurve(curva, top=True, pr=0, position=True)
        tangent  = cmds.pointOnCurve(curva, top=True, pr=0, normalizedTangent=True)
        angle    = cmds.angleBetween(er=True, v1=(0.0, 1.0, 0.0), v2=tangent)

        circle = cmds.circle(nr=(0, 1, 0), c=(0, 0, 0), degree=3, sections=16, r = 0.5)
        cmds.scale(tempMaior,
                   tempMaior,
                   tempMaior,
                   circle[0])
        cmds.move(position[0],
                  position[1],
                  position[2],
                  circle[0])
        cmds.rotate(angle[0],
                    angle[1],
                    angle[2],
                    circle[0])


        extrude = cmds.extrude(circle[0],
                                curva,
                                constructionHistory = True,
                                range = True,
                                polygon = 0,
                                extrudeType = 2,
                                useComponentPivot = 0,
                                fixedPath = 0,
                                useProfileNormal = 1,
                                rotation = 0,
                                scale = scale_extrude,
                                reverseSurfaceIfPathReversed = 1)


        poly = cmds.nurbsToPoly(extrude[0], matchNormalDir = True, constructionHistory = False, format = 2, polygonType = 1, uType = 3, uNumber = 1, vType = 3, vNumber = 3)

        cmds.delete(circle, extrude[0])
        print poly
        return poly



    def __curve(self):
        curve_A = cmds.curve(p=self.__pt_position_A)
        curve_B = cmds.curve(p=self.__pt_position_B)
        curve_C = cmds.curve(p=self.__pt_position_C)

        if (self.btn_makeMesh.isChecked()):
            mesh_A = self.__makeMesh(curve_A)
            mesh_B = self.__makeMesh(curve_B)
            mesh_C = self.__makeMesh(curve_C)
            cmds.delete(curve_A, curve_B, curve_C)
            cmds.select(mesh_A,mesh_B,mesh_C)
        else:
            cmds.select(curve_A,curve_B,curve_C)





    def __braid(self):
        steps, porcent = self.__voltas()
        increment = porcent

        eight = self.__makeEight()

        list = range(int(steps))
        offset = self.spin_offset.value()
        offset_normalize = offset/360.0
        self.progress_Create.setRange(0,len(list))

        scale_0 = self.spin_radius.value()
        scale_1 = self.spin_radius_1.value()
        if (scale_0 >= scale_1):
            scale_maior = scale_0
            scale_menor = scale_1
        else:
            scale_maior = scale_1
            scale_menor = scale_0

        diference = scale_maior-scale_menor
        percent = diference/steps
        scale = scale_maior

        if (self.btn_reverse.isChecked()):
            curva = self.ln_path.text()
            cmds.reverseCurve(curva,ch = False, replaceOriginal = True)


        for i in list:
            self.progress_Create.setValue(i)
            self.__next(porcent,eight,scale)

            porcent += increment

            _pos_A = (i*0.0625)%1.0 + offset_normalize
            _pos_B = (i*0.0625+0.333333)%1.0 + offset_normalize
            _pos_C = (i*0.0625+0.666666666)%1.0 + offset_normalize

            self.__pt_position_A.append(cmds.pointOnCurve( eight[0],top = True, pr= _pos_A, p=True ))
            self.__pt_position_B.append(cmds.pointOnCurve( eight[0],top = True, pr= _pos_B, p=True ))
            self.__pt_position_C.append(cmds.pointOnCurve( eight[0],top = True, pr= _pos_C, p=True ))
            scale -= percent


        self.progress_Create.reset()
        #cmds.delete(self.__circle[0])
        # return self.__pt_position
        self.__curve()
        cmds.delete(eight[0])

    def getPath(self):
        path = cmds.ls(sl = True)
        if path == []:
            self.ln_path.setText('Nothing selected')
            self.btn_create.setDisabled(True)
            self.ln_path.setStyleSheet("background-color: rgb(110, 90, 90);")
        else:
            shape_path = cmds.listRelatives(path[0])
            if (cmds.objectType(shape_path)== 'nurbsCurve'):
                self.ln_path.setText(path[0])
                self.btn_create.setEnabled(True)
                self.ln_path.setStyleSheet("background-color: rgb(90, 150, 50);")
            else:
                self.ln_path.setText('Path not valid')
                self.btn_create.setDisabled(True)
                self.ln_path.setStyleSheet("background-color: rgb(110, 90, 90);")

    def create(self):

        self.__braid()

        self.__pt_position_A = []
        self.__pt_position_B = []
        self.__pt_position_C = []


def run():
    espira = espiral()
    espira.show()

Другой скрипт предназначен для загрузки дизайна пользовательского интерфейса

import shiboken2
from PySide2 import QtWidgets
from PySide2 import QtGui
import maya.OpenMayaUI as apiUI
from cStringIO import StringIO
import pyside2uic
import xml.etree.ElementTree as xml

def get_maya_window():

    ptr = apiUI.MQtUtil.mainWindow()
    if ptr is not None:
        return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow)

def load_ui_type(ui_file):

    parsed = xml.parse(ui_file)
    widget_class = parsed.find('widget').get('class')
    form_class = parsed.find('class').text
    with open(ui_file,'r') as f:
        o = StringIO()
        frame = {}

        pysideu2ic.compileUi(f, o, indent = 0)
        pyc = compile(o.getvalue(), '<string>', 'exec')
        exec pyc in frame

        # Fetch the base_class and form class based on their type in the xml from design
        form_class = frame['Ui_{0}'.format(form_class)]
        base_class = eval('QtGui.{0}'.format(widget_class))

    return form_class, base_class
...