Revit二次开发-新建图纸并批量放置视图

164 阅读4分钟

效果

四个视图均以图纸中心放置

还未做完,仅实现了部分功能

用到的一些主要方法

获取当前文档的所有视图

public List<Element> AllViewsInDoc(Document doc)
{
    FilteredElementCollector collector = new FilteredElementCollector(doc);
    IList<Element> allViews = collector.OfClass(typeof(View)).ToList();
    return allviews
}

获取所有视图类型

public List<String> ViewTypes()
{
    List<String> viewTypes = new List<String>();
    foreach(ElementId id in viewIds)
    {
        Element e = doc.GetElement(id);
        View v = e as View;
        if (v == null) continue;
        String viewType = v.ViewType.ToString();
        if (viewTypes.Contains(viewType))
        {
            continue;
        }
        viewTypes.Add(viewType);
    }

    return viewTypes;
}

WPF下拉框选项改变后的进程

private void XXX_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // 如果用了CellTemplate,可以定位下拉框的位置
    int rowindex = -1;
    int columnindex = -1;
    var cells = sheetgrid.SelectedCells;
    if (cells.Any())
    {
        rowindex = sheetgrid.Items.IndexOf(cells.First().Item);
        columnindex = cells.First().Column.DisplayIndex;

    }
    
    // 获取下拉框的内容
    string selectedtype = (sender as ComboBox).SelectedItem.ToString();

}

C# 一些string的方法

string test = " a-b "
string[] a = test.Split('-');// 用符号分割字符串 result: { a,b }
string  = temp[0].Trim();// 清除string的空格 result: {a,b}

一些Revit元素的构建方法(均需要新建进程)

//创建图纸
public ViewSheet CreateViewSheet(Document doc)
{
    FilteredElementCollector collector = new FilteredElementCollector(doc);
    collector.OfCategory(BuiltInCategory.OST_TitleBlocks).OfClass(typeof(FamilySymbol));
    FamilySymbol fs = collector.FirstElement() as FamilySymbol;
    if(fs == null)
    {
        return null;
    }
    
    ViewSheet viewSheet = ViewSheet.Create(doc, fs.Id);
    return viewsheet;
}

// 将视图放入图纸
public Viewport PutViewInSheet(Document doc,ViewSheet viewsheet,View view,XYZ point)
{
    Viewport port = Viewport.Create(doc, viewSheet.Id, view.Id, point)
    
}

源代码

主入口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;
using System.Windows;
using MyTools.CreateSheet;

namespace MyTools.NewSheet
{
    /*
     *  新建图纸
     *
     *
     */
    [Transaction(TransactionMode.Manual)]
    internal class CreateSheet : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            // 获取revit的所有视图,将已经放入图纸的视图去除
            ViewManager viewManager = new ViewManager(doc);
            var viewTypes = viewManager.ViewTypes();
            StringBuilder sb = new StringBuilder();
            foreach ( var viewType in viewTypes )
            {
                List<View> viewList = viewManager.ViewByType(viewType);

                if ( viewList == null )
                {
                    return Result.Cancelled;
                }

                sb.Append(viewType);
                sb.Append(':');
                sb.Append('\n');



                foreach ( var view in viewList)
                {
                    sb.Append( view.Name.ToString()+" , ");
                }
                sb.Append('\n');
            }

            CreateSheetWindow createSheetWindow = new CreateSheetWindow(uidoc,viewManager);
            createSheetWindow.ShowDialog();

            return Result.Succeeded;
        }
    }
}

Model类-视图管理器

