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 ...
随机推荐
- jsp中获取路径信息的方法
今天在看代码时,发现程序使用了 request.getScheme() .不明白是什么意思,查了一下.结果整理如下: 1.request.getScheme() 返回当前链接使用的协议:一般应用返回h ...
- 盘点JMeter不为人知那一些细节
Jmeter工作原理 向服务器提交请求,并从服务器取回请求返回的结果.即建立一个线程池,多线程运行取样器产生大量负载,在运行过程中通过断言来验证结果的正确性,通过监听器来记录测试结果. 文章内容以Jm ...
- Burp Suite Intruder Module - 攻击模块
参考链接:https://portswigger.net/burp/documentation/desktop/tools/intruder/using 主要思路:在Intruder模块下设定Targ ...
- Python 中的面向对象编程
面向对象编程(Object-oriented programming, OOP)是一种基于对象概念的编程范式,可包含属性(attribute)形式的数据以及方法(method)形式的代码.另一种对 O ...
- Html笔试复习
掌握学习技巧,提高学习质量 学习目标:熟练掌握Html笔试复习题 已掌握目标:Html笔试复习题掌握95% 未完成目标:个别题因粗心造成错误,因选项意思不懂出错 解决方案:了解原因,因错出方案,充分利 ...
- vue组件库用markdown生成文档
前言: 开发vue组件库需要提供组件的使用文档,最好是有渲染到浏览器的demo实例,既能操作又能查看源代码.markdown作为常用的文档编写载体,如果能在里面直接写vue组件,同时编写使用说明就再好 ...
- Linux 终端最全推荐(建议收藏)
本文来自网络整理,如有侵权,则可删除. 如果你跟我一样,整天要花大量的时间使用Linux命令行,而且正在寻找一些可替代系统自带的老旧且乏味的终端软件,那你真是找对了文章.我这里搜集了一些非常有趣的终端 ...
- ES的集群原理
文章转载自:https://www.cnblogs.com/soft2018/p/10213266.html 一.ES集群原理 查看集群健康状况:URL+ /GET _cat/health (1).E ...
- SQL语法分类
数据查询 语法格式 : select [ , ...] from table_reference [ , ...] 去重复值 distinct关键字 , 从select结果集中删除所有重复的行,使结果 ...
- linux cp 拷贝不覆盖源文件
cp 参数 CP() User Commands CP() NAME cp - copy files and directories SYNOPSIS cp [OPTION]... [-T] SOUR ...