読者です 読者をやめる 読者になる 読者になる

non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

OSXのBlenderでctypesを試した

パソコン・インターネット
おはようございます。先週末は、ギリギリでインフルエンザが完治して家族でファミリーコンサートに出演しました。自分はアコーディオン、長男はカスタネットを演奏しました。
 

背景

2015年になってようやく、Blenderの中のPythonで3DCGを作ることが少しずつ出来てきた。

Pythonではctypesで各プラットフォームネイティブなライブラリを比較的簡単に呼び出せることを以前から知っており、この応用で、blenderにmrubyが組み込めるんじゃなかろうか?ということを実践する第一段階が今回の記事。

シンプルなCのコードをBlenderから呼び出せるか

まずは、Blenderからctypesが使えるかを確認する。

Cソース

sapm.c

#include <stdio.h>
#include <assert.h>

int spam_hello(char *name)
{
    assert(name != NULL);
    return printf("hello %s\n", name);
}

ビルド

gcc -shared -fPIC sapm.c -o sapm.dylib

Pythonコード

sapm.py

from ctypes import *

class SpamError(Exception):
    pass

class Spam:
    c_spam_module = CDLL('./sapm.dylib')
    c_spam_hello_func_type = CFUNCTYPE(c_int, c_char_p)
    c_spam_hello_func = cast(c_spam_module.spam_hello, c_spam_hello_func_type)

    @classmethod
    def hello(cls, name):
        if name == None or not isinstance(name, str):
            raise SpamError('invalid argument')
        ret = cls.c_spam_hello_func(create_string_buffer(name.encode('ascii')))
        print ('c_spam_hello_func returned:', ret)

if __name__ == '__main__':
    Spam.hello('there')

動かす

 /Applications/blender.app/Contents/MacOS/blender --background --python sapm.py 

まとめ

BlenderはPython3なので、python,ctypesでwebを検索して出てくるコードだとPython2向けのものがまだまだ多いようで、printに括弧を付ける他にも、Python3での文字列周りの変更の影響でこれに対応したコードにする必要がある。

今回の記事書く際にもこれにハマった。

Link

関連記事