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);
} }
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扩展数据的更多相关文章
- Revit二次开发——非模态窗口的事件处理
一.起因 自己在写revit二开时,有一个Winform窗体按钮点击事件需要 触发调用事务进行处理,结果出现“异常“Starting a transaction from an external ...
- AutoCAD.NET二次开发:扩展数据之XData
结果缓存——ResultBuffer 结果缓存即 Autodesk.AutoCAD.DatabaseServices.ResultBuffer 类型,使用 ResultBuffer 对象时需要提供一个 ...
- ecshop二次开发系统缓存优化之扩展数据缓存的必要性与方法
1.扩展数据缓存的必要性 大家都知道ecshop系统使用的是静态模板缓存,在后台可以设置静态模板的缓存时间,只要缓存不过期,用户访问页面就相当于访问静态页面,速度可想而知,看似非常完美,但是ecsho ...
- 还在写SQL做SAP二开?通过RFC调用NetWeaver,让HANA数据库操作更可靠
相比于从零开始构建全套信息化系统,基于成熟的ERP等行业软件做二次开发是更多中大型企业应对个性化软件需求的首选方案.如何在二开模块中,可靠地对成品软件的数据库进行读写操作,以满足单据自动创建.元数据自 ...
- NC57,NC63-NC二开经验总结
版主2010级市场营销专业本科生 2013年8月入达内培训Java相关技术 12月入职,做用友NC的二次开发工作 2015年4月离职,4中下旬入职一家互联网金融企业 下面是做NC二开期间积累的一些常用 ...
- Revit二次开发-BIM模型导出
最近一个月一直在研究Revit二次开发-BIM模型的导出,在网上找了很多相关资料学习.下面简单介绍一下我最近做的这个BIM模型的导出功能. 开始尝试使用Revit2015的样例程序里提供的读取模型几何 ...
- 【NFS项目实战二】NFS共享数据的时时同步推送备份
[NFS项目实战二]NFS共享数据的时时同步推送备份 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品, ...
- Revit二次开发初体验
最近换了下工作,由之前的互联网企业转入了BIM软件开发行列.具体原因不多说,作为一个程序员来说学习永无止境.下面来一个Hello World体验下Revit的二次开发 事前准备 VS Revit 20 ...
- Odoo:全球第一免费开源ERP库龄表的简单实现方法(无需二开)
问题背景 希望查看库龄超过30天的货物,该如何实现?此种简单数据查询需要二开吗? 解决方案 方法一:Stock Quant列表视图增加过滤器 <filter string="库龄超30 ...
随机推荐
- Python Ethical Hacking - KEYLOGGER(2)
Report function: Run in the background. Don't interrupt program execution. Every X seconds, send the ...
- 将终结点图添加到你的ASP.NET Core应用程序中
在本文中,我将展示如何使用DfaGraphWriter服务在ASP.NET Core 3.0应用程序中可视化你的终结点路由.上面文章我向您演示了如何生成一个有向图(如我上篇文章中所示),可以使用Gra ...
- 【计网】图解HTTP常见知识点总结
目录 目录 目录 初识TCP/IP TCP/IP协议族4层模型 初识HTTP 请求和响应 HTTP报文 HTTP状态码 HTTP报文首部 其他的首部字段 确保WEB安全的HTTPS HTTPS工作原理 ...
- 跳过Google开机设置/验证/向导
Google 的开机设置向导,亦或称作开机验证,对于刷机党来说最熟悉不过了.一般情况下,刷类原生或是原生系统,再刷 Gapps,开机就需要进行一些 Google 验证.这些验证,与国内的手机厂商所设置 ...
- 设计模式:interpreter模式
理解:可以广义的理解为创造一种语言,实现该语言的解释器,然后用创造的语言编写程序 对比:如xml就是一种语言,解析xml的代码就是解释器 例子: //目标:定义4中几种命令,使用C++解析 //如下: ...
- 手动造轮子——为Ocelot集成Nacos注册中心
前言 近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题.我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证.授权.熔断. ...
- Java继承多态
一. 父类引用指向子类对象父类名(接口名) 对象名=new 子类(接口)名称() 二. 父子继承关系中,成员变量重名1.直接通过子类对象访问成员变量 =左边是谁,就优先用谁2.间接通过成员方法访问成员 ...
- Python 实现将numpy中的nan和inf,nan替换成对应的均值
nan:not a number inf:infinity;正无穷 numpy中的nan和inf都是float类型 t!=t 返回bool类型的数组(矩阵) np.count_nonzero( ...
- 利用74HC595实现的流水灯 Arduino
int big = 2; int push = 3; int datain = 4; void setup() { Serial.begin(9600); pinMode(big, OUTPUT); ...
- Mybatis(四)多表操作
数据库如下: 一.创建数据库所对应的bean类 public class User { private Integer uId; private String username; private St ...