c# - 如何在 Revit 中找到斜坡的起点/终点,也许是草图?

标签 c# api autodesk revit-api revit

我有一堆坡道,我想知道它们的起点和终点(如果有多个起点/终点,我想知道它们是如何连接的)。 我目前将这些作为

List<TransitionPoint> ret = new List<TransitionPoint>();
FilteredElementCollector collector = new FilteredElementCollector(doc);
ICollection<Element> ramps = collector.OfCategory(BuiltInCategory.OST_Ramps).ToElements();

foreach (var ramp in ramps)
{
   //what goes here?
}

这些坡道包含以下属性:

Type Comments
Ramp Max Slope (1/x)
Category
URL
Design Option
Type Name
Ramp Material
Function
Manufacturer
Family Name
Model
Keynote
Type Image
Text Size
Shape
Text Font
Maximum Incline Length
Assembly Description
Assembly Code
Type Mark
Category
Thickness
Cost
Description

现在,如果这些楼梯我会使用 ICollection stairs = collector.OfCategory(BuiltInCategory.OST_Stairs).OfClass(typeof(Stairs)).ToElements(); 然后我可以将对象转换到 Stairs 中,但是似乎没有一个类 simmulair to Stairs 可以让我访问 Stairs.GetStairsRuns().

有人知道如何获得 RampRun 之类的东西或找到坡道的起点和终点吗?

我也尝试了以下解决方案,但也没有用

public static void MapRunsToRamps(Document doc)
{
   var rule = ParameterFilterRuleFactory.CreateNotEqualsRule(new ElementId(BuiltInParameter.HOST_ID_PARAM), "null", true);

   ElementParameterFilter filter = new ElementParameterFilter(rule);
   FilteredElementCollector collector = new FilteredElementCollector(doc);
   List<Element> rampsRuns = collector.WherePasses(filter).ToElements().ToList<Element>();
   foreach (Element e in rampsRuns)
   {
      var hostpara = e.get_Parameter(BuiltInParameter.HOST_ID_PARAM);
      if (hostpara != null)
      {
         var host = doc.GetElement(new ElementId(hostpara.AsInteger()));
         if (host.Category.Equals(BuiltInCategory.OST_Ramps))
         {
            //breakpoint that is never activated 
         }
      }
   }
}

这会找到很多对象,但没有一个以斜坡作为宿主。

这是一个坡道示例,我试图找到用红色箭头标记的位置。 ramps marked with red arrows

这个https://forums.autodesk.com/t5/revit-api/how-do-we-get-the-x-y-z-cordinates-for-stairs-ramps/td-p/2575349建议我们可以使用位置曲线,有什么方法可以做到吗?

编辑: 确实有一些草图,我们可以根据这些草图找到坡道,问题是我是否有草图说

    var rampCategoryfilter = new ElementCategoryFilter(BuiltInCategory.OST_StairsSketchRunLines);
    var rampsRuns = new FilteredElementCollector(doc).WherePasses(rampCategoryfilter);

然后我确实可以获得位置,但我没有的是它也属于的坡道,知道如何找到它吗?

最佳答案

假设您的Ramp 是一个FamilyInstance:

var fecRamps = new FilteredElementCollector(doc)
    .OfClass(typeof(FamilyInstance))
    .Where(pElt =>
    {
        int lCatId = pElt.Category.Id.IntegerValue;
        return lCatId == (int)BuiltInCategory.OST_Ramps;
    })
    .OfType<FamilyInstance>()
    .ToList();

List<XYZ> lRampLocs = new List<XYZ>();
foreach (var pFam in fecRamps)
{
    var fLoc = pFam.Location as LocationCurve;
    var fRampSide1 = new XYZ(fLoc.Curve.GetEndPoint(0);
    var fRampSide2 = new XYZ(fLoc.Curve.GetEndPoint(1);

    lRampLocs.Add(fRampSide1);
    lRampLocs.Add(fRampSide2);
}

每个 FamilyInstance 都有一个 Location,您可以将 Location 转换为 LocationCurve。从曲线中,您可以通过 Autodesk.Revit.DB 命名空间获取端点。

关于c# - 如何在 Revit 中找到斜坡的起点/终点,也许是草图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35699537/

相关文章:

c# - 如何使用 C# 在用户控制页面中获取父页面名称

android - 为 android 使用 api 识别视觉

Android 低于 api 23 无法连接到服务器

vbscript - getObject 函数内部如何工作?

gis - 将 CAD 文件转换为形状文件

c# - 如何将嵌套 ItemsControl ItemsSource 绑定(bind)到嵌套在父 ItemControl 的绑定(bind)项中的 ObservableCollection

c# - SQL 服务器 : how would I do a truncate and copy in C#?

iphone - 是否有适用于移动设备的带有 SDK 的跨平台条码扫描器应用程序?

windows - Ansible win_scheduled_task 如何立即开始一个任务

c# - 在结构中,通过 Equals 实现 operator== 是否有效,但不覆盖 Equals 和 GetHashCode?