2016-02-29 7 views
34

Mam kilka ramp, które chciałbym znać punkt początkowy i końcowy (aw przypadku wielu punktów początku/końca chciałbym wiedzieć, jak się łączą). Obecnie dostać je jakoJak znaleźć początek/koniec rampy w rewitalizacji, być może ze szkicami?

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

Rampy te zawierają następujące właściwości:

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 

Teraz, jeśli te, gdzie schody użyłbym ICollection stairs = collector.OfCategory(BuiltInCategory.OST_Stairs).OfClass(typeof(Stairs)).ToElements(); i wtedy mogę oddania obiektów do Schody jednak nie robi nie wydaje się być symulastem klasowym do Schodów, który pozwoliłby mi adresować: Stairs.GetStairsRuns().

Ktoś wie, jak uzyskać coś w stylu RampRun lub inaczej znajdź początek i koniec rampy?

Próbowałem również następujące sollution ale to nie działa albo

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

ten znajdzie mnóstwo obiektów prostu żaden z rampą jako gospodarz.

Oto przykład rampy i lokalizacji, którą próbuję znaleźć oznaczone czerwonymi strzałkami. ramps marked with red arrows

ten https://forums.autodesk.com/t5/revit-api/how-do-we-get-the-x-y-z-cordinates-for-stairs-ramps/td-p/2575349 sugeruje, że możemy użyć lokalizacji locationcurve, w jaki sposób?

edit: Nie wydają się być szkice, na podstawie których moglibyśmy znaleźć rampy, pytanie brzmi, czy mam szkic powiedzieć z

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

wtedy mogę rzeczywiście dostać lokalizacje ale co Nie mam też rampy, do której również należy, żadnego pomysłu, jak ją znaleźć?

+0

Z której wersji Revit korzystasz? –

+0

Pracuję nad wersją 2015-2016 i 2017 – Thijser

+0

Spójrz na to: https://knowledge.autodesk.com/de/support/revit-products/learn-explore/caas/CloudHelp/cloudhelp/2014/DEU/ Revit/files/GUID-D5F9820D-B548-4600-8739-8029AD3B3B8B-htm.html (sprawdź metodę GetStairLandings) –

Odpowiedz

1

Zakładając, że Ramp jest 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); 
} 

Każdy FamilyInstance ma Location i można rzucić Location jako LocationCurve. Z krzywej można uzyskać punkty końcowe za pośrednictwem przestrzeni nazw Autodesk.Revit.DB.

Powiązane problemy