« C4D Python R12 テスト:シーンに変更を加える前にStopAllThreads()を呼び出す必要がある… | トップページ | C4D Python R12 テスト:子オブジェクトの名前を親の名前+連番にする。 »

C4D Python R12 テスト:文字列を少々…

まずは、テキストスプラインとPythonタグを使ってみた。

Python_string_01

テキストスプラインの「テキスト」をPythonで操作してみようと思ったり…

Python_string_03

テキストスプラインのテキストのプリセットは「CINEMA 4D」…

Pythonタグのスクリプトなので、グローバル変数:op は、Pythonタグ自身になります。

テキスト用のユーザデータをPythonタグに設定しました。

「改行を含む文字」に設定してみました。

Python_string_02

Pythonタグのユーザデータに適当な文字を入力してみた。

Python_string_04

Pythonタグに適当なスクリプトを入力してみた。

Python
import c4d
#Welcome to the world of Python


def main():
    strings = op[c4d.ID_USERDATA,1]
    obj = op.GetObject()
    obj[c4d.PRIM_TEXT_TEXT] = strings

Pythonタグのユーザデータの文字をテキストスプラインのテキストに入力するスクリプトで…

Python_string_05

問題ないようだ。

文字数を取得するにはどうするんだっけ?

len()関数を使うのね。

Python
import c4d
#Welcome to the world of Python


def main():
    strings = op[c4d.ID_USERDATA,1]
    obj = op.GetObject()
    obj[c4d.PRIM_TEXT_TEXT] = strings

    print len(strings)
41

改行コードも含めて41文字ね…

len()関数は日本語に対応していないの…?
まあ気にせず進みます。

文字の抽出は、リストと同じく…

Python_string_06_2

文字列[インデックス]

これで1文字を抽出できるのね…

文字列の右側からもマイナス値を使って指定ができるのだ。

Python_string_10_2

じゃあ、アニメーションのフレームをインデックスとして、文字列から1文字づつ抽出してテキストスプラインのテキストに適用してみる。

Python
import c4d
#Welcome to the world of Python


def main():
    strings = op[c4d.ID_USERDATA,1]
    obj = op.GetObject()

    frame = doc.GetTime().GetFrame(doc.GetFps())
    string_count = len(strings)

    index = frame % string_count

    obj[c4d.PRIM_TEXT_TEXT] = strings[index]

Python_string_07_2

フレームをそのままインデックスに使うと文字数以上になるとエラーが起こるから、フレームを文字数で割った余を使ってみたのだ。
こんな具合のアニメーションは、あまり作らないよね…

じゃあ、範囲を指定した取り出しの文字列のスライスをやってみる。

スライスは…

文字列[開始インデックス:終了インデックス]

これで、文字列から文字列を取り出すことができるのね…
でも、抽出とスライスのインデックスはチョッと違うようだね…
文字と文字の境目のようだね。

Python_string_09_2

1文字抽出同様に、範囲指定も右側から指定ができる。

Python_string_11

タイピングしている様に1文字づつ出してみよう。
開始位置は0で、終了位置だけ変化させてみた。

Python
import c4d
#Welcome to the world of Python


def main():
    strings = op[c4d.ID_USERDATA,1]
    obj = op.GetObject()

    frame = doc.GetTime().GetFrame(doc.GetFps())
    string_count = len(strings)

    index = frame % string_count

    obj[c4d.PRIM_TEXT_TEXT] = strings[0:index]

Python_string_08

まぁモーションタイポグラフィやるなら、MoGraph使った方が効率が良いんだろうけど…

文字が現れるスピードを数式で調整するのは面倒なので…
スライダを使って表示率として調整してみる。
Pythonタグに設定してみる。

Python_string_14

Python_string_15

Pythonタグのスクリプトも変更…

Python
import c4d
#Welcome to the world of Python


def main():
    strings = op[c4d.ID_USERDATA,1]
    obj = op.GetObject()

    frame = doc.GetTime().GetFrame(doc.GetFps())
    string_count = len(strings)

    index = int(string_count * op[c4d.ID_USERDATA,2])

    obj[c4d.PRIM_TEXT_TEXT] = strings[0:index]

これで、スライダを動かすとスプラインテキストの「テキスト」が変更されます。

Python_string_16

後は、表示率にキーフレームを設定してスペースや改行部分で一旦停止させたり、途中からスピードを変える事も可能だよね。

Python_string_17

Python_string_19

ま、こんな具合のアニメーションを作る事は、あまり無いとは思うけど…
今回は文字列のテストなので、赦してください…

次は単純なテスト
スクリプトマネージャとコンソールで試してみた。

大文字に変換するupper()メソッド

Python
import c4d


def main():
    strings = '3-Dimensional Computer Graphics\nCINEMA 4D'
    print strings.upper()


if __name__=='__main__':
    main()
3-DIMENSIONAL COMPUTER GRAPHICS
CINEMA 4D

小文字に変換するlower()メソッド

Python
import c4d


def main():
    strings = '3-Dimensional Computer Graphics\nCINEMA 4D'
    print strings.lower()


if __name__=='__main__':
    main()
3-dimensional computer graphics
cinema 4d

小文字と大文字を反転するswapcase()メソッド

Python
import c4d


def main():
    strings = '3-Dimensional Computer Graphics\nCINEMA 4D'
    print strings.swapcase()


if __name__=='__main__':
    main()
3-dIMENSIONAL cOMPUTER gRAPHICS
cinema 4d

文字の検索するfind()メソッド

Python
import c4d


def main():
    strings = '3-Dimensional Computer Graphics\nCINEMA 4D'
    print strings.find('e')


if __name__=='__main__':
    main()
5

Python_string_12

右から文字を検索するrfind()メソッド

