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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
     - material+color based on a timpstamp
     - names for all clock elements
     - smaller sizes for the minute elements
     - define the space between clock elements
     - create all parts of a clock

    """
    rows = len(parts)
    distances = [9.5, 3.75, 3.75, 1.6, 3.75]

    for row in range(rows):
        cols = len(parts[row])
        for col in range(cols):
            distance = distances[row]
            x = row * 3
            y = col * distance + distance
            obj = bpy.ops.mesh.primitive_cube_add(location=(x, y, 0))

            if row == 3:
                bpy.ops.transform.resize(value=(0.5, 0.5, 0.5))

            obj = bpy.context.object
            obj.name = parts[row][col]
    setMaterials()

def setMaterials():
    """ Read timespamp and set colors for the clock"""
    
    import clock

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

    colors = {
        "off": (1, .9, .1),
        "on": (.8, 0, 0),
        "sec_even": (0, .3, .1),
        "sec_odd": (.3, .1, 0),
        "quarter": (0, 1, 1)
    }
    
    ts = clock.get_time()
    scn = bpy.context.scene
    for name in ts.keys():
        mat = bpy.data.materials.get(name)
        if mat is None:
            # create material
            mat = bpy.data.materials.new(name=name)
        obj = scn.objects[name]
        mat.specular_intensity = 200
        if ts[name]:
            mat.diffuse_color = colors['on']
        else:
            mat.diffuse_color = colors['off']

        # Assign it to object
        if obj.data.materials:
            # assign to 1st material slot
            ob.data.materials[0] = mat
        else:
            # no slots
            obj.data.materials.append(mat)

        if name == 'seconds':
            if ts[name]:
                mat.diffuse_color = colors['sec_even']
            else:
                mat.diffuse_color = colors['sec_odd']

        if name in ['minute_03', 'minute_06', 'minute_09']:
            if ts[name]:
                mat.diffuse_color = colors['quarter']
                obj.data.materials[0] = mat

def setColor_bge():
    colors = {
        "off": (1, .9, .1, 1),
        "on": (.8, 0, 0, 1),

Die neue Funktion der Materialvergabe ist nun etwas komplexer.

Erläuterungen im Detail

Zeilen 16

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

    colors = {
        "off": (1, .9, .1),
        "on": (.8, 0, 0),
        "sec_even": (0, .3, .1),
        "sec_odd": (.3, .1, 0),
        "quarter": (0, 1, 1)
    }
    
    ts = clock.get_time()
    scn = bpy.context.scene
    for name in ts.keys():
        mat = bpy.data.materials.get(name)
        if mat is None:
            # create material
            mat = bpy.data.materials.new(name=name)
        obj = scn.objects[name]
        mat.specular_intensity = 200
        if ts[name]:
            mat.diffuse_color = colors['on']
        else:
            mat.diffuse_color = colors['off']

        # Assign it to object
        if obj.data.materials:
            # assign to 1st material slot
            ob.data.materials[0] = mat
        else:
            # no slots
            obj.data.materials.append(mat)

        if name == 'seconds':
            if ts[name]:
                mat.diffuse_color = colors['sec_even']
            else:
                mat.diffuse_color = colors['sec_odd']

        if name in ['minute_03', 'minute_06', 'minute_09']:
            if ts[name]:
                mat.diffuse_color = colors['quarter']
                obj.data.materials[0] = mat

def setColor_bge():
    colors = {
        "off": (1, .9, .1, 1),
        "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