Autodesk общност от програмисти в страните от ОНД
Как да се определи дали дадена точка е вътре в зоната
В Revit, има три вида функции:
API за Revit, тези обекти са представени от класове по стаите. Пространство и пространство, съответно, които са наследени от SpatialElement базовия клас.
Стая и Space Класовете са методи за определяне на това дали дадена точка в рамките на една стая или пространство. IsPointInRoom и IsPointInSpace.
Аз също е необходимо да се определи дали даден момент в рамките на зоната. Метод IsPointInArea за съжаление не се появи. Аз трябваше да приложат на техните собствени.
Първата стъпка е да се намери алгоритъм, който ви позволява да се определи дали даден момент е в даден интервал. За щастие, проблемът е доста разпространена практика и затова са готови алгоритми вече имат.
Методът е много прост. От даден момент се извършва въображаем лъч във всяка посока. След това се преброят на кръстовища на лъча с полигон граници. Ако лъч пресича многоъгълника е още няколко пъти, а след това на мястото е извън границите на полигон. В противен случай, въпросът е от полигона.
За да се приложи този алгоритъм в Revit е необходимо да извършите следните стъпки
- Получаване на списък с границите на териториалното елемент. SpatialElement .GetBoundarySegments (). Граници може да бъде повече, например, ако по средата на стаята има колона или дупка.
- Construct лъч от дадена точка. За простота, ние се изгради една греда успоредно на оста X.
- За всяка граница, за да получите списък с такива, които определят границата.
- Проверете дали лъч пресича сегмента на данни.
- Пребройте кръстовища
В действителност, този алгоритъм е подходящ за всички пространствени елементи на Revit, така че няма да се ограничава само до тази област, и прилагане на този алгоритъм за SpatialElement базовия клас.
Често се използват методи за удължаване на срока. Ние го създаде в този момент. Пълен метод код за определяне на мястото на разположение в пространството:
публично статично клас SpatialElementExternsion
публично статично булев IsPointInsideSpatialElement # 40; това SpatialElement spatialElement, точка XYZ # 41;
// определят пространственото местоположение на елемента
Var местоположение = spatialElement. Местоположение както LocationPoint;
ако # 40; място == нула # 41;
// Ако точката се намира под нивото на пространствен елемент, след това се върнете False;
ако # 40; точка. Z // Получаване на границата на обект Var boudnaries = spatialElement. GetBoundarySegments # 40; нови SpatialElementBoundaryOptions # 40; # 41; # 41; ; Line линия = Line. CreateBound # 40; точка, нов XYZ # 40; 0. 10000. 0 # 41; # 41; ; // променлива за преброяване на броя на кръстовища Int intersectionCount = 0;