using Autodesk.Revit.DB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyTools.CreateSheet
{
    public class ViewManager
    {
        private Document doc;
        private List<ElementId> viewIds;                 //所有视图的ID
        private string typeSel;

        public ViewManager(Document doc)
        {

            this.doc = doc;
            FilteredElementCollector collector = new FilteredElementCollector(doc);
            IList<Element> allViews = collector.OfClass(typeof(View)).ToList();
            viewIds = new List<ElementId>();


            // 获取所有视图
            foreach (Element elem in allViews)
            {
                View view = elem as View;
                if (view == null) continue;
                ViewFamilyType viewType = doc.GetElement(view.GetTypeId()) as ViewFamilyType;
                if (viewType == null) continue;
                string vt = view.ViewType.ToString();

                //if (!(vt.Equals("FloorPlan") || vt.Equals("CeilingPlan") || vt.Equals("Elevation")))
                //{
                //    continue;
                //}
                var pa = view.get_Parameter(BuiltInParameter.VIEWPORT_SHEET_NAME);
                string s = pa.AsValueString();


                if (s != null)
                {
                    continue;
                }
                viewIds.Add(elem.Id);

            }
        }



        // 获取所有视图类型
        public List<String> ViewTypes()
        {
            List<String> viewTypes = new List<String>();
            foreach(ElementId id in viewIds)
            {
                Element e = doc.GetElement(id);
                View v = e as View;
                if (v == null) continue;
                String viewType = v.ViewType.ToString();
                if (viewTypes.Contains(viewType))
                {
                    continue;
                }
                viewTypes.Add(viewType);
            }

            return viewTypes;
        }


        // 所有未放入图纸的视图id
        public List<ElementId> IDs()
        {
            return viewIds;
        }

        // 所有未放入图纸的视图
        public List<View> AllViews()
        {
            List<View> views = new List<View>();
            foreach (ElementId id in viewIds)
            {
                View v = doc.GetElement(id) as View;
                views.Add(v);
            }
            return views;
        }

        // 被选中的视图类型
        public String TypeSelected
        {
            get
            {
                return typeSel;
            }
            set
            {
                this.typeSel = value;
            }
        }

        

        // 根据视图类型获取视图
        public List<View> ViewByType(string viewType)
        {  
            List<View> viewList = new List<View>();
            foreach (ElementId id in viewIds)
            {
                Element e = doc.GetElement(id);
                View v = e as View;
                if (v == null) continue;
                if (v.ViewType.ToString().Equals(viewType))
                {
                    viewList.Add(v);
                }
            }



            return viewList;
        }
    }

    
}

ModelView类-用于展示页面的视图信息

using Autodesk.Revit.DB;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyTools.CreateSheet
{
    public class ViewInfo:INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        private List<String> _vietypes;
        private List<String> _viewnames;
        private string typeselected;
        private string nameselected;
        public ViewInfo(int id ,ViewManager viewManager) {
            
            ID = id;
            ViewTypes = viewManager.ViewTypes();
            
        }

        public string TypeSelected
        {
            get
            {
                return typeselected; 
            }
            set
            {
                typeselected = value;
                OnPropertyChanged("TypeSelected");
            }

        }

        public string NameSelected
        {
            get
            {
                return nameselected;
            }
            set
            {
                nameselected = value;
                OnPropertyChanged("NameSelected");
            }

        }



        public int ID { get; set; }
        public List<String> ViewTypes
        {
            get
            {
                return _vietypes;
            }
            set {
                _vietypes = value; 
                OnPropertyChanged("ViewTypes"); 
            }
        }
        public List<String> ViewNames
        { 
            get { return _viewnames; }
            set {
                _viewnames = value;
                OnPropertyChanged("ViewNames"); 
            }
        }



    }
}

XAML类

<Window x:Class="MyTools.CreateSheet.CreateSheetWindow"
             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:MyTools.CreateSheet"
             mc:Ignorable="d"
                Width="800" Height="400"
        ResizeMode="NoResize" Title="创建图纸">
    <Grid>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="150"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            
            <StackPanel Grid.Column="0" Orientation="Vertical">
                <TextBlock>图纸名称</TextBlock>
                <TextBox x:Name="sheetname"></TextBox>
                <StackPanel Orientation="Horizontal">
                    <TextBlock>图纸编号</TextBlock>
                    <TextBox x:Name="sheetid" Width="100"></TextBox>
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <TextBlock>图纸幅宽</TextBlock>
                    <ComboBox SelectedIndex="1" Width="100">
                        <ComboBoxItem>A2</ComboBoxItem>
                        <ComboBoxItem>A3</ComboBoxItem>
                    </ComboBox>
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <TextBlock>布局方式</TextBlock>
                    <ComboBox x:Name="laybox" SelectedIndex="-1" Width="100" SelectionChanged="laybox_SelectionChanged">
                        <ComboBoxItem>1-竖视口</ComboBoxItem>
                        <ComboBoxItem>1-横视口</ComboBoxItem>
                        <ComboBoxItem>2-横视口</ComboBoxItem>
                        <ComboBoxItem>2-竖视口</ComboBoxItem>
                        <ComboBoxItem>3-横视口</ComboBoxItem>
                        <ComboBoxItem>4-横视口</ComboBoxItem>
                    </ComboBox>
                </StackPanel>
            </StackPanel>

            <StackPanel Grid.Column="1" Orientation="Vertical">
                <StackPanel Height="310">
                    <DataGrid AutoGenerateColumns="False" CanUserAddRows="False" Name="sheetgrid">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="编号" Binding="{Binding ID}" Width="100"/>
                            <DataGridTemplateColumn Header="视图类别" Width="150">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <ComboBox  x:Name="combobox1" ItemsSource="{Binding ViewTypes}" SelectionChanged="combobox1_SelectionChanged"/>
                                    </DataTemplate>

                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTemplateColumn Header="视图名称" Width="*">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <ComboBox x:Name="combobox2" ItemsSource="{Binding ViewNames}" SelectionChanged="combobox2_SelectionChanged"/>
                                    </DataTemplate>

                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                        </DataGrid.Columns>
                    </DataGrid>
                </StackPanel>
                

                <StackPanel Orientation="Horizontal">
                    <TextBlock>已布置在围纸的视围不会列出</TextBlock>
                    <Button Margin="200 0 0 0" Click="Button_Click_2">布局信息</Button>
                    <Button Margin="20 0 0 0" Click="Button_Click_1">查看视图信息</Button>
                    <Button Margin="20 0 0 0" Click="Button_Click">创建图纸</Button>
                   
                </StackPanel>
            </StackPanel>

            
        </Grid>
    </Grid>
