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 ...
随机推荐
- 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:我年龄的立方是个4位数。 我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。” 请你推算一下,他当时到底有多年轻。 结果只有一个数。
#include<stdio.h>int main(){ int age=1; int san=0; int si=0; int sum=0; while(age>0) { san= ...
- OSCP Learning Notes - Buffer Overflows(1)
Introduction to Buffer Overflows Anatomy of Memory Anatomy of the Stack Fuzzing Tools: Vulnserver - ...
- 浅谈服务治理、微服务与Service Mesh(三) Service Mesh与Serverless
作为本系列文章的第三篇(前两篇<浅谈服务治理.微服务与Service Mesh(一)Dubbo的前世今生>,<浅谈服务治理.微服务与Service Mesh(二) Spring Cl ...
- javascript中的设计模式之发布-订阅模式
一.定义 又叫观察者模式,他定义对象间的依照那个一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将的到通知.在javascript中,我们一般用时间模型来替代传统的发布-订阅模式 二 ...
- APP自动化 -- TouchAction(触屏)
- Python源码剖析|百度网盘免费下载|Python新手入门|Python新手学习资料
百度网盘免费下载:Python源码剖析|新手免费领取下载 提取码:g78z 目录 · · · · · · 第0章 Python源码剖析——编译Python0.1 Python总体架构0.2 Pyth ...
- R 数据读取与写入
路径 getwd() #获取当前工作路径 setwd() #设置工作路径 获取普通文本数据 x = read.table("data.txt") #通过路径直接获取 x = rea ...
- webserver 返回json 如何去掉 <string xmlns="http://tempuri.org/">
[WebMethod] public void GetJson(String sJson) { Context.Response.Charset = "UTF-8"; / ...
- 利用div显示隐藏实现的分页效果
实现步骤: 1.创建对应切换div <div class="bottom_daohang"> <div class="bottom_daohang_zo ...
- idea 配置多个tomcat引发的血案
javax.management.InstanceNotFoundException: Catalina:type=Server 修改tomcat端口时却仍是8080 没有使用在idea tomcat ...