【转】Revit二次开发——读取cad中的文字信息
Revit读取cad的文字信息需要借助Teigha的开源dll,在程序中添加下图中红色框的dll文件的引用,其他的dll文件全部放在同一个文件夹中即可,运行的时候,会自动把这些dll文件全部复制到bin文件当中,同时,在Revit中运行插件,Revit也会自动加载这些dll文件。
以下是关键方法,在Revit里读取cad文字信息,图层信息,几何信息等。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using CreatBridgeForRevit2018.ElementsSelect;
using CreatBridgeForRevit2018.Filter;
using Teigha.Runtime;
using Teigha.DatabaseServices;
using System.IO;
using System.Collections;
using Teigha.Geometry; namespace CreatBridgeForRevit2018.ReadCAD
{
class ReadCADUtils
{
/// <summary>
/// 取得链接cad的路径
/// </summary>
/// <param name="cadLinkTypeID"></param>
/// <param name="revitDoc"></param>
/// <returns></returns>
public string GetCADPath(ElementId cadLinkTypeID,Document revitDoc)
{
CADLinkType cadLinkType = revitDoc.GetElement(cadLinkTypeID) as CADLinkType;
return ModelPathUtils.ConvertModelPathToUserVisiblePath(cadLinkType.GetExternalFileReference().GetAbsolutePath());
} /// <summary>
/// 取得CAD的文字信息
/// </summary>
/// <param name="dwgFile"></param>
/// <returns></returns>
public List<CADTextModel> GetCADTextInfo(string dwgFile)
{
List<CADTextModel> listCADModels = new List<CADTextModel>();
using (new Services())
{
using (Database database = new Database(false, false))
{
database.ReadDwgFile(dwgFile, FileShare.Read, true, "");
using (var trans = database.TransactionManager.StartTransaction())
{
using (BlockTable table = (BlockTable)database.BlockTableId.GetObject(OpenMode.ForRead))
{
using (SymbolTableEnumerator enumerator = table.GetEnumerator())
{
StringBuilder sb = new StringBuilder();
while (enumerator.MoveNext())
{
using (BlockTableRecord record = (BlockTableRecord)enumerator.Current.GetObject(OpenMode.ForRead))
{ foreach (ObjectId id in record)
{
Entity entity = (Entity)id.GetObject(OpenMode.ForRead, false, false);
CADTextModel model = new CADTextModel();
switch (entity.GetRXClass().Name)
{
case "AcDbText":
Teigha.DatabaseServices.DBText text = (Teigha.DatabaseServices.DBText)entity;
model.Location = ConverCADPointToRevitPoint(text.Position);
model.Text = text.TextString;
model.Angel = text.Rotation;
model.Layer = text.Layer;
listCADModels.Add(model);
break;
case "AcDbMText":
Teigha.DatabaseServices.MText mText = (Teigha.DatabaseServices.MText)entity;
model.Location = ConverCADPointToRevitPoint(mText.Location);
model.Text = mText.Text;
model.Angel = mText.Rotation;
model.Layer = mText.Layer;
listCADModels.Add(model);
break;
}
}
}
} }
}
}
}
}
return listCADModels;
} /// <summary>
/// 取得cad的图层名称
/// </summary>
/// <param name="dwgFile"></param>
/// <returns></returns>
public IList<string> GetLayerName(string dwgFile)
{
IList<string> cadLayerNames = new List<string>();
using (new Services())
{
using (Database database = new Database(false, false))
{
database.ReadDwgFile(dwgFile, FileShare.Read, true, "");
using (var trans = database.TransactionManager.StartTransaction())
{
using (LayerTable lt = (LayerTable)trans.GetObject(database.LayerTableId, OpenMode.ForRead))
{
foreach (ObjectId id in lt)
{
LayerTableRecord ltr = (LayerTableRecord)trans.GetObject(id, OpenMode.ForRead);
cadLayerNames.Add(ltr.Name);
}
}
trans.Commit();
}
}
}
return cadLayerNames;
} /// <summary>
/// 取得CAD里的线,包括直线、多段线、圆曲线
/// </summary>
/// <param name="dwgFile"></param>
/// <returns></returns>
public List<CADGeometryModel> GetCADCurves(string dwgFile)
{
List<CADGeometryModel> listCADModels = new List<CADGeometryModel>();
using (new Services())
{
using (Database database = new Database(false, false))
{
database.ReadDwgFile(dwgFile, FileShare.Read, true, "");
using (var trans = database.TransactionManager.StartTransaction())
{
using (BlockTable table = (BlockTable)database.BlockTableId.GetObject(OpenMode.ForRead))
{
using (SymbolTableEnumerator enumerator = table.GetEnumerator())
{
StringBuilder sb = new StringBuilder();
while (enumerator.MoveNext())
{
using (BlockTableRecord record = (BlockTableRecord)enumerator.Current.GetObject(OpenMode.ForRead))
{ foreach (ObjectId id in record)
{
Entity entity = (Entity)id.GetObject(OpenMode.ForRead, false, false);
CADGeometryModel geoModel = new CADGeometryModel();
switch (entity.GetRXClass().Name)
{
case "AcDbPolyline":
Teigha.DatabaseServices.Polyline pl = (Teigha.DatabaseServices.Polyline)entity;
IList<XYZ> listPoints = new List<XYZ>();
for (int i = ; i < pl.NumberOfVertices; i++)
{
listPoints.Add(new XYZ(MillimetersToUnits(pl.GetPoint2dAt(i).X), MillimetersToUnits(pl.GetPoint2dAt(i).Y), ));
}
PolyLine polyLine = PolyLine.Create(listPoints);
listCADModels.Add(new CADGeometryModel() {CadPolyLine= polyLine,LayerName=pl.Layer });
break;
case "AcDbLine":
Teigha.DatabaseServices.Line line = (Teigha.DatabaseServices.Line)entity;
Autodesk.Revit.DB.Line revitLine = Autodesk.Revit.DB.Line.CreateBound(ConverCADPointToRevitPoint(line.StartPoint), ConverCADPointToRevitPoint(line.EndPoint));
listCADModels.Add(new CADGeometryModel() {CadCurve=revitLine as Autodesk.Revit.DB.Curve ,LayerName=line.Layer});
break;
case "AcDbArc":
Teigha.DatabaseServices.Arc arc = (Teigha.DatabaseServices.Arc)entity;
double enda, stara;
if (arc.StartAngle> arc.EndAngle)
{
enda = arc.StartAngle;
stara = arc.EndAngle;
}
else
{
enda = arc.EndAngle;
stara = arc.StartAngle;
}
Autodesk.Revit.DB.Arc revitArc = Autodesk.Revit.DB.Arc.Create(Autodesk.Revit.DB.Plane.CreateByNormalAndOrigin(new XYZ( arc.Normal.X, arc.Normal.Y, arc.Normal.Z),
ConverCADPointToRevitPoint(arc.Center)), MillimetersToUnits(arc.Radius), stara, enda);
listCADModels.Add(new CADGeometryModel() { CadCurve = revitArc as Autodesk.Revit.DB.Curve, LayerName = arc.Layer });
break;
default:
break;
}
}
}
} }
}
}
}
}
return listCADModels;
} /// <summary>
/// 毫米转化成英寸
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private double MillimetersToUnits(double value)
{
return UnitUtils.ConvertToInternalUnits(value, DisplayUnitType.DUT_MILLIMETERS);
} /// <summary>
/// 将CAD里的点转化为Revit里的点
/// </summary>
/// <param name="point"></param>
/// <returns></returns>
private XYZ ConverCADPointToRevitPoint(Point3d point)
{
return new XYZ(MillimetersToUnits(point.X), MillimetersToUnits(point.Y), MillimetersToUnits(point.Z));
}
}
}
需要额外引用一些dll文件。其中红色框框里的dll文件是需要加载进vs引用里的。其余的放在debug文件夹里。

