以降のスニペットは、特記がない限り rollout 定義の中に置く 前提です(on ... do は rollout の中でしか書けません)。
listbox(単一選択リスト)
rollout roList "listbox" width:220( listbox lbx "ジオメトリ:" items:#() height:10 button btnRefresh "更新" across:2 button btnSelect "選択" local nodes = #() -- 表示名とノードを同じ並びで持つ(items は文字列しか入らないため) fn refresh = ( nodes = geometry as array lbx.items = for o in nodes collect o.name ) on roList open do refresh() on btnRefresh pressed do refresh() on lbx selected i do format "選択: %\n" lbx.items[i] -- クリックで発火(i はインデックス) on lbx doubleClicked i do select nodes[i] -- ダブルクリック on btnSelect pressed do if lbx.selection > 0 do select nodes[lbx.selection] -- 0 = 未選択)createDialog roList
rollout roMulti "multilistbox" width:220( multilistbox mlb "ジオメトリ:" items:#() height:10 button btnAll "全選択" across:3 button btnNone "解除" button btnSelect "選択" local nodes = #() fn refresh = ( nodes = geometry as array mlb.items = for o in nodes collect o.name ) on roMulti open do refresh() on btnAll pressed do if mlb.items.count > 0 do mlb.selection = #{1..mlb.items.count} on btnNone pressed do mlb.selection = #{} on btnSelect pressed do select (for i in mlb.selection collect nodes[i]) on mlb selectionEnd do format "選択数: %\n" mlb.selection.numberSet -- 選択操作が終わったとき)createDialog roMulti
プロパティ / イベント
意味
.selection
選択中のインデックスの BitArray(#{1, 3} のように番号の集合を表す)
.selection = #{}
全解除
.selection = #{1..n}
1〜n を選択
on mlb selected i do
クリックした 1 項目 のインデックス
on mlb selectionEnd do
マウスを離して選択が確定したとき
on mlb doubleClicked i do
ダブルクリック
for i in mlb.selection collect ... で選択中のインデックスを順に回せます。件数は .numberSet です。
-- rollout 定義の中に置くcheckbox chk "ランダム配置" checked:truecheckbutton ckb "ON / OFF" checked:false width:80 -- 押し込み式のボタンradiobuttons rdo "軸:" labels:#("X", "Y", "Z") default:3 columns:3on chk changed state do format "checkbox: %\n" state -- true / falseon ckb changed state do ckb.caption = if state then "ON" else "OFF"on rdo changed state do format "radio: %\n" state -- 選んだ番号(1 始まり)chk.checked = falserdo.state = 1 -- 0 にするとどれも選ばれていない状態
button / pickbutton(ボタンとシーンからのピック)
-- rollout 定義の中に置くbutton btnRun "実行" width:100 height:28 tooltip:"選択したオブジェクトに適用"on btnRun pressed do format "run\n"on btnRun rightClick do format "右クリック\n"-- pickbutton: 押すとビューポートでノードを 1 つ選ばせるfn geomOnly o = superClassOf o == GeometryClass -- filter: 用。true を返したものだけ拾えるpickbutton pkb "ターゲットを選ぶ" filter:geomOnly autoDisplay:true message:"対象をクリック"on pkb picked obj do if obj != undefined do format "picked: %\n" obj.name -- キャンセルで undefined が来ることがあるpkb.object -- 最後にピックしたノード(未ピックなら undefined)
⚠️ timer は rollout を閉じても止まらないことがあります。on ro close do tmr.active = false で止めておきます。
group / subrollout / dotNetControl(レイアウトと拡張)
rollout roChild "子ロールアウト" width:220( spinner spnChild "子の値:" range:[0, 10, 1])rollout roLayout "レイアウト" width:260( group "対象" -- 枠で囲む(見た目だけ)。中にイベントハンドラも書ける ( radiobuttons rdo "" labels:#("選択", "全部") default:1 columns:2 checkbox chkHidden "非表示も含める" ) button btnA "A" across:3 width:70 -- across: で横並び button btnB "B" width:70 button btnC "C" width:70 subrollout sub "サブロールアウト" height:120 width:240 -- 別の rollout を埋め込む枠 on roLayout open do addSubRollout sub roChild -- 子は先に定義しておく)createDialog roLayout
-- .NET のコントロールをそのまま置く(ListView の例)rollout roDn "dotNetControl" width:260( dotNetControl lv "System.Windows.Forms.ListView" width:240 height:120 -- dotNetControl 変数名 ".NET のクラス名" on roDn open do ( lv.View = (dotNetClass "System.Windows.Forms.View").Details -- dotNetClass は列挙型などの静的な値を取るための関数 lv.Columns.Add "名前" 200 for o in geometry do lv.Items.Add o.name ) on lv DoubleClick sender args do -- イベントは on 変数名 イベント名 sender args do if lv.SelectedItems.Count > 0 do format "%\n" lv.SelectedItems.Item[0].Text)createDialog roDn
コメント