2016-02-29 33 views
34

Ich habe eine Reihe von Rampen, von denen ich gerne die Anfangs- und Endpunkte kennen würde (und im Falle mehrerer Anfangs-/Endpunkte würde ich gerne wissen, wie sie sich verbinden). ich diese Zeit alsWie finde ich Anfang/Ende der Rampe in Revit, vielleicht mit Skizzen?

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

Diese Rampen die folgenden Eigenschaften enthalten:

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 

Nun, wenn diese, wo Treppen ich ICollection verwenden würde stairs = collector.OfCategory(BuiltInCategory.OST_Stairs).OfClass(typeof(Stairs)).ToElements(); und dann kann ich die Objekte in Treppen jedoch werfen es tut scheint nicht eine Klasse sein simmulair zu Treppen, die mir erlauben würde, adres Stairs.GetStairsRuns().

Jeder weiß, wie man entweder etwas wie eine RampRun oder sonst finden Sie den Anfang und das Ende einer Rampe?

Ich habe versucht, auch die folgende sollution aber das hat nicht funktioniert entweder

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

Dieses viele Objekte nur kein mit einer Rampe als Wirt findet.

Hier ist ein Beispiel für eine Rampe und der Ort, den ich suche, markiert mit roten Pfeilen. ramps marked with red arrows

diese https://forums.autodesk.com/t5/revit-api/how-do-we-get-the-x-y-z-cordinates-for-stairs-ramps/td-p/2575349 schlägt vor, dass wir eine locationcurve verwenden können, eine Möglichkeit, das zu tun?

edit: Es erscheinen Skizzen zu sein, auf deren Basis wir fähig sein könnten und die Rampen zu finden, die Frage ist, ob ich eine Skizze sagen mit

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

dann kann ich in der Tat die Standorte erhalten, aber was Ich habe nicht die Rampe, dass das auch gehört, irgendeine Idee, wie man das findet?

+0

Und welche Revit-Version verwenden Sie? –

+0

Ich entwickle für 2015-2016 und 2017 – Thijser

+0

Werfen Sie einen Blick auf diese: 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 (überprüfen Sie die GetStairLandings Methode) –

Antwort

1

Unter der Annahme, dass Ihr Ramp ist ein 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); 
} 

Jeder FamilyInstance eine Location hat und Sie können die Location als LocationCurve gegossen. Aus der Kurve können Sie die Endpunkte über den Namespace Autodesk.Revit.DB erhalten.