在revit插件开发过程中,有时候需要在自己的页面上展示某些元素的模型,关于WF上如何实现在RevitSDK中已经存在着代码,对于初学者来说,要搬运到WPF并不太容易,于是本篇文章模仿了PreviewModel的实现讲解如何在WPF上显示revit的三维视图。
不知道PreviewModel的可以先看一下PreviewModel的解读http://blog.csdn.net/adijeshen/article/details/77099581
我的实现差不多就是把SDK中的PreviewModel稍微删掉一点
那么来看代码,
首先,看一下PreviewPage的xaml
previewControlGrid就是之后用于存放PreviewControl的地方。
定义一些要用到的变量
using RApplication = Autodesk.Revit.ApplicationServices.Application;
using RView = Autodesk.Revit.DB.View;
private ElementId _currentDBViewId = null;
private Document _dbDocument = null;
private RApplication _application = null;
private UIApplication _uiApplication = null;
private ElementId elementId;
private PreviewControl pc = null;
那么PreviewControl就是最主要的部分了。
仿照PreviewModel中的代码,先是构造函数:
public PreViewPage(RApplication application, ElementId viewId, string dir)
{
InitializeComponent();
_application = application;
_uiApplication = new UIApplication(application);
_dbDocument = _application.OpenDocumentFile(dir);
updateViewsList(elementId);
}
可以看到与PreviewModel中的代码不同之处在于我没有updateDocumentsList函数,这是根据功能决定的。
那么看一下updateViewsList:
private void updateViewsList(ElementId viewId)
{
// fill the combobox with printable views
FilteredElementCollector collecotr = new FilteredElementCollector(_dbDocument);
collecotr.OfClass(typeof(Autodesk.Revit.DB.View));
IEnumerable secs = from Element f in collecotr where (f as Autodesk.Revit.DB.View).CanBePrinted == true select f as Autodesk.Revit.DB.View;
_cbViews.Items.Clear();
DBViewItem activeItem = null;
bool isEmpty = true;
foreach (Autodesk.Revit.DB.View dbView in secs)
{
elementId = dbView.Id;
isEmpty = false;
activeItem = new DBViewItem(dbView, _dbDocument);
_cbViews.Items.Add(activeItem);
}
if(isEmpty == true)
{
RView view = View3D.CreateIsometric(_dbDocument, elementId);
activeItem = new DBViewItem(view, _dbDocument);
_cbViews.Items.Add(activeItem);
}
_cbViews.SelectedItem = activeItem;
}
其实就是讲打开的文档中的视图加入了名为_cdViews的ComboBox控件。
最后一个语句改变了SelectedItem,触发indexchange
private void cbViews_SelIdxChanged(object sender, SelectionChangedEventArgs e)
{
System.Windows.Controls.ComboBox cb = sender as System.Windows.Controls.ComboBox;
if (cb == null)
return;
DBViewItem dbItem = cb.SelectedItem as DBViewItem;
if (dbItem == null)
return;
if (previewControlGrid.Children != null)
{
previewControlGrid.Children.Clear();
}
if (pc != null)
{
pc.Dispose();
}
pc = new PreviewControl(_dbDocument, dbItem.Id);
previewControlGrid.Children.Add(pc);
_currentDBViewId = dbItem.Id;
}
值得注意的地方是pc!=null的if语句判断,因为revitAPI只允许存在一个previewControl,所以在切换视图的时候务必要将上一个进行析构。
项目源代码已上传 http://download.csdn.net/download/adijeshen/9939701
以上。