Получение информации о лестницах и лестницах из элементов, содержащих такую информацию
Здравствуйте, у меня есть следующий код:
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;
}
Теперь проблема в том, что независимо от того, что кажется, лестница всегда равна нулю, я слышал, что у другого программиста была такая же проблема.
переменная лестница действительно получает ряд объектов со свойствами, подобными лестнице (называемых лестницей, имеющими надстрочные элементы и платформы), но на самом деле не воспринимается как приведенная к лестнице. Кто-нибудь знает, как на самом деле бросить это в лестницу (или иным образом получить все лестницы в документе?)
Обратите внимание, что лестница - это элемент со следующими свойствами:
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 локации для позиций любой лестницы, привязанной к геометрии здания.
3 ответа
Прежде всего, вам необходимо выяснить и рассказать нам, о каком элементе вы говорите. В противном случае, это обсуждение совершенно бессмысленно. Один очень простой способ определить это - исследовать "лестничный" элемент с помощью RevitLookup:
https://github.com/jeremytammik/RevitLookup
Если вы не знаете, что такое RevitLookup, вам следует немедленно прекратить все остальное, что вы делаете с Revit API, и начать все заново, работая с материалом Revit API для начинающих, особенно с установки и начала использования RevitLookup:
http://thebuildingcoder.typepad.com/blog/about-the-author.html
Показанный вами сборщик отфильтрованных элементов извлекает все элементы категории "Лестницы". Этот "лестничный объект" может быть DirectShape, в этом случае вы можете назначить ему категорию "Лестницы". Затем он будет получен вашим фильтром сборщика элементов выше.
Вот пример "ступенчатой" экструдированной крыши, которая является и всегда будет оставаться крышей с категорией "Крыши" и, следовательно, никогда не может быть идентифицирована вашим сборщиком отфильтрованных элементов:
http://thebuildingcoder.typepad.com/blog/2014/09/events-again-and-creating-an-extrusion-roof.html
Извините за запутанный ответ, но я должен сказать, что ваш вопрос тоже довольно запутанный. Никогда раньше не слышал ничего подобного. Надеюсь, это поможет.
То, что вы сделали, выглядит разумным, хотя, как уже отмечали другие, очевидно, что каким-то образом вы получаете элемент, который не является элементом Stair.
Я бы предложил - чтобы убедиться, что вы получаете то, что вы хотите, что вы используете:
.OfClass (TypeOf(Лестница))
с помощью FilteredElementCollector. При этом вы, вероятно, можете отбросить методы WhereElementIsNotElementType() и OfCategory(), поскольку это подразумевается в приведенном выше утверждении.
Таким образом, все, что вы получите, должно быть кастуемо.
as
оператор возвращает null
if the cast fails, so whatever doc.GetElement(stairId)
returns is not of type Stairs
or one of its sub-types.
я догадываюсь doc
is some kind of 'storage' document so you probably need to create a new instance of Stairs
and fill it with information you get from whatever doc.GetElement(stairId)
возвращается.