1. 程式人生 > >Revit二次開發DockableDialog (可停靠窗體)

Revit二次開發DockableDialog (可停靠窗體)

三個步驟

1、首先可停靠窗體為 Page 窗體,即WPF控制元件需繼承自Page。此外還需繼承 IDockablePaneProvider 介面,然後在WPF控制元件後臺程式碼彙總實現函式SetupDockablePane。

2、在IExternalApplication的OnStartup函式中完成註冊(RegisterDockablePane)可停靠視窗,同時新增一個Revit命令按鈕。

3、在IExternalCommand裡呼叫Page視窗, uiapp.GetDockablePane(dockablepaneid),然後dockablepane.Show()。

注:如果想要實現在Revit裡選擇一個構件,然後在可停靠窗口裡顯示一些資訊,可以用空閒事件來實現。

程式碼如下:

<Page x:Class="DockableDialogsTest.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:DockableDialogsTest"
             Title="" Background="LightGray"
             Height="500" Width="200">
    <Grid>
        <Button Click="Button_Click" Width="50" Height="30">test</Button>    
    </Grid>
</Page>
namespace DockableDialogsTest
{
    /// <summary>
    /// UserControl1.xaml 的互動邏輯
    /// </summary>
    public partial class UserControl1 : Page, IDockablePaneProvider
    {
        public UserControl1()
        {
            InitializeComponent();
        }


        public void SetupDockablePane(DockablePaneProviderData data)
        {
            data.FrameworkElement = this as FrameworkElement;
            DockablePaneProviderData d = new DockablePaneProviderData();

            data.InitialState = new DockablePaneState();
            data.InitialState.DockPosition = DockPosition.Right;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {

        }
    }
}

Make sure you do not reuse an existing GUID if you decide to copy and paste the code above.  

namespace DockableDialogsTest
{
    [Transaction(TransactionMode.Manual)]
    public class Command : IExternalCommand
    {
        public Result Execute(
          ExternalCommandData commandData,
          ref string message,
          ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            Application app = uiapp.Application;
            Document doc = uidoc.Document;

            string PageGuid = "321044f7-b0b2-4b1c-af18-e71a19252be0";
            UserControl1 page = new UserControl1();
            Guid guid = Guid.Empty;
            guid = new Guid(PageGuid);
            DockablePaneId paneId = new DockablePaneId(guid);
            DockablePane pane = uiapp.GetDockablePane(paneId);
            pane.Show();

            return Result.Succeeded;
        }
    }
}
namespace DockableDialogsTest
{
    public class App : IExternalApplication
    {
        static string AddInPath = typeof(App).Assembly.Location;
        public Result OnStartup(UIControlledApplication uiApp)
        {
            
            try
            {
                RibbonPanel ribbonPanel = uiApp.CreateRibbonPanel("test");
                //在新的Ribbon面板上新增pushButton2按鈕
                PushButton pushButton2 = ribbonPanel.AddItem(new PushButtonData("test", "test",
                    AddInPath, "DockableDialogsTest.Command")) as PushButton;

                //給pushButton2按鈕新增圖片
                Uri uriImage2 = new Uri(@"E:\Revit Plug-in\DockableDialogsTest\DockableDialogsTest\Icon\red.png");
                BitmapImage largeImage2 = new BitmapImage(uriImage2);
                pushButton2.LargeImage = largeImage2;

                string PageGuid = "321044f7-b0b2-4b1c-af18-e71a19252be0";
                UserControl1 page = new UserControl1();
                Guid guid = Guid.Empty;
                guid = new Guid(PageGuid);
                DockablePaneId paneId = new DockablePaneId(guid);
                uiApp.RegisterDockablePane(paneId, "屬性", (IDockablePaneProvider)page);
                return Result.Succeeded;
            }
            catch (Exception ex)
            {
                TaskDialog.Show("ERROR", ex.ToString());
                return Result.Failed;
            }
            
        }

        public Result OnShutdown(UIControlledApplication a)
        {
            return Result.Succeeded;
        }
    }
}

原始碼地址

https://download.csdn.net/download/weixin_40626630/10862764

參考文章

http://blog.sina.com.cn/s/blog_e0020e2d0102yb4a.html

https://spiderinnet.typepad.com/blog/2014/10/revit-net-api-create-custom-dockable-pane-dockablepane-pt-1.html

https://www.cnblogs.com/huangkailang/p/5792960.html

https://blog.csdn.net/The_Eyes/article/details/52701173