CADとPython学習 12 複数の図形に一括で処理する
複数の図形に一括で処理する場合、一つ一つの図形のリストを作ってfor文で処理を回すという方法もありますが、基本的にはCAD側で用意した関数を利用します。
ライノセラスのスクリプトサンプル
ライノセラスで、複数の図形に一括で処理をするスクリプトです。基本的にはGetObjectsを使うのかな、と思います。複数のカーブを選択して、それぞれのidをリストに加えてmessageを呼び出すというものです。
import rhinoscriptsyntax as rs
objectIds = rs.GetObjects("Pick some curves", rs.filter.curve)
for id in objectIds:
print 'Object identifier:', id
Vectorworksのスクリプトサンプル
同じことをVectorworksで行います。VectorworksではForEachObjectという関数を使います。こちらの関数、callback関数というのを利用しますので、関数の処理と対照図形を別で書いていきます。
def callbackUuid(hand):
uuid = vs.GetObjectUuid(hand)
uuidList.append(uuid)
uuidList = [] #空のリストを作る
word = "(VSEL=TRUE)" #対象条件の文字列 表示と選択がTrue
vs.ForEachObject(callbackUuid, word) #callbackUuidListを対照図形で実行
vs.AlrtDialog(str(uuidList))
callback関数でuuidListというものに加えていく処理を行なっています。"(VSEL=TRUE)" というのが「表示と選択がTrueの場合」という意味合いになり、この対称図形に対してcallback関数を行なって、最後にまとめてuuidListを文字で表す、となっています。
vs.ForEachObject()で細かな条件設定
ForEachObjectで細かな条件設定を行います。
word = r"INSYMBOL & INVIEWPORT & ('線の集計'.'matadd'='" + rec + "')"
以前ご紹介している線の集計オブジェクトで、mataddのパラメータが共通のものの場合に、色を一緒にしていく処理です。
条件のところに[rec]という変数(この場合はパラメータ)を文字列として加えて、for文で回すことで、同じパラメータの場合は同じ色にする、という処理を行なっています。
#線の集計図形のmataddというフィールドの値をリスト化する関数
def callbackList(hand):
matHigh = vs.GetRField(hand, '線の集計', 'matadd')
recList.append(matHigh)
#線の色を変更する関数
def callbackColor(hand):
#colorsのリストの一番左の番号を割り当てる
vs.SetPenFore(hand, colors[0])
vs.ResetObject(hand)
#色番号のリストを作る
colors = [3,4,6,7,14,254,18,19,20,39,40,11,28,92,62,70,86,102,118,165,140,172,222,238,4,22]
#空のレコードリスト
recList = []
#線の集計を統計
word = "INSYMBOL & INVIEWPORT & (PON='線の集計')"
#matAddの値のリストを作成して、集合に変更。
vs.ForEachObject(callbackList, word)
recSet = set(recList)
#線の集計の色を変更。for文でレコードの値を変えながらForEachObjectを使う
for rec in recSet:
#レコードの値ごとに選択させる。対称図形の条件をfor文使って変数[rec]を使って変更していく
word = r"INSYMBOL & INVIEWPORT & ('線の集計'.'matadd'='" + rec + "')"
vs.AlrtDialog(word)
#同じレコードの値は同じ色としてまとめる。
vs.ForEachObject(callbackColor, word)
#色番号のリストから先頭を消す
colors.pop(0)