miki969696

revit api previewcontrol wpf预览窗口

族库管理插件 不直接打开文件,预览族文件的指定view,

进一步可以使用using 进行资源释放操作,这里没有写出来

image

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();
        }
    }
}

 

 

posted on 2025-10-30 15:34  盛书伟  阅读(5)  评论(0)    收藏  举报

导航