一.什么是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);
} }

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 });
}
}

测试代码:

  //扩展数据测试
[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;
}
}

         代码架构:

               

源代码下载:

            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对应实体类的属性字段。

      

Revit二开---Schemachema扩展数据的更多相关文章

  1. Revit二次开发——非模态窗口的事件处理

    一.起因    自己在写revit二开时,有一个Winform窗体按钮点击事件需要 触发调用事务进行处理,结果出现“异常“Starting a transaction from an external ...

  2. AutoCAD.NET二次开发:扩展数据之XData

    结果缓存——ResultBuffer 结果缓存即 Autodesk.AutoCAD.DatabaseServices.ResultBuffer 类型,使用 ResultBuffer 对象时需要提供一个 ...

  3. ecshop二次开发系统缓存优化之扩展数据缓存的必要性与方法

    1.扩展数据缓存的必要性 大家都知道ecshop系统使用的是静态模板缓存,在后台可以设置静态模板的缓存时间,只要缓存不过期,用户访问页面就相当于访问静态页面,速度可想而知,看似非常完美,但是ecsho ...

  4. 还在写SQL做SAP二开?通过RFC调用NetWeaver,让HANA数据库操作更可靠

    相比于从零开始构建全套信息化系统,基于成熟的ERP等行业软件做二次开发是更多中大型企业应对个性化软件需求的首选方案.如何在二开模块中,可靠地对成品软件的数据库进行读写操作,以满足单据自动创建.元数据自 ...

  5. NC57,NC63-NC二开经验总结

    版主2010级市场营销专业本科生 2013年8月入达内培训Java相关技术 12月入职,做用友NC的二次开发工作 2015年4月离职,4中下旬入职一家互联网金融企业 下面是做NC二开期间积累的一些常用 ...

  6. Revit二次开发-BIM模型导出

    最近一个月一直在研究Revit二次开发-BIM模型的导出,在网上找了很多相关资料学习.下面简单介绍一下我最近做的这个BIM模型的导出功能. 开始尝试使用Revit2015的样例程序里提供的读取模型几何 ...

  7. 【NFS项目实战二】NFS共享数据的时时同步推送备份

    [NFS项目实战二]NFS共享数据的时时同步推送备份 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品, ...

  8. Revit二次开发初体验

    最近换了下工作,由之前的互联网企业转入了BIM软件开发行列.具体原因不多说,作为一个程序员来说学习永无止境.下面来一个Hello World体验下Revit的二次开发 事前准备 VS Revit 20 ...

  9. Odoo:全球第一免费开源ERP库龄表的简单实现方法(无需二开)

    问题背景 希望查看库龄超过30天的货物,该如何实现?此种简单数据查询需要二开吗? 解决方案 方法一:Stock Quant列表视图增加过滤器 <filter string="库龄超30 ...

随机推荐

  1. 【其他-小技巧-Uipath】VB语法操作DataTable分组并求和

    需要对DataTable分组求和的语法:VB.net 和C#中还有点不太一样.最后试了好多方法,要这么写 我的dataTabel数据: (From p In dataTabel.AsEnumerabl ...

  2. Spring用到了那些注解?

    一:@Autowired(按类型注入)1.1通过 @Autowired的使用来消除 set ,get方法.@Autowiredprivate Dao dao;这样就可以删除set ,get方法和spr ...

  3. OSCP Learning Notes - Exploit(5)

    Java Applet Attacks Download virtual machines from the following website: https://developer.microsof ...

  4. 关于Object.defineProperty

    讲解大致会根据下图展开     本文部分参考了书籍<你不知道的javascript>上卷 对象的定义与赋值 经常使用的定义与赋值方法obj.prop =value或者obj['prop'] ...

  5. 设计模式:state模式

    核心: 把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化 例子: class State //状态接口 { public: virtual void show() = 0; ...

  6. abp vnext 开发快速入门 4 跨域设置

    由于项目采用的微服务框架,前端与后端交互难免有跨域的问题.abp vnext实现跨域也很简单,只需要设置几处就可以了,这里只讲全局的跨域,至于局部的Action如何跨域请自行搜索.netcore 跨域 ...

  7. 如何获取json某一级节点的数据

    如何获取json某一级节点的数据 最近做项目有获取和设置固定格式某一级节点值的需求.但是要一级一级地取对于多级的结构来说代码过于冗余且重复,于是写了个递归的方法根据json路径完成值的定点操作.废话不 ...

  8. 2Ants(独立,一个个判,弹性碰撞,想象)

    AntsDescriptionAn army of ants walk on a horizontal pole of length l cm, each with a constant speed ...

  9. python爬虫实践——爬取“梨视频”

    一.爬虫的基本过程: 1.发送请求(请求库:request,selenium) 2.获取响应数据()服务器返回 3.解析并提取数据(解析库:re,BeautifulSoup,Xpath) 4.保存数据 ...

  10. Spring Date JPA实现增删改查

    1.新建一个Cart类 package com.entity; public class Cart { private int id; private int userId; private int ...