verkehrsampel_4onX.py
verkehrsampel_4onX.py — text/python-source, 4 KB (4784 bytes)
Dateiinhalt
# -*- coding: cp1252 -*-
# Modellierung einer 3D-Verkehrsampel
# SH, 2009-10-19
from visual import * # Import 3D-Modul
from time import * # Import des Zeitmoduls
from threading import * # Import des Nebenlaeufigkeitsmoduls
#zentrale Definitionen
LAMPEAUS = (0.2,0.2,0.2) # dunkelgrau
GEHAEUSE = (0.2,0.3,0.25) # dunkelgruen
SUED = ( 1, 0, 0)
NORD = (-1, 0, 0)
WEST = ( 0, 0, 1)
OST = ( 0, 0,-1)
STRASSE = (0.1,0.1,0.1) # fast schwarz
FELD = (0.4, 0.5, 0.2) # naturgruen
HIMMEL = (0.5,0.6,0.8) # himmelblau
class Lampe(sphere):
"""Licht fuer Ampel"""
def __init__(self, farbe=(1,0,0), pos=(1,1,1), frame=None,zustand=False):
"Konstruktor f�r Ampellicht"
sphere.__init__(self) # Konstruktoraufruf Oberklasse
self.farbe = farbe
self.pos = pos
self.frame = frame
self.zustand = zustand
self.material = materials.emissive
if zustand:
self.color = farbe
else:
self.color = LAMPEAUS
def an(self):
"schaltet Lampe an"
self.color = self.farbe
def aus(self):
"schaltet Lampe aus"
self.color = LAMPEAUS
def schalten(self):
"schaltet Lampe"
if self.zustand:
self.color = LAMPEAUS
self.zustand = False
else:
self.color = self.farbe
self.zustand = True
def blinken(self, anzahl=10):
"blinkt im Sekundentakt"
anzahl = anzahl * 2
while anzahl:
self.schalten()
sleep(1)
anzahl = anzahl-1
print anzahl,
class Ampel(Thread): # Oberklasse Thread ermoeglicht Nebenlaeufigkeit
"""Ampel mit 3 Lampen, Gehaeuse und Stange"""
def __init__(self, pos=(0,0,0), blickRicht=(1,0,0)):
"Konstruktor 3D-Verkehrsampel"
Thread.__init__(self) # Aufruf des Konstruktor von Thread
self.f = frame(pos=pos, axis=blickRicht) # 'Rahmen'-Objekt fasst alle Teilobjekte zusammen
self.rot = Lampe(frame=self.f, farbe=(1,0,0), pos=(0,7,1))
self.gelb = Lampe(frame=self.f, farbe=(1,1,0), pos=(0,5,1))
self.gruen= Lampe(frame=self.f, farbe=(0,1,0), pos=(0,3,1))
self.kasten=box(frame=self.f, pos=(0,5,0), height=7, width=3, length=3, color=GEHAEUSE, opacity=0.9)
self.stange=cylinder(frame=self.f, color=GEHAEUSE, pos=(0,-10,0), radius=0.7, axis=(0,12,0))
def posNeu(self, x,y,z):
"Ampelposition neu setzen"
self.f.pos = (x,y,z)
def blickNeu(self, blickRicht):
"Ampelausrichtung neu setzen"
self.f.axis = blickRicht
def stoerung(self,blinkZahl=10):
"Gelblichtblinken bei Stoerung"
self.rot.aus()
self.gruen.aus()
self.gelb.blinken(blinkZahl)
def schalten(self):
"Durchlauf Ampelzyklus: gelb->ge+ro->ro->ro+ge->gr"
# gelb
self.rot.aus()
self.gelb.an()
self.gruen.aus()
sleep(1) # Wartezeit in Sekunden
# rot
self.rot.an()
self.gelb.aus()
sleep(7)
# rot + gelb
self.gelb.an()
sleep(2)
# gruen
self.rot.aus()
self.gelb.aus()
self.gruen.an()
sleep(6)
def run(self):
"Anschalten der Ampel fuer Dauerbetrieb"
while 1: # fuer immer...
self.schalten()
if __name__ == "__main__":
# Himmel und Hintergrundbeleuchtung
scene.background = HIMMEL
scene.ambient = color.gray(0.9)
#scene.stereo = "redcyan"
# Skalierung auf Ampel
scene.autoscale = 1
a1 = Ampel(pos=(10, 0,10), blickRicht=SUED)
a2 = Ampel(pos=(10,0,-10), blickRicht=OST)
a3 = Ampel(pos=(-10,0,-10), blickRicht=NORD)
a4 = Ampel(pos=(-10,0,10), blickRicht=WEST)
# Untergrundgestaltung ohne Autoskalierung, kein Zoomen mehr
scene.autoscale = 0
strara_ns = box(pos=(0,-10.1,0), size=(1000,1,10.5), color=(1,1,1))
stra_ns = box(pos=(0,-10,0), size=(1000,1,10), color=STRASSE)
strara_ow = box(pos=(0,-10.1,0), size=(10.5,1,1000), color=(1,1,1))
stra_ow = box(pos=(0,-10,0), size=(10,1,1000), color=STRASSE)
wiese = box(pos=(0,-15,0), size=(1000,10,1000), color=FELD)
scene.userzoom = 0
a1.start()
a3.start()
sleep(8)
a2.start()
a4.start()
""""""