【Blender】をPythonで試してみた4

はじめに

こんにちは、がんがんです。
【Blender】をPythonで試してみた3にてcsvファイルに出力してみました。
そのときの出力が微妙だったので、配列周りを少しいじってみました。そのときの備忘録です。

問題点

まずは前回出力したcsvファイルについてみてみます。
f:id:gangannikki:20190115041006j:plain

X,Y,Zのそれぞれの座標が出力されています。
このままでもいい気はしますが、この座標を別のところで用いるためにはX,Y,Zが別々に分かれている必要があります。

ですので、以下のように分割していきます(以下は最終的な結果)。
f:id:gangannikki:20190115041341j:plain

参考記事

qiita.com

改善点

改善したところは

・1次元配列を多次元配列に
・csvのファイル出力を多次元配列に対応

コード

コードは以下の通りです。

変更点

import csv

def output_csv():
	verts = [ bpy.context.object.matrix_world * v.co \
	  for v in bpy.context.object.data.vertices ]

	csvLines = [[str(v) for v in co] for co in verts]

	with open("mesh.csv", mode="w") as f:
		writer = csv.writer(f, lineterminator="\n")
		writer.writerows( csvLines )

全体

import bpy
from pathlib import Path
import csv

def delete_all():
	for item in bpy.context.scene.objects:
		bpy.context.scene.objects.unlink(item)

	for item in bpy.data.objects:
		bpy.data.objects.remove(item)

	for item in bpy.data.meshes:
		bpy.data.meshes.remove(item)

	for item in bpy.data.materials:
		bpy.data.materials.remove(item)

def add_cone():
	bpy.ops.mesh.primitive_cone_add()
	output_csv()

def output_csv():
	verts = [ bpy.context.object.matrix_world * v.co \
	  for v in bpy.context.object.data.vertices ]

	csvLines = [[str(v) for v in co] for co in verts]

	with open("mesh.csv", mode="w") as f:
		writer = csv.writer(f, lineterminator="\n")
		writer.writerows( csvLines )

if __name__ == '__main__':
	delete_all()
	add_cone()

まとめ

今回は前回出力したcsvファイルについていじりました。
別にまとめる必要はないかなと思いましたが、自分のためにも分けて書きました。
pandasを使えたら楽ですが、pandasはBlenderに初期搭載ではないので今回は断念しました。

今後はBlenderでnumpy使ったり、pipでpandasを入れたりしていきたいです。