Revit二開---Schemachema擴充套件資料
阿新 • • 發佈:2020-08-11
一.什麼是Schema
Schema是Revit擴充套件資料的技術關鍵詞,revit到這裡,需要對Revit二開基礎有一定了解。
二.Schema架構
建立revit擴充套件資料第一步是建立Schema(類似建立架構設計,設計Schema儲存結構,類似設計DB 資料表結構),第二步是將擴充套件資料放入Entity,最終儲存的位置在Element。
三.程式碼
SchemaMaager
public class SchemaManager { private static SchemaManager instance;View Codepublic static SchemaManager Current { get { if(instance == null) instance = new SchemaManager(); return instance; } } protected SchemaManager() { } public Schema CreateSchema(Guid id,stringname,string documentation,AccessLevel readAccessLevel,AccessLevel writeAccessLevel, string[] fieldNames,string vendorID = "ADSK") { if (GetSchema(id) != null) return GetSchema(id); SchemaBuilder schemaBuilder = new SchemaBuilder(id); schemaBuilder.SetSchemaName(name); schemaBuilder.SetDocumentation(documentation); schemaBuilder.SetReadAccessLevel(readAccessLevel); schemaBuilder.SetWriteAccessLevel(writeAccessLevel); schemaBuilder.SetVendorId(vendorID);foreach(var fieldName in fieldNames) { schemaBuilder.AddSimpleField(fieldName, typeof(string)); } return schemaBuilder.Finish(); } public Schema GetSchema(Guid id) { return Schema.Lookup(id); } public void SetEntity<T>(Element element,Guid schemaId,string fieldName,T data) { Entity ent = element.GetEntity(GetSchema(schemaId)); if (ent.Schema == null) ent = new Entity(schemaId); ent.Set(fieldName, JsonConvert.SerializeObject(data)); element.SetEntity(ent); } public void SetEntity(Element element, Guid schemaId, string fieldName, string data) { Entity ent = element.GetEntity(GetSchema(schemaId)); if (ent.Schema == null) ent = new Entity(schemaId); ent.Set(fieldName, data); element.SetEntity(ent); } }
SchemaCreater
public class SchemaCreater { public static void CreateSchemaOfID() { SchemaManager.Current.CreateSchema(SchemaIds.IDData, "Schema_ID", "Schema id data", Autodesk.Revit.DB.ExtensibleStorage.AccessLevel.Public, Autodesk.Revit.DB.ExtensibleStorage.AccessLevel.Vendor, new string[] {SchemaFields.JackExt }); } }View Code
測試程式碼:
//擴充套件資料測試 [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)] public class SchemaDataTest : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Document doc = commandData.Application.ActiveUIDocument.Document; SchemaData.SchemaCreater.CreateSchemaOfID(); //建立Schema Wall wall = WallHelper.CreateWall(commandData); UIDocument uiDocument = commandData.Application.ActiveUIDocument; if (wall != null) { using (Transaction trans = new Transaction(doc)) { trans.Start("jack"); SchemaData.SchemaManager.Current.SetEntity(wall, SchemaIds.IDData, SchemaFields.JackExt, "jack_e920572f-ba66-4af8-99d6-498d97fe0bfe"); trans.Commit(); } return Result.Succeeded; } else return Result.Failed; } }View Code
程式碼架構:
原始碼下載:
https://files.cnblogs.com/files/xiaowangzi1987/RevitTestPro.rar
三.注意
1.建立Schema不需要開啟事務
2.當writeAccessLevel或readAccessLevel為Vendor的時候,vendorId必須與Addin檔案中的VendorId保持一致,否則會沒有寫(讀)擴充套件資料的許可權,並丟擲異常;
3.一個Entity可以有多個Schema,一個Schema可以有多個Field 。
如果有一個實體類需要存為擴充套件資料,方法一:建立一個Field,將實體類JSON序列化,儲存字串。 方法二:建立多個Field,一個Field對應實體類的屬性欄位。 方法三:建立多個Schema,一個Schema建一個Field,一個Field對應實體類的屬性欄位。