Zeit & Farbe

Nun soll über eine verbesserte Farb-Funktion die Zeit korrekt zur Anzeige gebracht werden, die das neue Modul clock.py nutzt.

Aufgaben/Handlungsanweisungen

  • Wie zuvor erstellen wir eine Kopie von der letzten Version,

  • ändern die Inhalte

  • stellen die Steuerung um,

  • und testen die neue(n) Funktion(n).

 1     - material+color based on a timpstamp
 2     - names for all clock elements
 3     - smaller sizes for the minute elements
 4     - define the space between clock elements
 5     - create all parts of a clock
 6
 7    """
 8    rows = len(parts)
 9    distances = [9.5, 3.75, 3.75, 1.6, 3.75]
10
11    for row in range(rows):
12        cols = len(parts[row])
13        for col in range(cols):
14            distance = distances[row]
15            x = row * 3
16            y = col * distance + distance
17            obj = bpy.ops.mesh.primitive_cube_add(location=(x, y, 0))
18
19            if row == 3:
20                bpy.ops.transform.resize(value=(0.5, 0.5, 0.5))
21
22            obj = bpy.context.object
23            obj.name = parts[row][col]
24    setMaterials()
25
26def setMaterials():
27    """ Read timespamp and set colors for the clock"""
28    
29    import clock

Eine Farbe ist immer auch eine Eigenschaft eines Materials, deshalb definieren wir ein Material. Der Aufruf erfolgt in Zeile 26…

 1
 2    colors = {
 3        "off": (1, .9, .1),
 4        "on": (.8, 0, 0),
 5        "sec_even": (0, .3, .1),
 6        "sec_odd": (.3, .1, 0),
 7        "quarter": (0, 1, 1)
 8    }
 9    
10    ts = clock.get_time()
11    scn = bpy.context.scene
12    for name in ts.keys():
13        mat = bpy.data.materials.get(name)
14        if mat is None:
15            # create material
16            mat = bpy.data.materials.new(name=name)
17        obj = scn.objects[name]
18        mat.specular_intensity = 200
19        if ts[name]:
20            mat.diffuse_color = colors['on']
21        else:
22            mat.diffuse_color = colors['off']
23
24        # Assign it to object
25        if obj.data.materials:
26            # assign to 1st material slot
27            ob.data.materials[0] = mat
28        else:
29            # no slots
30            obj.data.materials.append(mat)
31
32        if name == 'seconds':
33            if ts[name]:
34                mat.diffuse_color = colors['sec_even']
35            else:
36                mat.diffuse_color = colors['sec_odd']
37
38        if name in ['minute_03', 'minute_06', 'minute_09']:
39            if ts[name]:
40                mat.diffuse_color = colors['quarter']
41                obj.data.materials[0] = mat
42
43def setColor_bge():
44    colors = {
45        "off": (1, .9, .1, 1),
46        "on": (.8, 0, 0, 1),

Die neue Funktion der Materialvergabe ist nun etwas komplexer.

Erläuterungen im Detail

Zeilen 16

 1
 2    colors = {
 3        "off": (1, .9, .1),
 4        "on": (.8, 0, 0),
 5        "sec_even": (0, .3, .1),
 6        "sec_odd": (.3, .1, 0),
 7        "quarter": (0, 1, 1)
 8    }
 9    
10    ts = clock.get_time()
11    scn = bpy.context.scene
12    for name in ts.keys():
13        mat = bpy.data.materials.get(name)
14        if mat is None:
15            # create material
16            mat = bpy.data.materials.new(name=name)
17        obj = scn.objects[name]
18        mat.specular_intensity = 200
19        if ts[name]:
20            mat.diffuse_color = colors['on']
21        else:
22            mat.diffuse_color = colors['off']
23
24        # Assign it to object
25        if obj.data.materials:
26            # assign to 1st material slot
27            ob.data.materials[0] = mat
28        else:
29            # no slots
30            obj.data.materials.append(mat)
31
32        if name == 'seconds':
33            if ts[name]:
34                mat.diffuse_color = colors['sec_even']
35            else:
36                mat.diffuse_color = colors['sec_odd']
37
38        if name in ['minute_03', 'minute_06', 'minute_09']:
39            if ts[name]:
40                mat.diffuse_color = colors['quarter']
41                obj.data.materials[0] = mat
42
43def setColor_bge():
44    colors = {
45        "off": (1, .9, .1, 1),
46        "on": (.8, 0, 0, 1),

Diesmal verwenden wir den Zeitstempel und entscheiden, in Abhängigkeit von den Wahrheitswerten, welche Farbe für das Material gesetzt werden soll.

../../../_images/berlin-clock-donuts.png