【问题标题】:Gettings information about stairsruns and stairs from elements containing such information从包含此类信息的元素中获取有关楼梯运行和楼梯的信息
【发布时间】:2016-05-18 05:42:55
【问题描述】:

您好,我有以下代码:

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

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

stairs 变量确实接收了许多具有类似楼梯属性的对象(被命名为楼梯,具有立管和平台分机),但实际上似乎不接受被投射到楼梯上。任何人都知道如何将其实际投射到楼梯中(或以其他方式获取文档中的所有楼梯?)

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

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 位置作为任何楼梯连接到建筑物几何图形的位置。

【问题讨论】:

  • Stairs 是什么,它是否继承自 doc.GetElement() 返回的任何内容?
  • Stairs 是一个继承自 Revit API 内部元素的类。 getElement(stairID) 返回具有楼梯对象属性的元素。

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


【解决方案1】:

首先,您绝对必须找出并告诉我们您所谈论的元素类型。否则,这个讨论完全没有意义。一种非常简单的确定方法是使用 RevitLookup 探索“类似楼梯”的元素:

https://github.com/jeremytammik/RevitLookup

如果您不知道 RevitLookup 是什么,您应该立即停止使用 Revit API 执行的所有其他操作,并通过阅读 Revit API 入门材料重新开始,尤其是安装和开始使用 RevitLookup:

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

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

这里是一个“楼梯状”挤压屋顶的示例,它一直是屋顶,具有“屋顶”类别,因此您的过滤元素收集器永远无法识别:

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

抱歉,答案令人困惑,但我必须说您的问题也很令人困惑。以前从未听说过这样的事情。我希望这会有所帮助。

【讨论】:

  • 我试图尽可能地更新我的问题,我有一个具有上述属性的元素(或者我可以要求其他属性)并希望它告诉我它有什么运行, Stairs 类有一种获得我想使用的运行的方法。
【解决方案2】:

您所做的看起来很合理,尽管正如其他人指出的那样,显然您以某种方式返回了一个不是 Stair 元素的元素。

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

.OfClass(typeof(Stairs))

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

这样 - 你得到的任何东西都应该是可转换的。

【讨论】:

    【解决方案3】:

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

    我猜doc 是某种“存储”文档,因此您可能需要创建Stairs 的新实例,并在其中填写您从doc.GetElement(stairId) 返回的任何信息。

    【讨论】:

    • 我想我的主要问题是如何将描述楼梯的元素变成楼梯。
    猜你喜欢
    • 1970-01-01
    • 2015-02-22
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2020-08-03
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多