Web-учебник по курсу "Визуальная аналитика"

Иллюстративный материал к практическому заданию "анализ экономических данных" на примере варианта №3

Для работы с Python в Blender существует Python консоль для ввода команд. Данная консоль может быть вызвана с помощью комбинации shift+F4.

В данной консоли можно вводить команды в интерактивном и последовательном режиме. После ввода комманды, результат выполнения будет выведен сразу после окончания ввода команды.

Примечание: Перед выполнением задания, необходимо знать точный и полный путь до файла с данными.

Пример программы

# Считываем бибилиотеки относящиеся к маетматическим функциям и процедурам
import math
# Очищаем пространственную сцену от объектов
for mesh in bpy.data.meshes:
    bpy.data.meshes.remove(mesh)

# Очищаем пространственную сцену от камер
for cam in bpy.data.cameras:
    bpy.data.cameras.remove(cam)

# Sourcing
data_file_path = "data/data.txt" # Путь до файла с данными
data_array = []
with open(data_file_path) as data_file: # Считываем данные из файла
    next(data_file) # Пропускаем строку с описанием
    for line in data_file:
        data_array.append([float(number) for number in line.split()])

# Filtering
# Находим минимум и саксимум финансового показателя
fin_data_limits = {
    "max": max(data_array, key=lambda item: item[0])[0],
    "min": min(data_array, key=lambda item: item[0])[0],
}
# Уменьшаем год на 2000, чтобы приблизить к центру координат
filtered_data_array = [[item[0], item[1] - 2000, item[2]] for item in data_array]

# Mapping
# Задаем разделение на 3 уровня цветов
divisor = (fin_data_limits["max"] - fin_data_limits["min"]) / 3
box_materials = {
    "low": bpy.data.materials.new(name="LowBoxMaterial"),
    "mid": bpy.data.materials.new(name="MidBoxMaterial"),
    "high": bpy.data.materials.new(name="HighBoxMaterial"),
}
box_materials["low"].diffuse_color = [0, 1, 0, 1]
box_materials["mid"].diffuse_color = [1, 0.7, 0, 1]
box_materials["high"].diffuse_color = [1, 0, 0, 1]


for point in filtered_data_array:
    # Создаем параллелепипед
    bpy.ops.mesh.primitive_cube_add(size=1, 
        location=(point[1]*2, point[2]*2, point[0]/2), scale=(1,1,point[0]))
    box = bpy.context.object
    # Задаем цвет
    box.data.materials.append(
        box_materials[
            "low"
            if point[0] <= fin_data_limits["min"] + divisor
            else "high"
            if point[0] >= fin_data_limits["max"] - divisor
            else "mid"
        ]
    )

# Rendering
camera_location = [-26, -6, 20]
camera_target = [16, 16, 6]
# Задаем ветор для камеры
camera_view_vector = [camera_target[i] - camera_location[i] for i in range(3)]
# Создаем камеру
camera = bpy.data.objects.new("Camera", bpy.data.cameras.new("Camera"))
# Помещаем и поварачиваем камеру
camera.location = camera_location
camera.rotation_euler = Vector(camera_view_vector).to_track_quat('-Z', 'Y').to_euler()
# Помещаем камеру на сцену и выбираем её в качестве активной камеры
bpy.context.scene.collection.objects.link(camera)
bpy.context.scene.camera = camera
for area in bpy.context.screen.areas:
    if area.type == "VIEW_3D":
        area.spaces.active.region_3d.view_perspective = "CAMERA"
        break

Программа вводится и выполняется по частям.

Часть 1 Sourcing

Вводим текст отвечающий за Sourcing. Большая часть команд в Python не возвращает результатов, видимых в консоли.

Если ввести переменную содержащую данные в консоли, то можно увидеть следующее:

>>> data_array
[[9.959292, 2002.0, 1.0], [9.791727, 2002.0, 2.0],
[9.875637, 2002.0, 3.0], [10.09261, 2002.0, 4.0], ...

Что означает что данные были успешно считаны из файла

Часть 2 Filtering

Чтобы убедится что Filtering прошел успешно, можно ввести обе новые структуры в консоль и посмотреть на результат:

>>> filtered_data_array
[[9.959292, 2.0, 1.0], [9.791727, 2.0, 2.0],
[9.875637, 2.0, 3.0], [10.09261, 2.0, 4.0],...
>>> fin_data_limits
{'max': 18.41592, 'min': 7.491813}

Часть 3 Mapping

Запускаем часть отвечаю за Mapping. После создания каждого параллелепипеда, Blender выведет следующее сообщение в консоль: {'FINISHED'}

В пространственной сцене Blender можно увидеть созданные параллелепипеды

Часть 4 Rendering

Запускаем часть отвечаю за Rendering. После задания и активации камеры, мы видим проекционное графическое изображение, полученное с помощью созданной нами камеры.

Часть 5 Backloop

Постольку поскольку камера не захватывает граф целиком, можно увеличить угол обзора камеры с помощью команды camera.data.lens = 35.

Мы рекомендуем ознакомится с основами Python на официальном сайте, а так же с основами использования Blender библиотек.


Наверх