首页 > 解决方案 > 通过取自 WPF DataGrid 的 ID 选择 Revit 元素

问题描述

在直接跳到问题之前,我将简要描述我要编写的代码。基本上,我正在尝试做一个 Revit 加载项,它打开一个 WPF 对话框,显示活动视图中元素的idcategoryName,当双击包含 的单元格时id,对话框关闭并选择了带有该元素的元素id

双击后出现问题。因为Execute()显示对话框后命令结束,所以我不再能够执行Selection.

命令.cs

[Transaction(TransactionMode.Manual)]
   public class Command : IExternalCommand
   {
      static List<Element> elemList = new List<Element>();

      public Result Execute(
        ExternalCommandData commandData,
        ref string message,
        ElementSet elements)
      {
         UIApplication uiapp = commandData.Application;
         UIDocument uidoc = uiapp.ActiveUIDocument;
         Application app = uiapp.Application;
         Document doc = uidoc.Document;

         //List<Element> elemList = new List<Element>();

         FilteredElementCollector allElementsInView = new FilteredElementCollector(doc, doc.ActiveView.Id);
         IList elementsInView = (IList)allElementsInView.ToElements();

         foreach (Element elem in elementsInView)
         {
            elemList.Add(elem);
         }

         OpenDialog();

         return Result.Succeeded;
      }
      
      public static void SelectElementById(ElementId id)
      {

      }

      public static List<Element> SendElements()
      {
         return elemList;
      }

      public void OpenDialog()
      {
         ElementListDialog dialog = new ElementListDialog();

         dialog.Show();
      }

   }
}

正如您在上面看到的,我还有一个从ElementListDialog.xaml.csSelectElementById(...)调用的方法。下面您将看到用于填充的功能以及获取单元格值并将of 类型传递回Command.cs的方法DataGridMouseButtonDoubleClickidElementId

ElementListDialog.xaml.cs

private List<Element> elemList;
      public ElementListDialog()
      {
         InitializeComponent();
         Lab8.Command.SendElements();
         elemList = Lab8.Command.SendElements();

         //elemList = _elemList;

         Content content = new Content();

         foreach (var elem in elemList)
         {
            content = new Content();
            content.id = elem.Id;
            content.categName = elem.Category.Name;

            var finalList = new Content
            {
               id = content.id,
               categName = content.categName
            };
            
            ElementDataGrid.Items.Add(finalList);
            
         }
      }

      private void ElementDataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
      {
         var grid = sender as DataGrid;

         var cellValue = grid.SelectedValue;
         Content content = new Content();

         content = (Content)cellValue;
         
         Command.SelectElementById(content.id);
      }

所以; 我应该如何设计SelectElementById方法以便我能够通过 选择某个元素id?还是当前代码不允许执行此操作?

标签: c#wpfrevit-api

解决方案


当前代码很好。您需要获取活动视图并使用事务在当前视图中设置元素

public static void SelectElementById(ElementId id)
    {
        ICollection<ElementId> to_showids = new List<ElementId>();
        to_showids.Add(id);

        //RESET ELEMENTS IN VIEW
        var itrans = new Transaction(YOURDOCUMENT, "Show Element");
        using(itrans)
        {
            itrans.Start();
            //The below step is to make sure that any previous selection is removed and only your new selection is set.
            YOURDOC_UI.Selection.SetElementIds(to_showids);
            itrans.Commit();
        }

        //SHOW ELEMENTS
        YOURDOC_UI.ShowElements(to_showids);
    }

推荐阅读