if distance == None or d1
if best != None:
enot.append(best)
best = b
distance = d1
else:
enot.append(b)
e2 = enot
faces.append((a,best))
Наконец, мы преобразуем наш список граней, состоящий из кортежей двух рёбер, в список кортежей из четырех индексов:
return [(a[0],b[0],b[1],a[1]) for a,b in faces]
Есть много больше в этом скрипте, и мы вновь будем рассматривать
Ослепите вашего босса - гистограммы в стиле Блендер
Чтобы доказать, что Блендер адаптируется ко многим задачам помимо интерактивного создания 3D-графики, мы покажем Вам, как импортировать внешние данные (электронная таблица в формате CSV) и автоматизировать задачу создания и рендеринга представленной в 3D гистограммы.
Идея в том, чтобы запустить Блендер с аргументами, указывающими ему запустить скрипт, который читает
blender -P /full/path/to/barchart.py
Также возможно вместо этого запустить скрипт из текстового буфера внутри
blender barchart.blend -P barchart.py
В противоположность тому, что описано в документации API, в Питоне мы можем просто получить доступ к аргументам командной строки следующим образом:
import sys
print sys.argv
Последний фрагмент выведет все аргументы, включая имя программы Блендера первым. Наш скрипт должен пропускать любые аргументы, предназначенные для самого Блендера при использовании этого списка. Любые аргументы, предполагаемые только для нашего скрипта, которые не должны быть интерпретированы самим Блендером, должны находится после аргумента конца-опций (end-of-options), двойного минуса (--).
Наконец, мы не хотим, чтобы Блендер появлялся и показывал графический интерфейс пользователя. Вместо этого, мы укажем ему работать в фоне и выйти по завершении. Это делается посредством прохождения опции -b. Задав всё это вместе, командная строка будет выглядеть похожей на это:
blender -b barchart.blend -P barchart.py –- data.csv
Если Блендер работает в фоновом режиме, Вы должны определить
Здесь мы покажем важные части кода кусками (полный файл доступен как barchart.blend, который включает barchart.py как вложенный текст). Мы начинаем с создания нового объекта Мира и установки цветов его зенита и горизонта целиком в нейтральный белый (выделенная часть следующего кода):
if __name__ == '__main__':
w=World.New('BarWorld')
w.setHor([1,1,1])
w.setZen([1,1,1])
Затем, мы извлекаем последний аргумент, переданный в Блендер и проверяем является ли расширение файла тем же самым
csv = sys.argv[-1]
if csv.endswith('.csv'):
Если у него правильное расширение, мы создаём новую Сцену с именем BarScene и присваиваем её атрибут world к нашему вновь созданному миру (Это было вдохновлено более сложным сценарием
sc=Scene.New('BarScene')
sc.world=w
sc.makeCurrent()