Python
import c4d


def main():
    strings = '3-Dimensional Computer Graphics\nCINEMA 4D'
    print strings.rfind('e')


if __name__=='__main__':
    main()
20

Python_string_13

文字を置換するreplace()メソッド

Python
import c4d


def main():
    strings = '3-Dimensional Computer Graphics\nCINEMA 4D'
    print strings.replace('CINEMA 4D', 'c4d')


if __name__=='__main__':
    main()
3-Dimensional Computer Graphics
c4d

文字列の開始位置か調べるstartswith()メソッド

Python
import c4d


def main():
    strings = '3-Dimensional Computer Graphics\nCINEMA 4D'
    print 'starts?'
    print "'3-D' :", strings.startswith('3-D')
    print "'Comp' :", strings.startswith('Comp')
    print "'4D' :", strings.startswith('4D')


if __name__=='__main__':
    main()
starts?
'3-D' : True
'Comp' : False
'4D' : False

文字列の終了位置か調べるendswith()メソッド

Python
import c4d


def main():
    strings = '3-Dimensional Computer Graphics\nCINEMA 4D'
    print 'ends?'
    print "'3-D' :", strings.endswith('3-D')
    print "'Comp' :", strings.endswith('Comp')
    print "'4D' :", strings.endswith('4D')


if __name__=='__main__':
    main()
ends?
'3-D' : False
'Comp' : False
'4D' : True

文字列中の任意の文字列で区切ってリストに変換するsplit()メソッド

Python
import c4d


def main():
    strings = '3-Dimensional Computer Graphics\nCINEMA 4D'
    print strings.split(' ') #スペースで区切ってリストにする


if __name__=='__main__':
    main()

['3-Dimensional', 'Computer', 'Graphics\nCINEMA', '4D']

リストを文字列で連結して1つの文字列にするjoin()メソッド

Python
import c4d


def main():
    strings = '-*-'
    lists = ['3-Dimensional', 'Computer', 'Graphics', 'CINEMA 4D']
    print strings.join(lists)


if __name__=='__main__':
    main()

3-Dimensional-*-Computer-*-Graphics-*-CINEMA 4D

文字列を数値に変換するint()/float()/long()関数

Python
import c4d


def main():
    strings_1 = '100'
    strings_2 = '200'

    print 'strings_1  ', "'" + strings_1 + "'"
    print 'strings_2  ', "'" + strings_2 + "'"
    print 'strings_1 + strings_2  ', "'" + strings_1 + strings_2 + "'"
    print 'int(strings_1) + int(strings_2)  ', int(strings_1) + int(strings_2)
    print 'float(strings_1)  ', float(strings_1)
    print 'long(strings_1)  ', long(strings_1)


if __name__=='__main__':
    main()

strings_1   '100'
strings_2   '200'
strings_1 + strings_2   '100200'
int(strings_1) + int(strings_2)   300
float(strings_1)   100.0
long(strings_1)   100

数値を文字に変換するstr()関数

Python
import c4d


def main():
    value_1 = 100
    value_2 = 200.5

    print 'value_1  ', value_1
    print 'value_2  ', value_2
    print 'value_1 + value_2  ', value_1 + value_2
    print 'str(value_1) + str(value_2)  ', str(value_1) + str(value_2)


if __name__=='__main__':
    main()

value_1   100
value_2   200.5
value_1 + value_2   300.5
str(value_1) + str(value_2)   100200.5

文字の種類のチェック

Python
import c4d


def main():
    lists = ['THREE', 'dimensional computer', 'Graphics Software', 'CINEMA 4D', 'R12043', '1234567890', '    ']
    for li in lists:
        print "'%s'" % li
        print "'英字' ", li.isalpha()
        print "'数字' ", li.isdigit()
        print "'英数字' ", li.isalnum()
        print "'スペース' ", li.isspace()
        print "'大文字' ", li.isupper()
        print "'小文字' ", li.islower()
        print "'頭文字' ", li.istitle()
        print
        print


if __name__=='__main__':
    main()
'THREE'     #英字/英数字/大文字
'英字'  True
'数字'  False
'英数字'  True
'スペース'  False
'大文字'  True
'小文字'  False
'頭文字'  False


'dimensional computer'     #小文字  スペースが入ると英字/英数字扱いではなくなる
'英字'  False
'数字'  False
'英数字'  False
'スペース'  False
'大文字'  False
'小文字'  True
'頭文字'  False


'Graphics Software'     #頭文字  スペースが入ると英字/英数字扱いではなくなる
'英字'  False
'数字'  False
'英数字'  False
'スペース'  False
'大文字'  False
'小文字'  False
'頭文字'  True


'CINEMA 4D'     #大文字  スペースが入ると英字/英数字扱いではなくなるが、数字が入っていても大文字扱い
'英字'  False
'数字'  False
'英数字'  False
'スペース'  False
'大文字'  True
'小文字'  False
'頭文字'  False


'R12043'     #英数字/大文字/頭文字  数字が入っていても大文字/頭文字扱い
'英字'  False
'数字'  False
'英数字'  True
'スペース'  False
'大文字'  True
'小文字'  False
'頭文字'  True


'1234567890'     #数字/英数字
'英字'  False
'数字'  True
'英数字'  True
'スペース'  False
'大文字'  False
'小文字'  False
'頭文字'  False


'    '     #スペース
'英字'  False
'数字'  False
'英数字'  False
'スペース'  True
'大文字'  False
'小文字'  False
'頭文字'  False

他にもありますが、今回はここまで…

|

« C4D Python R12 テスト:シーンに変更を加える前にStopAllThreads()を呼び出す必要がある… | トップページ | C4D Python R12 テスト:子オブジェクトの名前を親の名前+連番にする。 »