zoukankan      html  css  js  c++  java
  • Revit二次开发之十七 深入解析Revit界面

    在revit中,有UIApplicationApplicationUIControlApplication,他们到底有什么区别和之间的联系,一直是我比较迷惑的问题,在深入了解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的时候才创建,并不是一致都存在,所有的基本原理可以定义如下:

  • 相关阅读:
    Oracle数据库中心双活之道:ASM vs VPLEX
    使用Visual C ++和Open Folder自定义环境
    HDU 2563 统计问题(递归,思维题)
    彻底搞定C语言指针(精华版)
    HDU 1000 A + B Problem(指针版)
    图的基本算法(BFS和DFS)
    HDU 1312 Red and Black(DFS,板子题,详解,零基础教你代码实现DFS)
    C语言求最小公倍数和最大公约数三种算法(经典)
    HDU 2504 又见GCD(最大公约数与最小公倍数变形题)
    HDU 2502 月之数(二进制,规律)
  • 原文地址:https://www.cnblogs.com/minhost/p/12108322.html
Copyright © 2011-2022 走看看