</Window>

XAML.CS类

using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
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;
using ComboBox = System.Windows.Controls.ComboBox;
using Line = Autodesk.Revit.DB.Line;

namespace MyTools.CreateSheet
{
    /// <summary>
    /// CreateSheetWindow.xaml 的交互逻辑
    /// </summary>
    public partial class CreateSheetWindow : Window
    {
        private ViewManager viewManager;
        List<ViewInfo> viewInfos;
        private Document doc;
        private UIDocument uidoc;
        public CreateSheetWindow(UIDocument uidocument,ViewManager viewManager)
        {
            
            InitializeComponent();
            this.viewManager = viewManager;
            uidoc = uidocument;
            doc = uidocument.Document;


        }

        // 视图类型改变后
        private void combobox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            int rowindex = -1;
            int columnindex = -1;
            var cells = sheetgrid.SelectedCells;
            if (cells.Any())
            {
                rowindex = sheetgrid.Items.IndexOf(cells.First().Item);
                columnindex = cells.First().Column.DisplayIndex;

            }

            string selectedtype = (sender as ComboBox).SelectedItem.ToString();

            List<View> views = viewManager.ViewByType(selectedtype);
            List<string> viewnames = new List<string>();
            foreach (var view in views)
            {
                if (view != null)
                {
                    viewnames.Add(view.Name);
                }
            }
            viewInfos[rowindex].ViewNames = viewnames;
            viewInfos[rowindex].TypeSelected = selectedtype;
        }

        private void laybox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ComboBox combobox = sender as ComboBox;
            if (combobox == null) {
                return;
            }
            string s = combobox.SelectedValue.ToString();
            string r = s.Split(':')[1];
            string r1 = r.Split('-')[0];
            int a = int.Parse(r1);
            viewInfos = new List<ViewInfo>();
            for (int i = 0; i < a; i++)
            {
                viewInfos.Add(new ViewInfo(i+1, viewManager));
            }

