Operowanie światłem w widoku części.

Polish forum

Moderators: PrzemoF, kaktus

Forum rules
Regulamin forum i pomocne informacje

WAŻNE! Przeczytaj zanim poprosisz o pomoc
User avatar
kwahoo
Posts: 680
Joined: Fri Nov 29, 2013 3:09 pm
Contact:

Re: Operowanie światłem w widoku części.

Post by kwahoo »

Generalnie time.sleep(1) mówi "siedź i nic nie rób przez sekundę, absolutnie nic". FreeCAD potrzebuje czasu na zaktualizowanie widoku, ale go nie ma, bo albo ma zakaz pracy (sleep) albo szybko przechodzi resztę pętli. Znajduje czas na aktualizację widoku dopiero po wykonaniu wszystkich przejść.

Można wymusić aktualizację widoku przez wrzucenie do pętli

Code: Select all

Gui.updateGui()
Ale lepiej jest wywoływać pętlę zegarem co 1s:

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()
Pomiędzy wywołaniami zegara FreeCAD może zajmować się swoimi sprawami, jak aktualizacja widoku.

Zauważ też, że dodałem światło tylko raz, a potem je edytuję.
User avatar
matyk
Posts: 107
Joined: Thu Feb 15, 2018 2:37 pm

Re: Operowanie światłem w widoku części.

Post by matyk »

Dziękuję za skrypt.
Dobrze oświetla powierzchnie osobne (na zdjęciu te bliżej nas).
Niestety nie działa na grupy, które często tworzę.
Powierzchnie tworzące grupę nie są oświetlone.
Powierzchnie tworzące grupę nie są oświetlone.
powierzchnie.jpg (38.86 KiB) Viewed 603 times
.
Oświetlenie punktowe z dodatku Render działa na grupy, co można zobaczyć w tym pliku.
lux1.FCStd
Powierzchnie do prób z oświetleniem.
(21.67 KiB) Downloaded 81 times
Post Reply