Odbicia lustrzane obiektów

Tworząc zestawienia stolarki (ślusarki etc.) w Revicie zazwyczaj zmuszeni jesteśmy podać kierunek ew. otwierania – lewy bądź prawy. Niestety może on zostać błędnie określony przez program jeśli obiekt (drzwi, okno) jest odbiciem lustrzanym – czy to za sprawą fukncji „mirror” czy tzw. „flip arrows”.
Na szczęście z pomocą przychodzą makra 🙂 Poniższe zaznaczy nam wszystkie odbite drzwi w projekcie.

Na początek tworzymy zmienne zawierające odniesienie do aktualnie otwartego dokumentu w Revicie.

Document doc = this.ActiveUIDocument.Document;
UIDocument uiDoc = new UIDocument(doc);

Następnie użyjemy niezwykle użytecznego elementu API revitowego jakim jest „FilteredElementCollector”. Jest to ustrojstwo pozwalające na przefiltrowanie obiektów w projekcie – zwrócenie do zmiennej zestawu elementów odpowiadającemu warunkom filtru. W niniejszym przykładzie chcemy wybrać wszystkie obiekty będące drzwiami :

FilteredElementCollector collector = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors);

Powyższa linijka kodu tworzy zmienną o nazwie „collector” przypisując jej elementy spełniające warunki filtru „OfCategory”. Filtr ten odsiewa elementy na podstawie kategorii obiektu. Tu podaliśmy jedną z wbudowanych (stąd BuiltInCategory), czyli drzwi.

Jako, że będziemy przeprowadzać dalszą selekcję wśród naszych elementów, tworzymy kolejną zmienną :

SelElementSet mirroredElements = SelElementSet.Create();

Jest to pusty zestaw elementów revitowych. Będziemy do niego dodawać te drzwi które uznamy za odbicia lustrzane.

Aby to uczynić tworzymy pętlę „foreach”, która sprawdzi każdy obiekt ze zmiennej collector – tej która zawiera wszystkie drzwi z projektu. W pętli tej, aby uchronić się przed błędem wykonania kodu, upewnimy się, że dany element jest tzw. „Family Instance”, czyli konkretnym egzemplarzem jakiejś rodziny revitowej (a nie np typem albo zestawieniem).

Jeśli wszystko jest w porządku to zmienną e (mogącą zawierać dowolnego rodzaju element) konwertujemy na zmienną typu FamilyInstance właśnie.

FamilyInstance fi = e as FamilyInstance;

Tworzymy również pomocniczą zmienną logiczną (prawda/fałsz) o nazwie „mirrored”. Domyślnie przypisujemy jej wartość „fałsz”. Jeśli stwierdzimy, że drzwi są odbite zmienimy ją na „prawda”.

Następnie sprawdzamy już tylko wartość parametru „mirrored” dla naszej zmiennej fi. Czyli pytamy Revit’a czy ten konkretny obieky był, ten czy inny sposób, odbity lustrzanie.

if(fi.Mirrored) mirrored=true;

Dla pewności sprawdzimy jeszcze dwa inne parametry obiektu – „FacingFlipped” oraz „HandFlipped”. Aczkolwiek samo sprawdzenie „mirrored” powinno być wystarczające.

Ostatnia linijka pętli dodaje nasz obiekt do stworzonego wcześniej zestawu elementów – oczywiście tylko wtedy gdy wartość zmiennej „mirrored” ustawiliśmy na „prawda”.

Kod kończy polecenie:

uiDoc.Selection.Elements = mirroredElements;

W aktywnym dokumencie Revita podświetlamy te obiekty które włączyliśmy wcześniej do naszego zestawu.

Całość funkcji przedstawia się następująco :

public void mirrored_elements() {
            
	Document doc = this.ActiveUIDocument.Document;
        UIDocument uiDoc = new UIDocument(doc);
            
        FilteredElementCollector collector = new FilteredElementCollector(doc)
          .OfCategory(BuiltInCategory.OST_Doors);
          
        SelElementSet mirroredElements = SelElementSet.Create();
            
        foreach (Element e in collector) {
                
        	if(e is FamilyInstance) {
                
         		FamilyInstance fi = e as FamilyInstance;                    
                	bool mirrored=false;                
	                if(fi.Mirrored) mirrored=true;                    
        	        if(fi.FacingFlipped ^ fi.HandFlipped) mirrored=true;                
                	if(mirrored) mirroredElements.Add(fi);
                }                
	}            
	uiDoc.Selection.Elements = mirroredElements;                      
}
Posts created 32

Dodaj komentarz

Twój adres email nie zostanie opublikowany.

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top