Подтвердить что ты не робот

Как найти начало/конец рампы в 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(); и затем я могу отбросить объекты в Лестницу, но, похоже, не существует класса simmulair для Лестницы, который позволил бы мне adres 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 
         }
      }
   }
}

Это находит множество объектов, которые просто отсутствуют с рампой в качестве хоста.

Вот пример рампы и местоположения, которые я пытаюсь найти, отмеченные красными стрелками. рампы, отмеченные красными стрелками

этот https://forums.autodesk.com/t5/revit-api/how-do-we-get-the-x-y-z-cordinates-for-stairs-ramps/td-p/2575349 предполагает, что мы можем использовать locationcurve, любым способом сделать это?

изменить: Там, кажется, есть эскизы, на основе которых мы могли бы найти пандусы, вопрос в том, есть ли у меня эскиз с

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

тогда я действительно могу получить места, но то, что у меня нет, это рампа, которой это тоже принадлежит, любая идея, как ее найти?

4b9b3361

Ответ 1

Предполагая, что ваш 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.