zoukankan      html  css  js  c++  java
  • Revit二次开发 Revit扩展存储数据

            Revit二次开发过程中,需要将相关信息存储到RVT文件中,再次打开RVT的时候,可以通过读取这些信息,知道当前构件的基本状态,或者将一个特殊的信息存储到RVT文件中,从Revit2012开始引入了扩展存储这个新技术,就是可以把一些数据存储在Revit中的某一个对象上。且这个存储操作,只能通过编程实现,无法通过Revit的软件操作实现。这个大大增加了我们数据存储的优势,可以把任何的数据保存在Revit中的任何一个对象上,数据始终跟着这个Rvt文件走,不会丢失。 而且存储的数据可以设置访问权限。对于保密数据可以只能是你自己的程序读取,或只有具有特殊的开发者代号的程序才能访问,对于数据的保密性非常有帮助。

          1、要实现Revit的数据存储,需了解几个常用的类Schema(框架)、Entity(实体)、Field(字段)、DataStorage(存储对象) 等。其之间的关系如下图所示:

       画图理解为:

        

    Schema用于定义架构和身份,就像造手机,贴个品牌,建一个外壳和内部架构,然后Entity则通过架构填充自己需要的内容,最后存储到Element中去。每个Element只允许存储一个带同一个Schema的Entity,如果再次写入就覆盖,这个很好理解。

    对于Revit对象来说,只要继承自Element对象的子类,就具有SetEntity方法,可以将一个Entity实体对象存储到Element元素对象之中。   

    //存储实体对象到Element之中
    public void SetEntity(
        Entity entity
    )
    //从Element对象中获取实体
    public Entity GetEntity(
        Schema schema
    )

    Schema对象的属性定义:

    public Guid GUID { get; }
    public AccessLevel ReadAccessLevel { get; }
    public AccessLevel WriteAccessLevel { get; }
    public string VendorId { get; }
    public string SchemaName { get; }
    public Field GetField(string name);
    public bool WriteAccessGranted();

    Entity对象的常用方法说明:

     public FieldType Get<FieldType>(Field field);
     public FieldType Get<FieldType>(string fieldName, DisplayUnitType displayUnits);
     public FieldType Get<FieldType>(Field field, DisplayUnitType displayUnits);
     public FieldType Get<FieldType>(string fieldName);
     public void Set<FieldType>(string fieldName, FieldType value);
     public void Set<FieldType>(Field field, FieldType value, DisplayUnitType displayUnits);
     public void Set<FieldType>(string fieldName, FieldType value, DisplayUnitType displayUnits);
     public void Set<FieldType>(Field field, FieldType value)

    Field常用属性定义如下:

    public Type ValueType { get; }
    public Type KeyType { get; }
    public string FieldName { get; }
    public bool IsValidObject { get; }
    public Schema Schema { get; }

    其基本如下:一个Element只能保存一个(Schema框架)下面的实体,假如重复保存则会覆盖原来数据。

    2、DataStorage其实就是一个Element对象,其可以创建多个,我们不像将数据保存在任何元素之上,则可以存储在DataStorage,好处就是他不随着任何元素的删除而被删除。

    3、我们可以通过两个创建类,实现所有对象的定义,如SchemaBuilder和FiledBuilder两个类,其代码实例如下:

    UIApplication uiapp = commandData.Application;
    UIDocument uidoc = commandData.Application.ActiveUIDocument;
    Document doc = uidoc.Document;
    Autodesk.Revit.DB.View view = doc.ActiveView;
    Transaction tran = new Transaction(doc, "存储");
    tran.Start();
    DataStorage store = DataStorage.Create(doc);
    SchemaBuilder schemabulder = new SchemaBuilder(new Guid(System.Guid.NewGuid().ToString("D")));
    schemabulder.SetReadAccessLevel(AccessLevel.Public);
    schemabulder.SetWriteAccessLevel(AccessLevel.Public);
    schemabulder.SetSchemaName("LeiFile");
    schemabulder.SetDocumentation("DataStorageFile");
    FieldBuilder fiedBuilder = schemabulder.AddArrayField("data", typeof(byte));
    fiedBuilder.SetDocumentation("Store file data");
    Schema schema = schemabulder.Finish();
    string data="存储的数据";
    Entity entity = new Entity(schema);
    Field field = schema.GetField("data");
    entity.Set(IList(byte))(field, data);
    store.SetEntity(entity);
    tran.Commit();
    DataStorage storage = new FilteredElementCollector(doc).OfClass(typeof(DataStorage)).Cast(DataStorage)().First(); 
    Schema sch = Schema.ListSchemas().Where(o => o.SchemaName == "LeiFile").First();
    return Result.Succeeded;
  • 相关阅读:
    webim-界面细节调整
    使用PHP得到所有的HTTP请求头_还有应答头
    Bootstrap学习的点点滴滴
    asterisk中eyebeam与移动的IMS帐号对接
    总结Ajax跨域调用问题
    Spring【基础】-注解-转载
    Spring-【高阶】注解-转载
    让你的IDEA倍爽
    IDEA的git密码修改
    Idea设置签名
  • 原文地址:https://www.cnblogs.com/minhost/p/12660306.html
Copyright © 2011-2022 走看看