效果
四个视图均以图纸中心放置
还未做完,仅实现了部分功能
用到的一些主要方法
获取当前文档的所有视图
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);
}
}
}
}
}