Api 如何将Revit图元强制转换为Revit.DB.Opening

Api 如何将Revit图元强制转换为Revit.DB.Opening,api,casting,revit,Api,Casting,Revit,我在Revit编程方面相对较新。目前,我正在获取图形中类型为“门”或“窗”的图元列表。我要做的是将它们转换为洞口,但是当我尝试将它们转换为Autodesk.Revit.DB.opening时,会出现错误。 代码如下: // filter for current design option var designOptionFilter = S2E.Revit.Tools.Library.Cache.DesignOptionFilter; L

我在Revit编程方面相对较新。目前,我正在获取图形中类型为“门”或“窗”的图元列表。我要做的是将它们转换为洞口,但是当我尝试将它们转换为Autodesk.Revit.DB.opening时,会出现错误。
代码如下:

            // filter for current design option
        var designOptionFilter = S2E.Revit.Tools.Library.Cache.DesignOptionFilter;

        List<Element> elements = collector.WherePasses(designOptionFilter).ToElements().ToList();           

        var list = new List<Autodesk.Revit.DB.Opening>();

        foreach (var element in elements) {

            var opening = (Opening)element;
            if (opening.Host.Id == wallId) {
                list.Add(opening);
            }
        }

        return list;
//当前设计选项的筛选器
var designOptionFilter=S2E.Revit.Tools.Library.Cache.designOptionFilter;
List elements=collector.wherepasss(designOptionFilter.ToElements().ToList();
var list=新列表();
foreach(元素中的var元素){
变量期初=(期初)元素;
if(opening.Host.Id==wallId){
列表。添加(打开);
}
}
退货清单;
正如您所看到的,我正在测试主机的id是否与我正在工作的墙壁匹配。至少这是我想做的。我正在寻找的是如何将一个元素转换为一个开口


谢谢,Rich

这取决于您的过滤器选择的内容,取决于您的演员阵容是否有效。由于您没有提供所得到的确切错误的详细信息,因此很难更加精确

此外,您还有一个位置(洞口)用作演员阵容,但在创建列表时,您使用了完整的类型名称“Autodesk.Revit.DB.Opening”。如果你真的需要这样做,也许开场白并不是你想象中的“开场白”

您还可以使用element.Cast()执行强制转换

同样地,如果您知道过滤器返回的所有元素都只是打开类型,那么您可以使用

collector.WherePasses(designOptionFilter).Cast<Opening>()
collector.wherepasss(designOptionFilter.Cast())

实现同样的目标。

考虑到门是一种家族立场,而门洞不是,我不确定您将如何将门家族立场转换为一种开放类型


但是,由于FamilyInstance有一个Host参数,只需对照墙ID检查一下就可以了,不需要浇铸。

感谢您的回复,我已经确认“开口”实际上就是我要找的开口。我试着像你提供的例子一样把它当作一个开头,但是得到了同样的错误。此外,我得到的错误是“无法将族实例强制转换为Opening类型的对象”。