c#读DWG文件中Model_Space的数据
2016-09-28 09:27
519 查看
一,读取DWG文件中的对象坐标信息,比如‘等高线’,遇到代理实体则炸开处理
资料下载:点击这里二、一言不合就直接上代码
using gis.@base.GisBase;using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Teigha.DatabaseServices;
using Teigha.Geometry;
using Teigha.Runtime;
namespace Skyline.app.DWG2SKModel
{
class DWGReader
{
Database mDB = null;
Dictionary<string, List<ObjectId>> mLyrObjDic;
Dictionary<ObjectId, Entity> mEntityDic;
//间隔阈值,arc另外考虑一下
double LineParamValue = 5;//对矢量线按照一定间隔打断,这是作者自己的需求,读者按照自己需求进行获取坐标信息
Teigha.Runtime.Services mRServices;
public DWGReader()
{
mRServices = new Teigha.Runtime.Services();
}
/// <summary>
/// 图层以及图层中的对象在EntityDic中的key
/// </summary>
public Dictionary<string, List<ObjectId>> LyrObjDic
{
get
{
return mLyrObjDic;
}
}
public Dictionary<ObjectId, Entity> EntityDic
{
get
{
return mEntityDic;
}
}
public void Open(string pDWGFilePath)
{
if (pDWGFilePath == string.Empty) return;
if (!File.Exists(pDWGFilePath)) return;
mDB = new Database(false, false);
mDB.ReadDwgFile(pDWGFilePath, FileOpenMode.OpenForReadAndAllShare, false, "");
OpenLayer();
OpenModel();
}
private void OpenLayer()
{
mLyrObjDic = new Dictionary<string, List<ObjectId>>();
TransactionManager pTMgr = mDB.TransactionManager;
using (Transaction pTransac = pTMgr.StartTransaction())
{
LayerTable pLTable = pTMgr.GetObject(mDB.LayerTableId, OpenMode.ForRead) as LayerTable;
IEnumerator pIterator = pLTable.GetEnumerator();
while (pIterator.MoveNext())
{
ObjectId objId = (ObjectId)pIterator.Current;
LayerTableRecord pLTRecord = pTMgr.GetObject(objId, OpenMode.ForRead) as LayerTableRecord;
mLyrObjDic.Add(pLTRecord.Name, new List<ObjectId>());
}
pTransac.Commit();
}
}
private void OpenModel()
{
mEntityDic = new Dictionary<ObjectId, Entity>();
TransactionManager pTMgr = mDB.TransactionManager;
using (Transaction pTransac = pTMgr.StartTransaction())
{
BlockTable pBTable = pTMgr.GetObject(mDB.BlockTableId, OpenMode.ForRead) as BlockTable;
ObjectId pModelSpaceId = pBTable[BlockTableRecord.ModelSpace];
//pModelSpaceId.GetObject(OpenMode.ForRead);
BlockTableRecord pBTRecord = pTMgr.GetObject(pModelSpaceId, OpenMode.ForRead) as BlockTableRecord;
IEnumerator pIterator = pBTRecord.GetEnumerator();
while (pIterator.MoveNext())
{
ObjectId objId = (ObjectId)pIterator.Current;
Entity pEntity = pTMgr.GetObject(objId, OpenMode.ForRead) as Entity;
//if (!mLyrObjDic.ContainsKey(pEntity.Layer)) continue;
mEntityDic.Add(objId, pEntity);
mLyrObjDic[pEntity.Layer].Add(objId);//按照图层名进行组织
}
pTransac.Commit();
}
}
public List<string> GetLayersName()
{
return mLyrObjDic.Keys.ToList();
}
/// <summary>
/// 各种类型的间隔取值阈值需要指定
/// </summary>
/// <param name="ObjId"></param>
/// <returns></returns>
public Point3DFList GetObjCoords(ObjectId ObjId)
{
Entity pEntity = mEntityDic[ObjId];
Point3DFList result = new Point3DFList();//该数据结构是作者自己设计的数据结构,读者可以换做其他数据结构
Point3DFList pList;
DBObjectCollection dbObjColl = new DBObjectCollection();
switch (pEntity.GetRXClass().Name.ToLower())
{
//弧线与直线、样条曲线的阈值计算不同,单独考虑一下
case "acdbarc":
case "acdbcircle":
case "acdbline":
case "acdbspline":
pList = GetArcCoords(pEntity as Curve, LineParamValue);
result.AddRange(pList);
break;
#region Need Explode Entity
case "acdbpolyline":
break;
case "acdbhatch":
break;
case "acdbblockreference":
break;
case "acdbrotateddimension":
break;
case "acdbproxyentity":
pList = GetProxyEntityCoords(pEntity as ProxyEntity);
result.AddRange(pList);
break;
#endregion
}
return result;
}
private Point3DFList GetProxyEntityCoords(ProxyEntity pProxyEntity)
{
Point3DFList result = new Point3DFList();
DBObjectCollection dbObjColl = new DBObjectCollection();
try
{
pProxyEntity.Explode(dbObjColl);//炸开代理实体
}
catch (System.Exception)
{
return result;
}
//pProxyEntity.BlockId as BlockTableRecord;
foreach (DBObject dbObj in dbObjColl)
{
switch (dbObj.GetRXClass().Name.ToLower())
{
//炸开之后还有acdbpolyline类型
case "acdbcircle":
case "acdbline":
case "acdbspline":
case "acdbarc":
result.AddRange(GetArcCoords(dbObj as Curve, LineParamValue));
break;
case "acdbpolyline":
result.AddRange(GetPolylineCoords(dbObj as Entity, LineParamValue));
break;
case "acdbproxyentity":
result.AddRange(GetProxyEntityCoords(dbObj as ProxyEntity));
break;
}
}
return result;
}
#region 获取简单实体的坐标
private Point3DFList GetArcCoords(Curve curve, double ParamSpace)
{
Point3DFList result = new Point3DFList();
if (curve.StartParam == curve.EndParam) return result;
Point3DF pPt3DF = new Point3DF();
double splineStartParam = curve.StartParam;
do
{
Point3d pt3d = curve.GetPointAtParameter(splineStartParam);
result.Add(new Point3DF(pt3d.Y, pt3d.X, pt3d.Z));
splineStartParam += ParamSpace;
} while (splineStartParam <= curve.EndParam);
return result;
}
#endregion
private Point3DFList GetPolylineCoords(Entity pEntity, double ParamSpace)
{
bool isc = mEntityDic.Keys.Contains(pEntity.Id);
Teigha.DatabaseServices.Polyline poly = pEntity as Teigha.DatabaseServices.Polyline;
Point3DFList result = new Point3DFList();
DBObjectCollection dbObjColl = new DBObjectCollection();
try
{
poly.Explode(dbObjColl);//炸开代理实体
}
catch (System.Exception)
{
return result;
}
foreach (DBObject dbObj in dbObjColl)
{
bool iscon = mEntityDic.Keys.Contains(dbObj.Id);
//查看炸开后的实体是否还属于原图层
switch (dbObj.GetRXClass().Name.ToLower())
{
//炸开之后还有acdbpolyline类型
case "acdbcircle":
case "acdbline":
case "acdbspline":
case "acdbarc":
result.AddRange(GetArcCoords(dbObj as Curve, LineParamValue));
break;
case "acdbpolyline":
result.AddRange(GetPolylineCoords(dbObj as Entity, ParamSpace));
break;
}
}
return result;
}
}
}
相关文章推荐
- [转贴]通过 C# 使用 J# 类库中的 Zip 类压缩文件和数据
- 使用C#查询excel文件中的数据
- C# 向数据中存储和读取二进制文件!!
- C#把DataSet内数据转化为Excel和Word文件的通用类
- C#把DataSet内数据转化为Excel和Word文件的通用类
- 通过 C# 使用 J# 类库中的 Zip 类压缩文件和数据
- C#下使用Excel 2007 COM接口将数据保存为Excel文件
- C#读取Excel文件数据
- 关于OLE DB 通用数据链接 (.udl) 文件与在C#中使用
- C#把DataSet内数据转化为Excel和Word文件的通用类
- .net(c#)读取*.dbf文件数据的类库
- 通过 C# 使用 J# 类库中的 Zip 类压缩文件和数据
- asp.net(c#)如何读取上传过程中的.txt文件中的数据,并将其写入数据库的
- C#中数据以Excel文件形式导出
- 使用C#把Excel格式文件的数据导入到sqlserver中
- 用C#读取Excel文件:从指定单元格开始向右向下读取数据
- C# 对sharepoint 列表的一些基本操作,包括添加/删除/查询/上传文件给sharepoint list添加数据
- 用C#读取C/C++中struct数据类型生成的文件
- [原创]大量数据导出为Excel文件的问题解决(C#,ASP.NET)
- C# asp.net页面接收的数据保存到Txt文件中, C#将数据保存到记录本中 conquer