2019年11月13日水曜日

スプレッドシートのデータでオブジェクト配置

先日はUnityとの連携の絡みでCSVで配置データをやりとりする記事を書きました。
グリッド状に配置を検討する時には 表計算ソフトをグリッドとして使うことが多いです。

今回はGoogleスプレッドシート上で配置したデータをクリップボード経由で配置させるスクリプトを作ってみました

スプレッドシートやOpenOffeceCalc等でセルをコピーすると
OSのクリップボードにはセルの内容をTabで区切ったデータが入ります

BlenderのPythonでもクリップボードに入っているテキストデータをできるので
スプレッドシートのセル内容をコピーした状態でスクリプト実行で配置ができます。
import bpy
#配置の間隔
grid = 1.0
#クリップボードの取得
clipboard = bpy.context.window_manager.clipboard
lines = clipboard.split('\n')
scene = bpy.context.scene
 
def set_empty(obj_name, grid):
    new_obj = bpy.data.objects.new(name,None)
    new_obj.empty_display_size = grid/2
    new_obj.empty_display_type = 'CUBE'
    return(new_obj)
#名前でファイル内のオブジェクトを取得
def get_obj(obj_name):
    obj = bpy.data.objects.get(obj_name)
    if obj == None: return(None)
    new_obj = bpy.data.objects.new(obj_name,obj.data)
    return(new_obj)
 
parent = bpy.data.objects.new("Temp",None)
scene.collection.objects.link(parent)
 
for i,l in enumerate(lines):
    #タブで区切ってリストに
    cells = l.split('\t')
    for j,obj_name in enumerate(cells):
        if obj_name != "":
            #new_obj = set_empty(obj_name, grid) #エンプティを配置する場合
            new_obj = get_obj(obj_name)
            if new_obj == None: continue
            #オブジェクトをグリッド位置に
            new_obj.location = (j *grid, -i *grid, 0)
            scene.collection.objects.link(new_obj)
            new_obj.parent = parent
parent.select_set(True)
セルの文字を元に同じファイル内にあるオブジェクトを取得して配置するようにしました
前回のスクリプトのように ファイル内の別シーンに配置するオブジェクトを入れておきます。

スプレッドシートのコピーでクリップボードに入るのはセル内容のみなので
指定のセルには 配置する物の名前を入れておく必要があります

配置の検討はセルの背景色で指定することが多いので
スプレッドシートでセルの背景色に合わせてセルの内容を入力するスプレッドシートGoogle Apps Scripを置いておきます。
選択した範囲のA列の背景色を元に 同じ色のセルにA列セルの内容を入力します
function BackgroundToValue() {
  //開いているシートとセルの取得
  var sheet = SpreadsheetApp.getActiveSheet();
  var selection = SpreadsheetApp.getActiveRange();
  var colorDic = {};
  //1行目のセルの値を設定として取得
  for (var i = 1; i<20; i++){
    var paletColor = sheet.getRange(i,1).getBackground();
    var paletValue = sheet.getRange(i,1).getValue();
    colorDic[paletColor] = paletValue;
  }
  
  // 選択範囲の値を取得
  var originalValues = selection.getValues();
  var pivotRow = selection.getRow();
  var pivotColumn = selection.getColumn();
  var height = selection.getHeight();
  var width = selection.getWidth();
  for (var r = 0; r< height; r++){
    for (var c = 0; c<width; c++){
      //セルの背景色の取得
      var backgroundColor = sheet.getRange(pivotRow +r,pivotColumn +c).getBackground();
      if (colorDic[backgroundColor]){
        sheet.getRange(pivotRow +r,pivotColumn +c).setValue(colorDic[backgroundColor]);
      }
    }
  }
}
スプレッドシートのスクリプトの使い方は他のサイトを参照してください

0 件のコメント:

コメントを投稿