Można wymusić aktualizację widoku przez wrzucenie do pętli
Code: Select all
Gui.updateGui()
Code: Select all
import math
from PySide2 import QtCore
from pivy import coin
class Animation(object):
def __init__(self): # to się dzieje tylko raz, podczas startu skryptu
self.light = coin.SoDirectionalLight()
self.light.intensity.setValue(1.0) # intensywnosc swiatla 0 do 1.0
self.light.color.setValue(0.8, 0.8 ,1.0) # kolor swiatla 0 do 1.0, czerwony, zielony, niebieski
for obj in FreeCAD.ActiveDocument.Objects: # dodanie węzła światła do każdego widocznego obiektu, wystarczy zrobić to tylko raz (węzeł będzie ponownie wykorzystywany w pętli)
if obj.ViewObject.Visibility:
obj.ViewObject.RootNode.insertChild(self.light, 2)
self.timer = QtCore.QTimer() # zegar (licznik)
QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.my_update) # połączenie sygnału zegara z funkcją my_update
self.timer.start(1000) # zegar wysyła sygnał co 1 sekundę
self.t = 0 # wartość początkowa
def my_update(self):
self.light.direction.setValue(math.sin(self.t), math.cos(self.t), -1.0) # aktualizacja kierunku światła
self.t = self.t + 0.1 # każdy kolejny krok większy o 0,1
print (str(self.t)) # informacyjne wypisanie wartości
if self.t > 2.1: # zatrzymaj licznik po dotarciu do wartości
self.stop()
def stop(self):
self.timer.stop()
animation = Animation()
# aby zatrzymać animację przed jej końcem wpisz:
# animation.stop()
Zauważ też, że dodałem światło tylko raz, a potem je edytuję.