Revit二次开发winform简单的标准模板以及wpf简单的标准模板

共同精进Revit及编程开发技能兴趣群:660319009
《Revit二次开发官方教程》里的代码适合练手以及功能测试,但是在实际开发中,这种代码肯定不符合开发公司的标准。
这里可以使用这个简单的标准模板,这个标准模板的主要参考revit的SDK的Samples案例以及我自己在公司开发的实践来写的。逻辑很简单,主程序类实例化窗口,一个类用来存储临时数据,然后就是主窗口。

首先来看看winform:
1、主程序类

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB.Structure;

namespace RevitTest
{
    /// <summary>
    /// Implements the Revit add-in interface IExternalCommand
    /// </summary>
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
    public class Command : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            try
            {
                //prepare data
                TempData tempData = new TempData(commandData);

                // show UI
                using (ElementIdForm displayForm = new ElementIdForm(tempData))
                {
                    DialogResult result = displayForm.ShowDialog();
                    if (DialogResult.OK != result)
                    {
                        return Autodesk.Revit.UI.Result.Cancelled;
                    }
                }

                return Autodesk.Revit.UI.Result.Succeeded;
            }
            catch (Exception e)
            {
                message = e.Message;
                return Autodesk.Revit.UI.Result.Failed;
            }
        }
    }
}

2、临时数据

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit;
using Autodesk.Revit.UI.Selection;

namespace RevitTest
{
    public class TempData
    {
        private UIDocument m_revitDoc;
        private Document m_Doc;
        private ElementId m_elemId;
        public ElementId ElemId
        {
            get
            {
                return m_elemId;
            }

            set
            {
                m_elemId = value;
            }
        }

        public TempData(ExternalCommandData commandData)
        {
            m_revitDoc = commandData.Application.ActiveUIDocument;
            m_Doc = commandData.Application.ActiveUIDocument.Document;
            Reference reference = m_revitDoc.Selection.PickObject(ObjectType.Element);
            m_elemId = m_Doc.GetElement(reference).Id;
        }
    }
}

3、最后是主窗口

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RevitTest
{
    public partial class ElementIdForm : Form
    {
        private TempData m_tempData;
        public ElementIdForm(TempData tempData)
        {
            InitializeComponent();
            m_tempData= tempData;
            textBox1.Text = m_tempData.ElemId.ToString();
        }
    }
}

最后实现的功能:点选一个元素,直接显示元素的ID;
这里写图片描述

然后,换成wpf窗口的简单模板:
主程序代码:

using System;
using System.Collections.Generic;
using System.Text;

using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB.Structure;

namespace WpfTest
{
    /// <summary>
    /// Implements the Revit add-in interface IExternalCommand
    /// </summary>
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
    public class Command : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            try
            {
                //prepare data
                TempData tempData = new TempData(commandData);

                // show UI
               ElementIdWindow EIwindow = new ElementIdWindow(tempData);
                if(EIwindow.ShowDialog()==true)
                {
                    //DoSomething
                }                
            }
            catch (Exception e)
            {
                message = e.Message;
                return Autodesk.Revit.UI.Result.Failed;
            }
            return Autodesk.Revit.UI.Result.Succeeded;
        }
    }
}

临时数据

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit;
using Autodesk.Revit.UI.Selection;

namespace WpfTest
{
    public class TempData
    {
        private UIDocument m_revitDoc;
        private Document m_Doc;
        private string m_elemId;
        public string ElemId
        {
            get
            {
                return m_elemId;
            }

            set
            {
                m_elemId = value;
            }
        }

        public TempData(ExternalCommandData commandData)
        {
            m_revitDoc = commandData.Application.ActiveUIDocument;
            m_Doc = commandData.Application.ActiveUIDocument.Document;
            Reference reference = m_revitDoc.Selection.PickObject(ObjectType.Element);
            m_elemId = m_Doc.GetElement(reference).Id.ToString();
        }
    }

}

主窗口代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfTest
{
    /// <summary>
    /// ElementIdWindow.xaml 的交互逻辑
    /// </summary>
    public partial class ElementIdWindow : Window
    {
        public ElementIdWindow(TempData tempData)
        {
            InitializeComponent();
            DataContext = tempData;


        }

        private void btnOK_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = true;
        }
    }
}

xaml代码:

<Window x:Class="WpfTest.ElementIdWindow"
             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:WpfTest"
             mc:Ignorable="d"  Height="150" Width="200"
             d:DesignHeight="300" d:DesignWidth="300">

    <Grid>
        <StackPanel>
            <TextBox Margin="10" Text="{Binding Path=ElemId}"></TextBox>
            <Button Margin="10" Click="btnOK_Click">OK</Button>
        </StackPanel> 
    </Grid>
</Window>

这里写图片描述

其实wpf也挺好用的,特别是绑定数据这个强大的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值