1. 程式人生 > 實用技巧 >Revit二開---Schemachema擴充套件資料

Revit二開---Schemachema擴充套件資料

一.什麼是Schema

Schema是Revit擴充套件資料的技術關鍵詞,revit到這裡,需要對Revit二開基礎有一定了解。

二.Schema架構

建立revit擴充套件資料第一步是建立Schema(類似建立架構設計,設計Schema儲存結構,類似設計DB 資料表結構),第二步是將擴充套件資料放入Entity,最終儲存的位置在Element。

.程式碼

SchemaMaager

public class SchemaManager
    {
        private static SchemaManager instance;
        
public static SchemaManager Current { get { if(instance == null) instance = new SchemaManager(); return instance; } } protected SchemaManager() { } public Schema CreateSchema(Guid id,string
name,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); } }
View Code

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對應實體類的屬性欄位。