Tworzenie widoków elewacji przy pomocy API

Stworzenie widoku przekroju w zadanym miejscu i kierunku jest stosunkowo proste do uzyskania przy pomocy kodu w Revicie. Tworząc przekrój wystarczy jako parametr funkcji podać odpowiednio ustawiony (wymiary i transformacja) obiekt typu BoundingBox. Niestety w przypadku elewacji nie jest już tak prosto.

Widok elewacji w Revicie nie jest zupełnie samodzielny – musi być przyporządkowany do konkretnego znacznika elewacji (elevation marker). I tak, okazuje się, że przykładowo kąt patrzenia kontrolowany jest poprzez obrót znacznika właśnie, a nie poprzez obrót samego widoku.

Kolejną niespodzianką jest ustawienie zasięgu patrzenia, które również nie wynika z wymiarów Bounding Box. Zakres jest kontrolowany przez parametr „Odsunięcie dalekiego przycięcia” (Far clip offset).

Także, rozpoczęcie ustawiania widoku elewacji zaczynamy od stworzenia znacznika:

ElevationMarker marker = ElevationMarker.CreateElevationMarker(doc,viewFamilyType.Id,center,50); 

gdzie „doc” to nasz dokument Revit, „viewFamilyType” typ widoku, „center” punkt wstawienia. Ostatni parameter, liczbowy, określa skalę widoku.

Następnie dla tegoż znacznika możemy utworzyć interesujący nas widok elewacji:

ViewSection elevationView = marker.CreateElevation(doc, view.Id,0);

Tu parametrami są: dokument Revit, id widoku rzutu, w którym widoczny jest znacznik oraz indeks. Każdy znacznik elewacji może mieć przypisane cztery widoki elewacji – pod indeksem od 0 do 3.

Dla widoku elewacji umieszczonego pod indeksem 0 (dla innych indeksów może się to różnić) ustawienie Bounding Box wygląda tak:

BoundingBoxXYZ bb = elevationView.get_BoundingBox(null);

bb.Min=new XYZ(center.Y-width/2,center.Z,0);
bb.Max=new XYZ(center.Y+width/2,center.Z+height,0);
				
elevationView.CropBox = bb;

gdzie center to ponownie nasz punkt wstawienia, a „width” i „height” określają poziomy i pionowy wymiar widoku.

Na koniec pozostaje nam już tylko ustawienie zasięgu widzenia oraz obrót znacznika:

Parameter p = elevationView.get_Parameter(BuiltInParameter.VIEWER_BOUND_OFFSET_FAR);
p.Set(depth);
				
Line l = Line.CreateBound(center,center+XYZ.BasisZ);
ElementTransformUtils.RotateElement(doc,marker.Id,l,angle);

gdzie „depth” i „angle” to oczywiście zakres i kąt patrzenia.

Przykładowy kod kompletnej funkcji może wyglądać tak:

public void createElevationView() {
			
	Document doc = this.ActiveUIDocument.Document;
	UIDocument uiDoc = new UIDocument(doc);
			
	View view = uiDoc.ActiveView;
		
	ViewFamilyType vft = new FilteredElementCollector(doc).OfClass(typeof(ViewFamilyType)).Cast<ViewFamilyType>()
		.FirstOrDefault<ViewFamilyType>(a=>ViewFamily.Elevation == a.ViewFamily);
			
	XYZ center = new XYZ(50,100,0);
	double width = 100;
	double height = 20;
	double angle = 0.5*Math.PI;
	double depth = 50;
			
	using(Transaction t = new Transaction(doc,"elevation")){
					
		t.Start();
			
		ElevationMarker marker = ElevationMarker.CreateElevationMarker(doc,vft.Id,center,50);
				
		ViewSection elevationView = marker.CreateElevation(doc, view.Id,0);
				
		BoundingBoxXYZ bb = elevationView.get_BoundingBox(null);

		bb.Min=new XYZ(center.Y-width/2,center.Z,0);
		bb.Max=new XYZ(center.Y+width/2,center.Z+height,0);
				
		elevationView.CropBox = bb;
		Parameter p = elevationView.get_Parameter(BuiltInParameter.VIEWER_BOUND_OFFSET_FAR);
		p.Set(depth);
				
		Line l = Line.CreateBound(center,center+XYZ.BasisZ);
		ElementTransformUtils.RotateElement(doc,marker.Id,l,angle);

				
		t.Commit();
	}
}

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