在revit中,有UIApplication\Application\UIControlApplication,他們到底有什么區別和之間的聯系,一直是我比較迷惑的問題,在深入了解Revit的組織架構后,revit思維邏輯據我的理解說明如下,以下僅為個人想法,不代表真實情況。

一、應用程序Application
在revit中,應用程序只有一個,但是在Revit中,定義了多個Application,他們到底有啥區別?
1、數據承載對象ApplicationServices.Application
其實應用程序只有一個那就是Application,他是位於Autodesk.Revit.ApplicationServices.Application。他是核心的應用程序對象,是當前打開的revit的核心,具有打開新文件和當前應用程序所有設置的能力,其承載着所有的document對象,是當前revit的數據中心,且一個開始的revit應用程序,只有一個Application.
2、承載界面的UIApplication
是Application的一個界面界面表示,他代表着當前應用程序的所有界面信息,能夠操作當前打開的所有界面,當前UI的能力代表的當前應用程序中心,所有當前Appliction只是對當前開啟這個應用程序有效,當前Appliction只能讀取之前讀取的配,生成的界面也只在當前應用程序周期內有效
3、承載應用程序僅包含界面數據控制應用程序ControlApplication
看一下代碼,就知道了,其實ControlApplication只是對Application的一個封裝,由於Application啟動是有一定的生命周期,在應用程序剛剛啟動的時候,去訪問Application是一件並不安全的事情,因為無法避免的會訪問到document對象,所以在插件加載的時候,需要一個簡化版用於只處理界面的Application,則定義了ControlApplication,用於在IExternalApplication的時候可以訪問,同理。所以ControlApplication類是無法訪問到document對象的。

4、承載應用程序僅包含初始界面應用程序UIControlApplication
同理可知道,其定義

5、Creator.Application類,主要用於對Application類中的元素進行創建的一個包裝類。
二、文檔Document
1、數據承載對象:Autodesk.Revit.DB.Document
在任何三維軟件,不得不說一個重要的東西,就是數據,我們所有的三維呈現必須以數據為基礎,不管是呈現為平面、立面、三維或者其他,都必須有一套唯一的數據,所有我們所有的視圖,只是當前數據的一種表現形式,在其中,就有一個至關重要的對象,用於承載所有的數據和數據的定義,其核心要素就是Autodesk.Revit.DB命名空間下的所有對象,承載所有數據的對象核心就是:“Document”,其對象是Autodesk.Revit.DB.Document,這個對象承載了所有的數據對象,我們看看這些對象主要幾個方法:

可以看出,這個對象由於數據完整,是作為我們數據導入導出的核心對象,我們也可以通過這個document獲取元素、族等對象。
document獲取的方式,在commandData.Application.ActiveUIDocument.Document
2、數據創建對象:Autodesk.Revit.Creation.Document
由於Autodesk.Revit.DB.Document承載着所有的數據,是所有構件顯示的源頭,直接通過API操作DB.Document肯定不合適,數據任意添加,不利於數據的穩定性,在此基礎上,定義了一個Creation.Document的封裝類,用於對DB.Document進行創建操作,這個對象Autodesk.Revit.DB.Document.Create屬性獲取。我們可以看看其常規的屬性定義:

3、Autodesk.Revit.UI.UIDocument
前面兩個對象,無非操作都是數據,但是模型如何呈現,特別基於文檔級別的模型定位、隔離、視圖管理等,基本上無法做到,這里就不得不提UIDocument對象,這個對象是用於對document數據所有呈現的視圖的一個綜合管理,所以對於MVC來說,U就是V層、DB.Document是M層,Creation.Document是C層,共同構建了Revit文檔的一個綜合管理,UIDocument是對顯示的一個管理單元,其控制着所有的視圖對象,我們可以在UIDocument里面找到屬性定義如下:

如圖所示,其包含了document數據對象,包含界面上的選擇對象,也包含了所有的視圖對象,其核心方法GetOpenUIViews能獲取界面上所有的UVView視圖對象。
三、視圖對象
1、數據視圖對象Autodesk.Revit.DB.View
他和DB.Document對象基本一致,是View中數據的一個載體,這個View的數據和DB.Document息息相關和有一些關系,主要看View自身利用的多少,所以View有很多不同的類型,每種類型都有很多自身的特性,對視圖的操作,基本都是在這個View之中。但這些操作只是局限在對視圖中的元素數據進行操作,對視圖的本身的改變就交給另外一個類UIView來實現
2、視圖呈現類Autodesk.Revit.UI.UIView
這個對象是對View的可視化對象,用於在Revit中顯示View中的數據,所有UIView可以縮放、定位等功能,是對於界面層級的操作。
小結,通過以上的分析,我們知道了Revit采用MVC的管理模式,將數據和視圖進行分離,所以View作為一個Element對象,存儲在Document中,所以通過對應的過濾器,能獲取當前文檔的所有視圖:
FilteredElementCollector collector = new FilteredElementCollector(doc); IList<Element> views = collector.OfClass(typeof(View)).ToElements();
UIView視圖,是顯示View的時候才創建,並不是一致都存在,所有的基本原理可以定義如下:
