Autodesk общност от програмисти в страните от ОНД

Как да се определи дали дадена точка е вътре в зоната

В Revit, има три вида функции:

API за Revit, тези обекти са представени от класове по стаите. Пространство и пространство, съответно, които са наследени от SpatialElement базовия клас.

Стая и Space Класовете са методи за определяне на това дали дадена точка в рамките на една стая или пространство. IsPointInRoom и IsPointInSpace.

Аз също е необходимо да се определи дали даден момент в рамките на зоната. Метод IsPointInArea за съжаление не се появи. Аз трябваше да приложат на техните собствени.

Първата стъпка е да се намери алгоритъм, който ви позволява да се определи дали даден момент е в даден интервал. За щастие, проблемът е доста разпространена практика и затова са готови алгоритми вече имат.

Методът е много прост. От даден момент се извършва въображаем лъч във всяка посока. След това се преброят на кръстовища на лъча с полигон граници. Ако лъч пресича многоъгълника е още няколко пъти, а след това на мястото е извън границите на полигон. В противен случай, въпросът е от полигона.

Autodesk общност от програмисти в страните от ОНД

За да се приложи този алгоритъм в Revit е необходимо да извършите следните стъпки

  1. Получаване на списък с границите на териториалното елемент. SpatialElement .GetBoundarySegments (). Граници може да бъде повече, например, ако по средата на стаята има колона или дупка.
  2. Construct лъч от дадена точка. За простота, ние се изгради една греда успоредно на оста X.
  3. За всяка граница, за да получите списък с такива, които определят границата.
  4. Проверете дали лъч пресича сегмента на данни.
  5. Пребройте кръстовища

В действителност, този алгоритъм е подходящ за всички пространствени елементи на 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;