Меню в Glowscript - PullRequest
       65

Меню в Glowscript

0 голосов
/ 24 сентября 2019

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

Мы определили различные объекты (солнце и планеты нашей солнечной системы) и силы между ними.Теперь мы хотим определить меню, которое дает нам возможность выбрать объект: тогда он будет определен как текущий объект, и пользователь моделирования сможет изменять его массу с помощью ползунка.Ответ, который мы получили на наш первый вопрос, состоял в том, что текущий объект должен быть определен до использования функции «def M (m)», поэтому мы определили Солнце как текущий объект.Вот фрагменты нашего кода, относящиеся к этой части симуляции:

sun = sphere( pos=vector(0,0,0), radius=6.96E+09, texture="https://i.imgur.com/DTm6i8r.jpg",  

               mass = 1.989e30, momentum=vector(0,0,0), make_trail=True, visible=True )   #example of a defined object

currentobject=sun


def M(m):
    global col, sun, mercury, venus, earth, mars, jupiter, saturn, uranus, neptune, currentobject 
    currentobject.visible = True 
    obj = m.selected 
    if obj == "Sonne": 
        currentobject = sun 
    elif obj == "Merkur":
        currentobject = mercury
    elif obj == "Venus": 
        currentobject = venus
    elif obj == "Erde": 
        currentobject = earth
    elif obj == "Mars": 
        currentobject = mars
    elif obj == "Jupiter": 
        currentobject = jupiter
    elif obj == "Saturn": 
        currentobject = saturn
    elif obj == "Uranus": 
        currentobject = uranus
    elif obj == "Neptun": 
        currentobject = neptune
    currentobject.visible=True

menu(choices=['Sonne', 'Merkur', 'Venus', 'Erde', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptun'], bind=M) 
scene.append_to_caption('\n\n')


scene.append_to_caption("Change mass of chosen object: \n\n") 
def setmass(b): 
    wt.text = '{:1.1f}'.format(b.value)
sl = slider(min=1, max=10, value=1, length=1000, bind=setmass)  
wt = wtext(text='{:1.1f}'.format(sl.value))
scene.append_to_caption('\n\n') 


while (True):  

    rate(100) 

    if running:

        if currentobject = sun:
            sun.mass = (1.989e30)*sl.value
        elif currentobject = mercury:
            mercury.mass = (3.285e23)*sl.value
        elif currentobject = venus:
            venus.mass = (4.869e24)*sl.value
        elif currentobject = earth:
            earth.mass = (5.974e24)*sl.value
        elif currentobject = mars:
            mars.mass = (6.4185e23)*sl.value
        elif currentobject = jupiter:
            jupiter.mass = (1.8987e27)*sl.value
        elif currentobject = saturn:
            saturn.mass = (5.683e26)*sl.value
        elif currentobject = uranus:
            uranus.mass = (8.683e25)*sl.value
        elif currentobject = neptune:
            neptune.mass = (1.0241e26)*sl.value

При запуске программы сообщение об ошибке не появляется.Однако мы обнаружили, что хотя текущий объект изменяется в функции M, он впоследствии не изменяется.(Когда вы вставляете «print (currenttobject.mass) в« def M (m) », масса выбранных объектов появляется в симуляции, но когда вы вставляете ее после функции, появляется масса солнц). Это означает, что в вычислениях всегда используютсясолнце как его текущий объект, а не объект, выбранный в меню.

1 Ответ

0 голосов
/ 30 сентября 2019

Единственный созданный вами трехмерный объект - это "солнце".Когда в M () вы говорите currenttobject = mercury, вы устанавливаете currenttobject равным «undefined», потому что нет трехмерного объекта с именем «mercury».

...