概要
Revitアドイン開発で使用する可能性がある、DockablePaneについて纏めました。
DockablePaneとは
RevitAPI側が用意している、画面を埋め込めるウィンドウみたいなもの。Revitが用意しているものなので、Revitの上下左右にドッキングされた状態で表示することができる。また、通常のウィンドウのようにフロート状態で表示することも可能。
設定方法
Revit起動時に走る、OnStartup()
の引数UIControlledApplication
を使用して設定できる。
RevitAPIに定義されているIDockablePaneProvider
というインターフェースをもつクラスの作成が必要。
以下は、WPFのウィンドウをセットしているところ。
pulic class Sample : IExternalApplication
{
public Result OnStartup(UIControlledApplication uicapp)
{
var host = new host();
var guid = new Guid("{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}");
var dockablePaneId = new DockablePaneId(guid);
uicapp.RegisterDockablePane(dockablePaneId, "タイトル名", host);
}
}
public class host : IDockablePaneProvider
{
public SampleView Content = new SampleView(); // WPFのviewのクラス
public object DataContext => Content.DataContext;
public void SetupDockablePane(DockablePaneProviderData data)
{
data.FrameworkElement = Content;
data.InitialState.DockPosition = DockPosition.Tabbed; // どの部分にドッキングするか
}
}
DockablePaneが開かれたり、閉じられる際の処理
DockablePaneが開閉時に特定の処理を行いたい場合は、下記のように行う。
public Result OnStartup(UIControlledApplication uicapp)
{
uicapp.DockableFrameVisibilityChanged += new EventHandler<DockableFrameVisibilityChangedEventArgs>(DockablePane_Changed);
}
private void DockablePane_Changed(object obj, DockableFrameVisibilityChangedEventArgs args)
{
if (args.DockableFrameShown)
{
// 開かれるときの処理
}
else
{
// 閉じられるときの処理
}
}
注意点
DockablePaneの開閉状態は、Revit終了時にRevit自体の設定として保存されているようです。
※参考文献があるわけではなく、挙動からの私の推測です。DockablePaneが開いた状態でRevitを終了し、再度起動して物件ファイルを開くと、DockablePaneが開いた状態のままでした。
なので、もし物件ファイルが開かれた後は、必ずDockablePaneは閉じていないといけない場合は、例えばUIControlledApplication
のViewActivated
に、DockablePane
が開いていたら閉じる、という処理を接続しておく形もよさそうかと思いました。
private void ViewActivated(object sender, ViewActivatedEventArgs e)
{
uicapp.GetDockablePane(dockablePaneId).Hide();
}
uicapp
はOnStartup
の引数であるUIControlledApplication
、dockablePaneId
はDockablePaneを追加するときに使用したクラスです。どちらもOnStartup
の処理中にプロパティとして保持しておくと良いかもしれません。