【Revit二次开发】模型中存储数据——参数和外部存储(Parameter, Schema and Entity)
模型中存储数据
- 参数
- 读取
- 写入
- 外部存储
- Schema
- Entity
- 快速获取外部存储参数
参数
在Revit平台API中,每个图元对象都有参数属性,它是隶属于图元所有属性的集合,在此集合中更改属性值。
- 每个图元的参数都有一个与之关联的ElementId类型的ID
- 大多数参数是Revit内置的
- 还有一部分是存储在硬盘外部共享参数文件的共享参数
Revit API中参数相关的类
- Autodesk.Revit.Parameters.BuiltInParameter枚举:Revit内建参数枚举
- Parameter类: 参数
- Defination类:参数定义类
- ParameterType枚举: 参数类型枚举
通过Lookup获取参数,点击Parameter得到该元素所有参数
选择你想获取的参数,然后点击Definition
读取
e.Parameters
e.GetParameters(string name)
e.get_Parameter(BuiltInParameter parameterId)
e.LookupParameter(string name)
写入
判断该参数是否是ReadOnly (p.IsReadOnly)
判断该参数交互时是否可修改(p.UserModifiable)
判断该参数的StorageType
将要写入该参数的值转换为相应的数据类型,然后Set().
外部存储
Revit API允许创建Schema类数据结构并将它们的实例附着到Revit模型中的任何Element。
Revit API中外部存储相关的类
Sechema:数据结构
SchemaBuilder:数据架构编辑器
Field:字段
FieldBuilder:字段编辑器
Entity:数据实体
Schema
using Autodesk.Revit.UI;
using System;
using System.IO;
using System.Linq;
using Autodesk.Revit.DB;
using System.Collections.Generic;namespace ParameterBasicDemo
{[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]public class CreateSharedParameterCmd : IExternalCommand{public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){try{string dllLocation = string.Empty;string sharedFile = string.Empty;dllLocation = "D:\\";sharedFile = Path.Combine(dllLocation, "SharedParameters.txt");//需要文件存在commandData.Application.Application.SharedParametersFilename = sharedFile;DefinitionFile defFile = null;defFile = commandData.Application.Application.OpenSharedParameterFile();using (Transaction tran = new Transaction(commandData.Application.ActiveUIDocument.Document)){tran.Start("创建共享参数");try{// 创建、获得共享参数DefinitionGroup defGroup = defFile.Groups.Create("BasicDemo");Definition def = defGroup.Definitions.get_Item("BasicDemoId");ExternalDefinitionCreationOptions edcOpt = new ExternalDefinitionCreationOptions("BasicDemoId", ParameterType.Text);//高版本不能用ParameterType要用ForgeTypeId(在SpecTypeId类中)if (null == def){def = defGroup.Definitions.Create(edcOpt);}// 获得墙类别集合CategorySet cs = new CategorySet();Category wallCategory =commandData.Application.ActiveUIDocument.Document.Settings.Categories.get_Item(BuiltInCategory.OST_Walls);cs.Insert(wallCategory);// 实例绑定InstanceBinding instBd = commandData.Application.Application.Create.NewInstanceBinding(cs);commandData.Application.ActiveUIDocument.Document.ParameterBindings.Insert(def, instBd);if (TransactionStatus.Committed != tran.Commit()){TaskDialog.Show("共享参数", "事务提交失败!");}}catch{tran.RollBack();throw;}}return Autodesk.Revit.UI.Result.Succeeded;}catch (Exception ex){message = ex.Message;return Autodesk.Revit.UI.Result.Failed;}}}
}
Entity
using System;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.ExtensibleStorage;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;namespace ParameterBasicDemo
{[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]public class WallExternalStorageCmd : IExternalCommand{public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){try{UIDocument uidoc = commandData.Application.ActiveUIDocument;Wall wall = PickWall(uidoc);StoreDataInWall(wall, XYZ.Zero);return Autodesk.Revit.UI.Result.Succeeded;}catch (Exception ex){message = ex.Message;return Autodesk.Revit.UI.Result.Failed;}}private Wall PickWall(UIDocument uidoc){Wall wall = null;while (null == wall){Reference reference = uidoc.Selection.PickObject(ObjectType.Element);wall = uidoc.Document.GetElement(reference.ElementId) as Wall;}return wall;}//创建一个数据结构,将其附加到墙上,用数据填充它,然后从墙上检索数据void StoreDataInWall(Wall wall, XYZ dataToStore){using (Transaction createSchemaAndStoreData = new Transaction(wall.Document, "tCreateAndStore")){createSchemaAndStoreData.Start();SchemaBuilder schemaBuilder = new SchemaBuilder(new Guid("720080CB-DA99-40DC-9415-E53F280AA1F0"));schemaBuilder.SetReadAccessLevel(AccessLevel.Public); // 读权限:所有用户 schemaBuilder.SetWriteAccessLevel(AccessLevel.Vendor); // 可写权限:发行商schemaBuilder.SetVendorId("ADSK"); // 必须,由于可写权限为VendorschemaBuilder.SetSchemaName("WireSpliceLocation");FieldBuilder fieldBuilder = schemaBuilder.AddSimpleField("WireSpliceLocation", typeof(XYZ)); // create a field to store an XYZfieldBuilder.SetSpec(SpecTypeId.Length);fieldBuilder.SetDocumentation("A stored location value representing a wiring splice in a wall.");Schema schema = schemaBuilder.Finish(); // 注册外部存储的数据结构Entity entity = new Entity(schema); // 创建该数据结构类型的数据实体Field fieldSpliceLocation = schema.GetField("WireSpliceLocation"); // 获得数据结构的字段entity.Set<XYZ>(fieldSpliceLocation, dataToStore, UnitTypeId.Meters); // 设置数据实体的指定字段的值wall.SetEntity(entity); // 存储数据实体到墙元素// 读取墙上的外部数据Entity retrievedEntity = wall.GetEntity(schema);XYZ retrievedData = retrievedEntity.Get<XYZ>(schema.GetField("WireSpliceLocation"), UnitTypeId.Meters);createSchemaAndStoreData.Commit();}}}
}
快速获取外部存储参数
方法1
在LookUp上获取所需的外部存储的guid,得到schema,再得到entity,然后通过get方法输入参数的名称得到参数的值
Schema schema = Schema.Lookup(new Guid("{*****************}"));
Entity entity = ele.GetEntity(schema);
string data = entity.Get<string>(schema.GetField("id"));
方法2
string data = null;IList<Guid> listGuids = ele.GetEntitySchemaGuids().ToList();foreach (Guid guid in listGuids){Schema schema = Schema.Lookup(guid);if (schema.SchemaName == "schema名称"){Entity entity = ele.GetEntity(schema);data = entity.Get<string>(schema.GetField("参数名称"));}}
【Revit二次开发】模型中存储数据——参数和外部存储(Parameter, Schema and Entity)相关推荐
- revit 二次开发 模型线读取
目前只能读取模型线长度,闭合的区域读不到面积 UIApplication uiapp = commandData.Application;UIDocument uidoc = uiapp.Active ...
- Revit二次开发之管道避让
管道翻弯避避让 本项目实现了管道碰撞的时候跳跃或者翻弯的方式实现避让的功能.废话不多说,直接上代码 这个Command类是项目的主要类. using System; using System.Coll ...
- Revit二次开发——扩展存储
Revit二次开发--扩展存储 在revitAPI中,提供了Extensible Storage framework,可以使开发者将需要存储的数据存到Revit的rvt文件中, 扩展的数据始终跟 ...
- Revit二次开发——不启动Revit,做rvt文件数据导出
Revit二次开发--不启动Revit,做rvt文件数据导出 Node.js部分 调用C#端供外部调用的dll C#部分 调用RevitNet.dll,做数据导出exe 做外部调用dll 总结 Nod ...
- Revit二次开发 如何获得链接CAD中所有的多段线PolyLine?
项目场景: 最近做的这个项目,涉及到提取链接CAD中的所有多段线,并根据这些多段线的几何信息做一些分析,但是产生了一些意想不到的问题. 问题描述 通过网上流传的提取手段,并不能完全提取CAD中的所有多 ...
- Revit二次开发——引用dynamo中的几何库
前沿 dynamo的几何库其实是非常强大的,如果自己靠着RevitAPI去写还是非常费劲的.所以想引用dynamo的几何库来做一些工作.主要参考的就是这篇文章.Revit二次开发--不开启Dynamo ...
- Revit二次开发 获取模型截面线、截面轮廓
描述 获取Revit模型的截面线.横切面线.截面轮廓. 用途 用于获取模型的截面线.横切面线.截面轮廓. 实现方式 创建视图平面: 从视图平面获取轮廓线: 获取平面标高处的截面线. 效果 示例 /// ...
- 【Revit二次开发】“附加模块”中添加“外部工具”AND外部工具中添加新建插件
写在前面,今天第一次接触Revit二次开发,要做的两件事情 第一,搭建环境(安装的是破解版2017的Revit软件.下载SDK2017的并安装.还有开发平台VS2015). 第二,首先就是运行Hell ...
- Revit二次开发选择模型面生成新的三维视图
觉得自己做的一些Revit二次开发的项目经验需要找个地方保存下来,不然以后碰到类似的又得去冲浪捞人家的结晶再整合,所以从今天起开始写CSDN博客啦 选择模型面生成新的三维视图 废话不多说,直接上代码! ...
最新文章
- Linux LVM硬盘管理及LVM扩容
- [数据结构]-散列表(哈希表)
- lighttpd缓存配置
- python逐行读取文件内容的三种方法
- Matplotlib的画图的补充(Matplotlib的疑难杂症)
- gridview databind 会导致页面刷新马_Innodb批量页面刷盘情况下的quot;两次写quot;
- 李飞飞团队发布:中国AI期刊影响力首超美国
- MySQL -- binlog 操作与恢复
- 怎样获取UIWebView 的文字的高度
- 【pygame游戏编程】第四篇-----打字测速游戏
- IO-同步、异步、阻塞、非阻塞
- 英文版-Plan9汇编器-A Manual for the Plan 9 assembler
- python局域网大文件_利用Python+pyftpdlib实现在局域网中互传文件
- 清华大学杨殿阁 深度解读《汽车数据安全管理若干规定(征求意见稿)》
- “中国保险IT应用高峰论坛2009”现场实录
- SpringSecurity-基于微服务的认证与权限访问
- 命令启动edge浏览器且全屏
- D3.js入门基础教程
- 成都速领科技:店铺数据要看哪些
- Linux下使用AppImageLauncher安装AppImage文件