从包含此类信息的元素获取有关楼梯和楼梯的信息

时间:2016-02-08 14:13:01

标签: c# null revit-api revit revit-2015

您好我有以下代码:

   public static void HandleStairs(Document doc)
        List<TransitionPoint> ret = new List<TransitionPoint>();
        FilteredElementCollector collector = new FilteredElementCollector(doc);
        ICollection<Element> stairs = collector.OfCategory(BuiltInCategory.OST_Stairs).ToElements();
            foreach (var stair in stairs)
             {
                 var st= stair as Stairs;
                 if(st!=null)
                 {
                        %code that is never executed
                 } 
            }

        return ret;
    }

现在的问题是,无论看起来楼梯总是空的,我听说另一个程序员也有同样的问题。

楼梯变量确实接收了一些具有stairlike属性的物体(被命名为楼梯,有立管和平台分机)但实际上并不接受被施放到楼梯上。有人知道如何将其实际投入楼梯(或以其他方式获取文件中的所有楼梯吗?)

请注意,楼梯是具有以下属性的元素:

Riser to Tread Connection
Monolithic Material
Apply Nosing Profile
Stringer Material
Text Size
Begin with Riser
Stringer Carriage Height
URL
Open Stringer Offset
Right Stringer
Riser Type
Cost
Left Stringer
Underside of Winder
Stringer Height
Nosing Profile
Manufacturer
Middle Stringers
Keynote
Riser Material
Minimum Tread Depth
Text Font
Monolithic Stairs
Maximum Riser Height
Landing Carriage Height
Break Symbol in Plan
Landing Overlap
Extend Below Base
Nosing Length
Assembly Description
End with Riser
Description
Function
Type Image
Type Comments
Stringer Thickness
Assembly Code
Calculation Rules
Trim Stringers at Top
Model
Tread Thickness
Tread Material
Riser Thickness

我主要需要楼梯对象来获得与楼梯对象相关的运行,或者实际上我需要运行所遵循的路径。

这有望用于执行以下操作:

 var tesselated = new List<XYZ>();
 var stairPath = run.GetStairsPath();
     foreach (Curve curve in stairPath)
     {
         tesselated.AddRange(curve.Tessellate());
     }

因为我需要XYZ位置的任何楼梯连接到建筑物的几何形状的位置。

3 个答案:

答案 0 :(得分:4)

首先,你必须找出并告诉我们你在谈论什么样的元素。否则,这个讨论完全没有意义。确定这一点的一个非常简单的方法是使用RevitLookup探索'阶梯状'元素:

https://github.com/jeremytammik/RevitLookup

如果你不知道RevitLookup是什么,你应该立即停止使用Revit API做的其他事情,并通过使用Revit API入门材料开始新的工作,特别是安装和开始使用RevitLookup:< / p>

http://thebuildingcoder.typepad.com/blog/about-the-author.html#2

您显示的已过滤元素收集器将检索“Stairs”类别的所有元素。这个“阶梯式对象”可以是DirectShape,在这种情况下,您可以将其指定为“Stairs”类别。然后它将由上面的过滤元素收集器检索。

以下是一个“阶梯状”挤压屋顶的示例,该屋顶将始终保持屋顶,具有“屋顶”类别,因此您的过滤元素收集器永远无法识别:

http://thebuildingcoder.typepad.com/blog/2014/09/events-again-and-creating-an-extrusion-roof.html#7

很抱歉这个令人困惑的答案,但我必须说你的问题也很混乱。从来没有听过这样的话。我希望这会有所帮助。

答案 1 :(得分:1)

你所做的事情看起来很合理,虽然正如其他人所指出的那样,显然你会得到一个不是楼梯元素的元素。

我建议 - 为了确保你得到你想要的东西,你使用:

.OfClass(typeof运算(楼梯))

使用FilteredElementCollector。有了这个,您可以删除WhereElementIsNotElementType()和OfCategory()方法,因为它隐含在上面的语句中。

这样 - 无论你得到什么,都应该是可以投射的。

答案 2 :(得分:0)

如果转换失败,as运算符将返回null,因此,doc.GetElement(stairId)返回的内容不属于Stairs类型或其子类型之一。

我猜测doc是某种存储&#39;文档,因此您可能需要创建Stairs的新实例,并使用从doc.GetElement(stairId)返回的内容中获取的信息填充它。