c# - 通过取自 WPF DataGrid 的 ID 选择 Revit 元素
问题描述
在直接跳到问题之前,我将简要描述我要编写的代码。基本上,我正在尝试做一个 Revit 加载项,它打开一个 WPF 对话框,显示活动视图中元素的id
和categoryName
,当双击包含 的单元格时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.cs类SelectElementById(...)
调用的方法。下面您将看到用于填充的功能以及获取单元格值并将of 类型传递回Command.cs的方法DataGrid
MouseButtonDoubleClick
id
ElementId
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
?还是当前代码不允许执行此操作?
解决方案
当前代码很好。您需要获取活动视图并使用事务在当前视图中设置元素
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);
}
推荐阅读
- javascript - 为什么增量不保存在条件运算符中?
- c++ - 为什么不能通过引用将 std::atomic 变量传递给线程?(但你可以通过指针)
- z3 - 如何用 Z3 证明器检查涉及一些三角学的定理?
- postgresql - 通过关系的深层属性查询
- javascript - 在我的项目中使用 useState 后出现“无效的挂钩调用”错误
- angular - 在 Angular 中组合结果
- android - 无法解决此错误: RangeError (index): Invalid value: Valid value range is empty: 0
- java - 无法将日期和时间转换为 LocalDateTime [Java]
- javascript - 如何在 React.JS 中添加搜索过滤器?
- python - 在其 __init__ 方法中引用类时出错