9. Revit API UI: UIView、UIDocument、框選聚焦
UI命名空間下的API,到這里差不多就押送講完了,同Application那篇所講的幾個類與接口,都是帶UI的對應了一個不帶UI的,如UIApplication和Application,作用呢,也是類似的。
由
UI
級別提供到DB
級別的入口。
所以呢,內容較少,作用也有限。
一個應用可以打開多個文檔,一個文檔包含多個視圖。
用偏軟件運用的說法就是:Revit可以同時打開多個項目,每個項目都有各種視圖(如三維、平面、圖紙、統計表等)。
UIDocuemnt
UIDocument
從UIApplication
中獲取。
UIApplication uiApp = commandData.Application;
UIDocument uiDoc = uiApp.ActiveUIDocument;
獲取當前活動的項目文檔。至于獲取到全部項目文檔,得再Application
中才行,里面有屬性"Documents"。
回到UI話題,來看看類成員吧。
主要屬性:
屬性 | 描述 |
---|---|
ActiveGraphicalView ActiveView | 當前活動的視圖 |
Application:UIApplication | 互相存了對方的引用 |
Document:Document | 提供DB 級別文檔操作的入口 |
Selection | 一個選擇器的實例,位于UI.Selection 命名空間中 |
部分方法:
方法 | 描述 |
---|---|
GetOpenUIViews() UpdateAllOpenViews () | 獲取已打開的視圖 更新已打開的視圖 |
ShowElements(…) x4 | 縮放顯示指定元素。 效果類似于雙擊鼠標中鍵,或者選擇模型后,點擊右上角視角盒子。 |
SaveAs() x2 SaveAndClose() | 保存 |
… | 其它 |
UIDocument就這樣了,至于Document
,到Autodesk.Revit.DB
命名空間時再講,應該很快了。
UIView
UIView
得使用UIDocument的GetOpenUIViews()
方法獲取,至于活動視圖所對應的UIView,可以通過屬性ViewId
比較獲得。
UIView成員:
類成員 | 描述 |
---|---|
ViewId :ElementID | 所對應的View |
Close() | 關閉視圖 |
GetWindowRectangle() | 獲取View在屏幕上的像素范圍 |
GetZoomCorners () | 獲取View在模型空間中當前視角的范圍 |
Zoom(…) ZoomAndCenterRectangle(…) ZoomSheetSize() ZoomToFit() | 按比例縮放,傳入比例 縮放到指定的范圍,傳入范圍 縮放到指定范圍,框選范圍 縮放到適應大小(雙擊鼠標中鍵) |
感覺UIDocument上的縮放,就是調用的UIView上的方法。
1. 獲取ActiveUIView
private UIView GetActiveUIView(UIApplication uiApp)
{UIDocument uiDoc = uiApp.ActiveUIDocument;Document doc = uiDoc.Document;View activeView = uiDoc.ActiveView;IList<UIView> uiViews = uiDoc.GetOpenUIViews();UIView activeUIView = null;string viewNames = string.Empty;foreach (UIView uiView in uiViews){View view = doc.GetElement(uiView.ViewId) as View;if (view.Id == activeView.Id){activeUIView = uiView;}viewNames += $"{view.Name}\r\n";}viewNames += $"\r\nActive View: {activeView.Name}";TaskDialog.Show("OpenUIViews", viewNames);return activeUIView;
}
2. 框選聚焦
框選聚焦,可以直接采用ZoomSheetSize()
方法。為什么還有寫這個呢,因為開始時,我沒有測試這個方法的效果,然后采用了另一個方法實現(不推薦),這里還是記錄一下。
采用UIView的
ZoomSheetSize()
方法
自己計算范圍的框選聚焦實現。
// 效果等同于 ZoomSheetSize()
private void ZoomToRectangle(Selection selection, UIView uiView)
{PickedBox box = selection.PickBox(PickBoxStyle.Enclosing);XYZ minPoint = box.Min;XYZ maxPoint = box.Max;uiView.ZoomAndCenterRectangle(minPoint, maxPoint);
}
總結
這篇內容就這些了,感覺有用/有趣點的就框選聚焦了。
到這里,UI篇主要內容都講完了吧,但還是有一些邊邊角角漏掉了,看看下篇就結束的掉吧。