结果如下,可以在Revit中正确读取cad的图层信息,文字位置,几何信息等:

原文链接:https://blog.csdn.net/niuge8905/article/details/77204680
【转】Revit二次开发——读取cad中的文字信息的更多相关文章
- Revit二次开发-根据Element获取系统族信息
Element element = doc.getElement(elementId); Autodesk.Revit.DB.Parameter familyType = element.get_Pa ...
- Revit二次开发-BIM模型导出
最近一个月一直在研究Revit二次开发-BIM模型的导出,在网上找了很多相关资料学习.下面简单介绍一下我最近做的这个BIM模型的导出功能. 开始尝试使用Revit2015的样例程序里提供的读取模型几何 ...
- Revit二次开发之绘制钢筋
第一次在博客园上写东西,也不知道该写些什么,我想就写点最近项目到遇到的问题吧. 最近在做一个小项目,具体需求大概是在一个revit模型中的对应的楼板位置绘制钢筋. 由于刚接触Revit二次开发,之前也 ...
- Revit二次开发初体验
最近换了下工作,由之前的互联网企业转入了BIM软件开发行列.具体原因不多说,作为一个程序员来说学习永无止境.下面来一个Hello World体验下Revit的二次开发 事前准备 VS Revit 20 ...
- revit二次开发wpf里button按钮无法实现事务
不能在revit提供的api外部使用事务,解决此方法, 1.把button里要实现的功能写到外部事件IExternalEventHandler中,注册外部事件,在button事件中.raise()使用 ...
- revit二次开发之族的类型参数与实例参数的转换
1背景小伙伴在做revit二次开发的时候,可能需要在族环境中将族的类型参数与实例参数相互转换. 2思路1.使用族管理器FamilyManager,参见注释12.首先获取需要转换的参数(单个与批量),参 ...
- Revit二次开发实现BIM盈利(以橄榄山快模为例解说) 视频讲座下载
应笔墨闲谈群的邀请, 在10月11号晚8:30分在其群做了一次关于BIM二次开发的讲座. 因为參与者基本上都是从设计院和施工单位来的,所以对Revit二次开发做了纵览性的解说, 以非程序猿能听懂的方式 ...
- [Revit]Autodesk Revit 二次开发整理(资料、准备工作和环境搭建)
1 前言 Revit被Autodesk收购之后,整理和开放了一大部分API,供开发者实现自己的功能和程序,总体来说API的功能比较完善,毕竟市面上已经出现了各式各样的插件. 本人也是初学者,在Revi ...
- Revit二次开发——非模态窗口的事件处理
一.起因 自己在写revit二开时,有一个Winform窗体按钮点击事件需要 触发调用事务进行处理,结果出现“异常“Starting a transaction from an external ...
随机推荐
- echarts地图 绘制部分上海市公交线路数据
源代码地址 https://github.com/a1115040996/MyHTML/blob/gh-pages/echarts/roadMap.html 预览地址 https://a1115040 ...
- H3C STA>PC的数据转发
- Python pyc文件
什么是pyc文件 pyc 是由py文件经过编译后二进制文件,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python 的虚 拟机来执行的.pyc的内容,是跟pyt ...
- Httpd服务入门知识-Httpd服务常见配置案例之ServerSignature指令选项
Httpd服务入门知识-Httpd服务常见配置案例之ServerSignature指令选项 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ServerSignature指令概述 ...
- 快速的在linux服务器上安装jdk8
1.执行命令 yum -y list java* 查看可安装java版本.执行成功后可以看见如下的结果 选择一个java版本进行安装,这里我们希望安装java1.8,因为我们的机器是64位的,所以选择 ...
- Python 基础-> 字符串,数字,变量
Python 基础:字符串,数字,变量 1. 字符串 (信息的一种表达方式) a. 使用引号创建字符串 b. 单引号,双引号,三引号: ', ", ''', ""&quo ...
- 摘:Selenium api学习
selenium: selenium2(WebDriver) API1.1 下载selenium2.0的包 官方download包地址:http://code.google.com/p/seleniu ...
- MapReduce的核心运行机制
MapReduce的核心运行机制概述: 一个完整的 MapReduce 程序在分布式运行时有两类实例进程: 1.MRAppMaster:负责整个程序的过程调度及状态协调 2.Yarnchild:负责 ...
- 开源项目(9-0)综述--基于深度学习的目标跟踪sort与deep-sort
基于深度学习的目标跟踪sort与deep-sort https://github.com/Ewenwan/MVision/tree/master/3D_Object_Detection/Object_ ...
- 【LG3582】[POI2015]KIN
[LG3582][POI2015]KIN 题面 洛谷 题解 这题维护区间的信息有点像最大子段和,我们往最大子段和上面靠. 对于一个颜色,我们有一个直观的想法就是将它一次出现的权值设为正,二次出现就设为 ...