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;

 

posted @ 2020-04-08 15:38  Min.Xiaoshuang  阅读(2565)  评论(0编辑  收藏  举报