扩展数据只能通过编程的方式添加到对象上,通过Revit软件的界面无法添加。这是编程的一个大优势。你可以把任何的数据保存在Revit中的任何一个对象上。你自己的扩展数据始终跟着这个Rvt文件走,不会丢失。而且存储的数据可以设置访问权限。对于保密数据可以只能是你自己的程序读取,或只有具有特殊的开发者代号的程序才能访问。对于数据的保密性非常有帮助。
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiapp = commandData.Application;
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
Autodesk.Revit.DB.View view = doc.ActiveView;
Reference refer = uidoc.Selection.PickObject(ObjectType.Element, "");
Wall wall = doc.GetElement(refer) as Wall;
//创建命名新架构设置权限 添加字段 创建数据对象 对象字段复制 存储到构件内
Transaction tran = new Transaction(doc, "BIM");
tran.Start();
SchemaBuilder bulder = new SchemaBuilder(new Guid("11111111-aaaa-2222-bbbb-333333333333"));
bulder.SetReadAccessLevel(AccessLevel.Public);
bulder.SetWriteAccessLevel(AccessLevel.Public);
bulder.SetSchemaName("WallSocketLocation");
bulder.SetDocumentation("Data store for socket related info in a wall");
FieldBuilder fieldbuilder = bulder.AddSimpleField("SocketLocation", typeof(XYZ));
fieldbuilder.SetUnitType(UnitType.UT_Length);
FieldBuilder fiedbuidler2 = bulder.AddSimpleField("SocketNumber", typeof(string));
Schema schema = bulder.Finish();
Entity ent = new Entity(schema);
Field socketLocation = schema.GetField("SocketLocation");
ent.Set(socketLocation, new XYZ(2, 0, 0), DisplayUnitType.DUT_METERS);
Field socketNumber = schema.GetField("SocketNumber");
ent.Set(socketNumber, wall.Name);
wall.SetEntity(ent);
tran.Commit();
//取出存储的string字符串
IList<Guid> listGuid = wall.GetEntitySchemaGuids();
Schema sa = Schema.Lookup(listGuid[0]);
Entity entity = wall.GetEntity(sa);
string str = entity.Get<string>(sa.GetField("SocketNumber"));
//读取项目中所有的架构
IList<Schema> ourSchema = Schema.ListSchemas();
foreach (Schema sch in ourSchema)
{
string name = sch.SchemaName;
IList<Field> fields = sch.ListFields();
foreach (Field f in fields)
{
string filedName = f.FieldName;
}
}
return Result.Succeeded;
}