照明配置プラグインオブジェクト
昨日の電気部材等のプラグインオブジェクトと同じように照明器具のプラグインオブジェクトをつくってみました。
今までは照明器具の種類ごとにハイブリッドシンボルを作って配置していたのですが、
・プロジェクトごとにシンボルの2D図形を編集して符号を修正するのが手間だった。
・ペンダント照明で、勾配天井に複数設置するときなど、コードの長さを一つ一つ調整していく良い方法がなかった。
の2点から、対応可能なプラグインオブジェクトを作ってみることに。
内容
コードは以下の通り。
import vs
folder=vs.Pfolder
bt=vs.Pbt
sym3d=vs.Psym3d
brk=vs.Pbrk
cl=vs.Pcl
ccl=vs.Pccl
scl=vs.Pscl
cr=vs.Pcr/2
hugou=vs.Phugou
#3d symbol
vs.Symbol(sym3d,(0,0), 0)
objH = vs.LNewObj()
rhh=vs.GetParent(objH)
#code
if cl>0:
vs.BeginXtrd(0, cl)
vs.Arc((cr,cr), (-cr,-cr), 0, 360)
objH = vs.LNewObj()
vs.SetClass( objH, ccl )
vs.EndXtrd()
#2d
vs.Arc((135,135), (-135,-135), 0, 360)
objH = vs.LNewObj()
vs.SetFPat(objH, 1)
vs.SetClass( objH, scl )
vs.SetFillBack(objH, 0)
if brk==True:
vs.HMove(objH, 0, -135)
vs.Arc((135,0), (-135,-270), 0, 360)
objH = vs.LNewObj()
vs.SetFPat(objH, 1)
vs.SetClass( objH, scl )
vs.SetFillBack(objH, (0,0,0))
vs.Rect(-150,-50,150,-300)
objH2 = vs.LNewObj()
vs.ClipSurface(objH, objH2)
vs.DelObject(objH2)
vs.MoveTo(0,0 )
vs.TextSize(10.5)
vs.CreateText(hugou)
objH = vs.LNewObj()
vs.SetTextVerticalAlign(objH, 3)
vs.SetTextJust(objH, 2)
vs.SetFPat(objH, 0)
if brk==True:
vs.HMove(objH, 0, -135)
#pop-up
def DialogHandler(item , data):
if item==1:#OK
(outSelectedIndex, outSelectedChoiceText) = vs.GetSelectedChoiceInfo(dialogID, 3, 0)
(BOOLEAN, objName,objHd,recHd,wallHd)=vs.GetCustomObjectInfo()
vs.SetRField(objHd,vs.GetName(recHd),'sym3d',outSelectedChoiceText)
vs.SetRField(objHd,vs.GetName(recHd),'bt', 'このまま')
vs.Move3DObj(rhh, 0, 0, 0)
if item==2:#CANCEL
pass
if item==12255:#setup
#vs.GetItemText( dialogID, 3, theStr )
symid =vs.FInFolder(vs.GetObject(folder))
aa=0
while vs.GetTypeN(symid) ==16:
symname=vs.GetName(symid)
symid=vs.NextSymDef(symid)
vs.AddChoice(dialogID, 3, symname, 0)
aa+=1
if bt=='選択する':
dialogID = vs.CreateLayout( 'シンボルを選択', False, 'OK', 'キャンセル' )
vs.CreatePullDownMenu(dialogID, 3,30)
vs.SetFirstLayoutItem( dialogID, 3 )
result=vs.RunLayoutDialog( dialogID, DialogHandler )
昨日のものと考え方は同じなので細かい説明は省きますが、今回は2Dはシンボル登録するのではなく直接描画させています。(円と符号を書いているだけですが。)
壁付きのブラケットのときのみ、記号と位置を少し調整しています。
マリオネットオブジェクトか、プラグインオブジェクトか
慣れてしまえばおそらくマリオネットオブジェクトよりもプラグインオブジェクトの方が作成するスピードも、コードの読みやすさもだいぶ上がってくると思うのですが、そうなるとマリオネットオブジェクトの存在理由、というか利点はなんなんだろう、と考えてしまいました。
考えてみると、マリオネットオブジェクトでは、Vectorworksのバージョン等があっていれば、環境をほとんど選ばずにファイルがあればどこでも再現できそうです。
それに対して、スクリプト記述によるプラグインオブジェクトにすれば、そのPCにスクリプトを組み込んでおく必要があり、他者や他のPCとの共有がめんどくさくなりそうです。
また、後で直したいところがありスクリプトを書き換えた場合、古いファイルのプラグインオブジェクトが正常に作動しない可能性があります。それを回避するには、スクリプトをバージョン管理して古いものも残しておくか、スクリプト自体を古いバージョンに対応できるようにしながらいじるか、のどちらかが必要な気がします。
いやいや、どちらも一長一短ありますね。プラグインオブジェクトのスクリプト自体はそんなにデータ量はないでしょうから、スクリプトをファイルごとに保存できればいいのですが・・・
と考えながら書いていたら、良さそうなことを思いつきました。
マリオネットオブジェクトとプラグインオブジェクトのいいどこどりをしようとしたら、マリオネットオブジェクトの入力ポートと出力ポート等の構造だけは理解して、一つのオリジナルノードに、プラグインオブジェクトで書くようなスクリプトをそのまま(つらつらと)書くというのは良くないでしょうか?
上のコードで言うと、最初のパラメータの受け取り部分だけ、マリオネットで行う(もしくはスクリプトに直接書いていしまう)ような感じでしょうか。そういうオリジナルノードを組み合わせるということも可能性が広がりそうです。オブジェクトを複製するたびにスクリプトも無駄に複製される、というのもあるかもしれませんが、全てをマリオネットで書くよりは軽くなりそうな気がします。
代表的な入力用ノードと、それを受け取るオリジナルノードの雛形をどこかに作っておけば手間も省けそうです。
うーん、試したいことが無限に湧いてきますね・・・これがうまくいくかどうか、早速試してみたいところですが、きりがないので今日はここまでで我慢します。
この記事が気に入ったらサポートをしてみませんか?