Revit二次开发之十七 深入解析Revit界面

在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的时候才创建,并不是一致都存在,所有的基本原理可以定义如下:

 

posted @ 2019-12-27 20:30  Min.Xiaoshuang  阅读(2442)  评论(0编辑  收藏  举报