comunitate de programatori autodesk în CSI
Cum se determina dacă un punct este în interiorul zonei
În Revit, există trei tipuri de caracteristici:
Revit API, aceste obiecte sunt reprezentate prin clase de cameră. Spațiu și Zona, respectiv, care sunt moștenite de la SpatialElement clasa de baza.
Cameră și spațiu Clasele sunt metode pentru a determina dacă un anumit punct într-o cameră sau spațiu. IsPointInRoom și IsPointInSpace.
De asemenea, am nevoie pentru a determina dacă un anumit punct în interiorul zonei. O IsPointInArea metodă, din păcate, nu a apărut. A trebuit să pună în aplicare pe cont propriu.
Primul pas a fost de a găsi un algoritm care vă permite să se determine dacă un punct este într-un anumit spațiu. Din fericire, problema este destul de comună, și algoritmi, prin urmare, gata deja.
Metoda este destul de simplu. Din punct dat este realizat fascicul imaginar în orice direcție. Apoi, contoriza numărul de intersecții de raze X, cu limite de poligon. Dacă raza intersectează poligonului este un număr egal de ori, atunci punctul este în afara limitelor poligonului. În caz contrar, punctul este în interiorul poligonului.
Pentru a pune în aplicare acest algoritm în Revit nevoie pentru a efectua următorii pași
- Ia-o listă a limitelor elementului spațial. .GetBoundarySegments SpatialElement (). Frontiere poate fi mai mult, de exemplu, în cazul în care mijlocul camerei există o coloană sau o gaură.
- Construi raze dintr-un anumit punct. Pentru simplitate, vom construi o grindă paralelă cu axa X.
- Pentru fiecare frontieră pentru a obține o listă de segmente care definesc frontiera.
- Verificați dacă raza intersectează segmentul de date.
- Contorizarea numărul de intersecții
De fapt, acest algoritm este potrivit pentru toate elementele spațiale ale Revit, astfel încât nu va fi limitat la zona, și punerea în aplicare a acestui algoritm pentru SpatialElement clasa de baza.
Eu folosesc adesea metode de prelungire. Am crea în acest timp. Cod Metoda completă pentru determinarea punctului de localizare în interiorul spațiului:
SpatialElementExternsion publice clasa statică
IsPointInsideSpatialElement publice bool statice # 40; acest SpatialElement spatialElement, punctul XYZ # 41;
// definesc localizarea spațială a elementului
var locația = spatialElement. Locație ca LocationPoint;
dacă # 40; locație == null # 41;
// Dacă punctul se află sub nivelul elementului spațial, apoi return false;
dacă # 40; punct. Z // Ia frontiera obiect var boudnaries = spatialElement. GetBoundarySegments # 40; noi SpatialElementBoundaryOptions # 40; # 41; # 41; ; Linie Linie = Linie. CreateBound # 40; punct, nouă XYZ # 40; 0. 10000. 0 # 41; # 41; ; // variabila pentru contorizarea numărului de intersecții int intersectionCount = 0;