ランダムなテクスチャ設定 / スクリプト

vectorworksでのランダムなテクスチャ設定を行うスクリプトです。かなり簡素に作っているので、条件を満たさないと何も起きないと思います。ご注意ください。

import random

def callbackgettex(hand):
    #uuidリストとテクスチャのリストを作成する関数
    num = vs.GetTextureRefN(hand, 0, 0, True)
    if num != 0:
        tex_list.append(vs.GetTextureRefN(hand, 0, 0, True))
        
    uuid_list.append(vs.GetObjectUuid(hand))
    
def create_shuffle_list(tex_list, target_count):
    tex_set = set(tex_list)
    shuffle_list = list(tex_set)
    while len(shuffle_list) < target_count:
        shuffle_list.append(random.choice(tex_list))
    
    random.shuffle(shuffle_list)
    return shuffle_list,(len(tex_set))

tex_list = []
uuid_list = []

vs.ForEachObject(callbackgettex, "((VSEL=TRUE) & (T<>GROUP))")
target_count = vs.Count("((VSEL=TRUE) & (T<>GROUP))")

if len(tex_list) == 0:
    vs.AlrtDialog('対称図形が0のため、処理を行いません')
else:
    shuffle_list,tex_count = create_shuffle_list(tex_list, target_count)
    boo = vs.YNDialog(f'対称図形は{target_count}です。対象テクスチャは{tex_count}です。処理を継続しますか?')
    if boo:
        while boo:
            for num, uuid in zip(shuffle_list, uuid_list):
                hand = vs.GetObjectByUuid(uuid)
                vs.SetTextureRefN(hand, 0, 0, 0)
                vs.SetTextureRefN(hand, num, 0, 0)
                vs.SetObjectVariableBoolean(hand, 524, False)
                vs.SetObjectVariableBoolean(hand, 524, True)
                vs.ReDraw()
            vs.ReDraw()
            shuffle_list,tex_count = create_shuffle_list(tex_list, target_count)
            boo = vs.YNDialog(f'対象テクスチャは{tex_count}です。この配色を変更しますか?')

選択している図形の設定されているテクスチャを認識して、ランダムにテクスチャを設定します。割合を変えたい時には、設定しているテクスチャの割合を変化させます。

グループは除外していますが、それ以外はラフに作っているので、細かなところで異なる点が生じるかもしれません。(グループの扱いが想定と異なるよう場合があるようです)

あとはテクスチャを面に設定している場合は取得できませんのでご注意ください。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です