            sheetgrid.ItemsSource = viewInfos; 
        }


        // 按钮-创建图纸
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            string sheetName = sheetname.Text.ToString();
            string sheetID = sheetid.Text.ToString();
            string laymethod = laybox.SelectedValue.ToString().Split(':')[1];
            

            if (string.IsNullOrEmpty(sheetName) || string.IsNullOrEmpty(sheetID) || string.IsNullOrEmpty(laymethod))
            {
                return;
            }

            string[] temp = laymethod.Split('-');
            string drawnum = temp[0].Trim();
            string draworienation = temp[1].Trim();
            
            if (drawnum=="4")
            {
                MessageBox.Show(drawnum);
                MessageBox.Show(draworienation);
            }

            FilteredElementCollector collector = new FilteredElementCollector(doc);
            collector.OfCategory(BuiltInCategory.OST_TitleBlocks).OfClass(typeof(FamilySymbol));
            FamilySymbol fs = collector.FirstElement() as FamilySymbol;
            foreach (Element ele in collector)
            {
                FamilySymbol familys = ele as FamilySymbol;
                if (familys.Name.Equals("A3"))
                {
                    fs = familys;
                }
            }
            


            //创建图纸
            ViewSheet viewSheet = null;
            if (fs == null)
            {
                return;
            }
            using (Transaction trans = new Transaction(doc))
            {
                trans.Start("Create a new Viewsheet");
                try
                {
                    viewSheet = ViewSheet.Create(doc, fs.Id);

                    if (null == viewSheet)
                    {
                        throw new Exception("failed to create new ViewSheet.");
                    }


                    

                    trans.Commit();
                    uidoc.ActiveView = viewSheet;


                }
                catch (Exception)
                {
                    trans.RollBack();
                }
            }

            // 放置视图
            using (Transaction trans = new Transaction(doc))
            {
                trans.Start("create viewPort");
                try
                {
                    MessageBox.Show("resr");
                    //当布局方式为 1-横视口 时
                   

                    //当布局方式为 1-竖视口 时
                    

                    //当布局方式为 2-横视口 时

                    //当布局方式为 2-竖视口 时

                    //当布局方式为 3-横视口 时

                    //当布局方式为 4-横视口 时
                    if (drawnum.Equals("4"))
                    {

                        MessageBox.Show(drawnum);
                        MessageBox.Show(draworienation);

                        List<View> viewlist = new List<View>();
                        BoundingBoxUV boundingbox = viewSheet.Outline;
                        UV max = boundingbox.Max;
                        UV min = boundingbox.Min;

                        XYZ lb = new XYZ(min.U,min.V,0);
                        XYZ lt = new XYZ(min.U, max.V, 0);
                        XYZ rt = new XYZ(max.U, max.V, 0);
                        XYZ rb = new XYZ(max.U, min.V, 0);

                        XYZ p1 = (Line.CreateBound(lt, rb)).Evaluate(0.25,true);
                        XYZ p2 = (Line.CreateBound(lb, rt)).Evaluate(0.75, true);
                        XYZ p3 = (Line.CreateBound(lb, rt)).Evaluate(0.25, true);
                        XYZ p4 = (Line.CreateBound(lt, rb)).Evaluate(0.75, true);

                        foreach (ViewInfo viewInfo in viewInfos)
                        {
                            List<View> allviews = viewManager.AllViews();

                            foreach (ViewInfo viewinfo in viewInfos)
                            {
                                foreach (View view in allviews)
                                {
                                    if (viewinfo.TypeSelected == view.ViewType.ToString() && viewinfo.NameSelected == view.Name)
                                    {
                                        viewlist.Add(view);
                                    }
                                }
                            }

                        }
                        List<XYZ> pointlist = new List<XYZ>();
                        pointlist.Add(p1); pointlist.Add(p2); pointlist.Add(p3); pointlist.Add(p4);
                        int n = 0;
                        foreach (View view in viewlist)
                        {
                            if (Viewport.CanAddViewToSheet(doc, viewSheet.Id, view.Id))
                            {
                                Viewport port = Viewport.Create(doc, viewSheet.Id, view.Id, pointlist[n]);
                                n++;
                                Message.Show(port.Id.ToString());
                            }
                        }
                    }

                    trans.Commit();


                }
              
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    trans.RollBack();
                }
            }



            this.Close();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            List<View> allviews = viewManager.AllViews();
            List<View> viewlist = new List<View>();
            foreach (ViewInfo viewInfo in viewInfos)
            {
                foreach (View view in allviews)
                {
                    if (viewInfo.TypeSelected == view.ViewType.ToString() && viewInfo.NameSelected == view.Name)
                    {
                        viewlist.Add(view);
                    }
                }



            }

            StringBuilder sb = new StringBuilder();
            foreach (View view in viewlist)
            {
                sb.Append(view.Title+"\n");
            }
            MessageBox.Show(sb.ToString());
        }

        private void combobox2_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            int rowindex = -1;
            int columnindex = -1;
            var cells = sheetgrid.SelectedCells;
            if (cells.Any())
            {
                rowindex = sheetgrid.Items.IndexOf(cells.First().Item);
                columnindex = cells.First().Column.DisplayIndex;

            }
            ComboBox combobox = sender as ComboBox;
            if (combobox.SelectedIndex == -1|| combobox == null)
            {
                return;
            }

            

            string selectedname = combobox.SelectedItem.ToString();

            
            viewInfos[rowindex].NameSelected = selectedname;
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            if (laybox.SelectedItem!=null)
            {

                string s = laybox.SelectedValue.ToString().Split(':')[1];
                s = s.Trim();
                if (s.CompareTo("4-横视口") == 0)
                {
                    MessageBox.Show(s);
                }
                
            }
        }
    }
}