revit api previewcontrol wpf预览窗口
族库管理插件 不直接打开文件,预览族文件的指定view,
进一步可以使用using 进行资源释放操作,这里没有写出来

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Windows.Media.Media3D;
namespace FamilyViewReader
{
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class ReadFamily3DViewsCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
Autodesk.Revit.ApplicationServices.Application uiApp = commandData.Application.Application;
Autodesk.Revit.UI.UIApplication uiapp = commandData.Application;
Autodesk.Revit.UI.UIDocument uidoc = uiapp.ActiveUIDocument;
Autodesk.Revit.DB.Document doc1 = uidoc.Document;
// 使用文件对话框选择族文件
string familyPath = SelectFamilyFile();
if (string.IsNullOrEmpty(familyPath))
{
return Result.Cancelled;
}
try
{
// 打开族文件
Document familyDoc = uiApp.OpenDocumentFile(familyPath);
if (familyDoc == null)
{
TaskDialog.Show("错误", "无法打开族文件。");
return Result.Failed;
}
// 获取所有3D视图<>
List<View3D> threeDViews = new FilteredElementCollector(familyDoc)
.OfClass(typeof(View3D))
.Cast<View3D>()
.Where(v => !v.IsTemplate)
.ToList();
View3D view1= threeDViews[0];
// 检查当前视图是否为3D视图
if (view1.ViewType != ViewType.ThreeD)
{
TaskDialog.Show("错误", "当前视图不是3D视图,无法创建预览控件。");
return Result.Failed;
}
// 创建预览控件
var previewControl = new PreviewControl(familyDoc, view1.Id);
// 创建 WPF 窗口(纯 C#)
var window = new PreviewControlWindow();
window.BuildUI(); // 构建 UI
window.PreviewGrid.Children.Clear(); // 清空占位内容(如果有)
window.PreviewGrid.Children.Add(previewControl); // 添加预览控件
System.Windows.Interop.WindowInteropHelper helper = new System.Windows.Interop.WindowInteropHelper(window); // 设置窗口为 Revit 主窗口的上层
helper.Owner = Process.GetCurrentProcess().MainWindowHandle;
// 显示窗口(模态)
window.ShowDialog();
// 关闭族文档
familyDoc.Close(false);
return Result.Succeeded;
}
catch (Exception ex)
{
TaskDialog.Show("错误", $"读取族文件时出错:\n{ex.Message}");
return Result.Failed;
}
}
private string SelectFamilyFile()
{
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
openFileDialog.Filter = "Revit族文件 (*.rfa)|*.rfa";
openFileDialog.Title = "选择要读取的族文件";
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
return openFileDialog.FileName;
}
}
return null;
}
}
// WPF 窗口类(纯 C# 实现)
public partial class PreviewControlWindow : Window
{
public System.Windows.Controls.Grid PreviewGrid { get; private set; }
private System.Windows.Controls.Button btn1;
public PreviewControlWindow()
{
Title = "Revit 预览控件示例";
Height = 450;
Width = 800;
WindowStartupLocation = WindowStartupLocation.CenterOwner;
BuildUI(); // 在构造函数中构建 UI
}
public void BuildUI()
{
// 主 Grid
var mainGrid = new System.Windows.Controls.Grid();
this.Content = mainGrid;
// 定义列:左侧固定 100,右侧星号
mainGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(100) });
mainGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
// 左侧按钮 Grid
var leftGrid = new System.Windows.Controls.Grid { Background = System.Windows.Media.Brushes.LightGray };
System.Windows.Controls.Grid.SetColumn(leftGrid, 0);
mainGrid.Children.Add(leftGrid);
// 创建按
btn1 = new System.Windows.Controls. Button
{
Name = "Btn_1",
Content = "按钮",
Width = 80,
Height = 30
};
btn1.Click += Btn_1_Click;
leftGrid.Children.Add(btn1);
// 右侧预览 Grid(初始添加占位 TextBlock)
PreviewGrid = new System.Windows.Controls.Grid { Name = "PreviewGrid" };
System.Windows.Controls.Grid.SetColumn(PreviewGrid, 1);
mainGrid.Children.Add(PreviewGrid);
var placeholder = new TextBlock
{
Text = "这里放预览控件",
FontSize = 20,
VerticalAlignment = VerticalAlignment.Center,
HorizontalAlignment =System.Windows. HorizontalAlignment.Center
};
PreviewGrid.Children.Add(placeholder);
}
private void Btn_1_Click(object sender, RoutedEventArgs e)
{
// 自定义按钮事件,例如关闭窗口
this.Close();
}
}
}
浙公网安备 33010602011771号