Вы должны импортировать maya.cmds несколько раз, иначе Maya забудет об этом после нажатия кнопки - PullRequest
0 голосов
/ 08 марта 2019

Что касается некоторой предыстории, мой код, скорее всего, полный беспорядок, в основном потому, что в моей жизни было всего пару часов написания сценариев.

Для класса я создаю солнечную систему со всеми стандартными планетами, а также возможность для пользователя ввести свою собственную планету.Все работало нормально, пока я не попытался позволить пользователю порождать планеты с помощью кнопки в пользовательском интерфейсе (пока уродливая кнопка, но, тем не менее, кнопка).Если пользователь нажимает кнопку, скажем, «Солнце», тогда солнце появляется, но только один раз, если он затем решает снова породить Солнце или любую другую планету в этом отношении, он выдает ошибку, заявляющую, что модуль не содержит 'поликуб или полисфера.Таким образом, в основном кнопка работает один раз, а затем не работает.Если я звоню им откуда угодно, кроме кнопки, она работает идеально и бесконечно.Я понял, так как он не знает поликуб или полисферу, почти как если бы я не импортировал maya.cmds, поэтому давайте попробуем вспомнить его.и низко, и вот, что работает.

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

import maya.cmds as maya

class create_body:

    def __init__(self, distance, radius, bonus_scale, r, g, b):
        import maya.cmds as maya

        self.radius  = radius * bonus_scale / 1000
        self.bonusScale = bonus_scale
        self.distanceScene = distance
        self.distanceMeter = distance*1000000000

        maya.polyCube()

        self.r = r
        self.g = g
        self.b = b

    def color_body_custom(self):
        import maya.cmds as maya

        value = maya.colorEditor()

        self.color = [float(i) for i in value.split()]
        self.r = self.color[0]
        self.g = self.color[1]
        self.b = self.color[2]

    def spawn_body(self):
        import maya.cmds as maya

        maya.polySphere(r = self.radius)
        maya.move(self.distanceScene, moveZ = True)
        maya.move(0, 0, 0, ".scalePivot", ".rotatePivot", absolute=True)
        maya.polyColorPerVertex(rgb=(self.r,self.g,self.b), colorDisplayOption=True)

    def animate_body(self):
        import maya.cmds as maya

        orbitTimeYears = self.get_orbital_time()*10
        key = str(orbitTimeYears) + 'sec'
        maya.setKeyframe(v=0, at='rotateY', t=['0sec'], itt = 'spline', ott = 'spline')
        maya.setKeyframe(v=-360, at='rotateY', t=[key], itt = 'spline', ott = 'spline')
        maya.selectKey(attribute='rotateY')
        maya.setInfinity(pri='linear', poi='linear')

    def get_orbital_time(self):
        import math

        orbitMeter = self.distanceMeter * 2 * math.pi
        gravConst = 132690600000000000000 / self.distanceMeter
        orbitSpeed = math.sqrt(gravConst)
        orbitTimeSec = orbitMeter / orbitSpeed
        orbitTimeYears = orbitTimeSec / 31556926

        return orbitTimeYears

class create_ui:
    def __init__(self, window_name):
        self.myPlanetarySystem = window_name

        # Make sure there's only one window open by deleting the window if it exists
        self.delete_ui()

        # Create the UI
        self.myp = maya.window(self.myPlanetarySystem)
        maya.rowColumnLayout(numberOfColumns=3, columnWidth=[(1, 150), (2, 75), (3, 75)], columnOffset=[(1, 'left', 5)])
        maya.showWindow()
        maya.window(self.myPlanetarySystem, e=True, title='TileGenerator', w=200, h=190)

        maya.button(label = 'Sun', command = partial(self.body, 0, 695.510, 10, True, 1, 1, 0))
        maya.button(label='Mercury', command = partial(self.body, 57.9, 2.439, 1000, False, 0.2, 0.2, 0))

        #Sun = create_body(0, 695.510, 10, 1, 1, 0)
        #Sun.spawn_body()

        #Mercury = create_body(57.9, 2.439, 1000, 0.2, 0.2, 0)
        #Mercury.spawn_body()
        #Mercury.animate_body()

        #Venus = create_body(108.2, 6.051, 1000, .5, 0.2, 0)
        #Venus.spawn_body()
        #Venus.animate_body()

        #Earth = create_body(149.6, 6.971, 1000, 0, 0, 1)
        #Earth.spawn_body()
        #Earth.animate_body()

        #Mars = create_body(227.9, 3.389, 1000, 0.6, 0.1, 0)
        #Mars.spawn_body()
        #Mars.animate_body()

        #Jupiter = create_body(778.5, 69.911, 100, 0.9, 0.8, 0.5)
        #Jupiter.spawn_body()
        #Jupiter.animate_body()

        #Saturn = create_body(1433.4, 58.232, 100, 0.8, 0.8, 0.7)
        #Saturn.spawn_body()
        #Saturn.animate_body()

        #Uranus = create_body(2876.6, 25.362, 100, 0.7, 0.8, 1.0)
        #Uranus.spawn_body()
        #Uranus.animate_body()

        #Neptune = create_body(4503.4, 24.622, 100, 0.3, 0.4, 0.7)
        #Neptune.spawn_body()
        #Neptune.animate_body()

    def delete_ui(self):
        if maya.window(self.myPlanetarySystem, exists=True):
            maya.deleteUI(self.myPlanetarySystem, window=True)

    def body(self, distance, radius, bonus_scale, is_sun, r = 0.5, g = 0.5, b = 0.5, *args):
        obj =  create_body(distance, radius, bonus_scale, r, g, b)
        obj.spawn_body()
        if not is_sun:
            obj.animate_body()

create_ui('myPlanetarySystem')

1 Ответ

0 голосов
/ 08 марта 2019

Ответ: по-видимому, импортирует мои maya.cmds в более короткой версии: maya конфликтует с программой, я должен был это увидеть. Другими словами, больше нет проблем, если я просто импортирую maya.cmds в качестве cmds.

...