根据网友的需求,将<<读取Excel数据在CAD上展图>>的VB.NET版本转为C#版本
本实例包含以下技术要点:
1.如何用代码创建带属性的块对象,而非导入外部图块文件(尤其是带填充对象的图块).
2.如何更改块属性的属性值.
3.如何创建文本样式.
4.如何读取Excel文件当中的数据.
Excel文件的数据格式:
JKC1 静力触探孔 3045304.377 543717.354 2.630 32.500
JKC2 静力触探孔 3045617.146 545348.081 3.200 35.800
JKC3 静力触探孔 3046038.390 546159.911 3.380 35.500
SKC1 十字板 3045617.739 545346.739 3.200 30.000
SKC2 十字板 3046138.556 548510.327 2.520 30.000
SKC3 十字板 3046605.847 555424.066 2.200 30.000
ZKC1 取土样钻孔 3045384.183 544032.220 2.680 80.000
ZKC2 取土样钻孔 3045436.779 544468.844 2.720 76.100
ZKC3 取土样钻孔 3045477.244 544827.897 2.680 80.500
创建图块的源码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
namespace ReaderExcelDrawMapII
{
/// <summary>
/// 创建图块
/// </summary>
public class CreateBlock
{
/// <summary>
/// 创建JK图块
/// </summary>
/// <returns></returns>
/// <remarks></remarks>
public static ObjectId createBlockJK()
{
ObjectId blockId = new ObjectId();
Database db = HostApplicationServices.WorkingDatabase;
//得到当前文档图形数据库
BlockTableRecord record = new BlockTableRecord();
//图块名称
record.Name = "JK";
record.Origin = new Point3d(0, 0, 0);
//打开事务
using (Transaction trans = db.TransactionManager.StartOpenCloseTransaction())
{
//创建第一个多段线对象
Point2dCollection pts1 = new Point2dCollection();
pts1.Add(new Point2d(-3.8, 0.0));
pts1.Add(new Point2d(+3.8, 0.0));
Polyline pline1 = new Polyline();
for (int i = 0; i <= pts1.Count - 1; i++)
{
pline1.AddVertexAt(i, pts1[i], 1, 0.4, 0.4);
}
pline1.Closed = true;
pline1.Layer = "0";
pline1.ColorIndex = 0;
record.AppendEntity(pline1);
//创建第一个多段线对象
Point2dCollection pts2 = new Point2dCollection();
pts2.Add(new Point2d(0.0, -3.8));
pts2.Add(new Point2d(3.2909, 1.9));
pts2.Add(new Point2d(-3.2909, 1.9));
Polyline pline2 = new Polyline();
for (int i = 0; i <= pts2.Count - 1; i++)
{
pline2.AddVertexAt(i, pts2[i], 0, 0.2, 0.2);
}
pline2.Closed = true;
pline2.Layer = "0";
pline2.ColorIndex = 0;
record.AppendEntity(pline2);
//创建第一个多段线对象
Point2dCollection pts3 = new Point2dCollection();
pts3.Add(new Point2d(0.0, 4.0));
pts3.Add(new Point2d(0.0, 14.0));
pts3.Add(new Point2d(28.0, 14.0));
Polyline pline3 = new Polyline();
for (int i = 0; i <= pts3.Count - 1; i++)
{
pline3.AddVertexAt(i, pts3[i], 0, 0.2, 0.2);
}
pline3.Layer = "0";
pline3.ColorIndex = 0;
record.AppendEntity(pline3);
AttributeDefinition att1 = new AttributeDefinition();
att1.Position = new Point3d(13.6683, 18.8785, 0.0);
att1.Height = 7.8;
//设置文字高度
att1.WidthFactor = 0.7;
//设置宽度因子
att1.HorizontalMode = TextHorizontalMode.TextMid;
//设置水平对齐方式
att1.VerticalMode = TextVerticalMode.TextVerticalMid;
//设置垂直对齐方式
att1.AlignmentPoint = att1.Position;
att1.Prompt = "孔号";
//设置属性提示
att1.TextString = "JKS1";
//设置属性的缺省值
att1.Tag = "孔号";
//设置属性标签
att1.Layer = "0";
att1.TextStyleId = CreateEntity.CreateStyle();
//指定文本样式
att1.ColorIndex = 0;
record.AppendEntity(att1);
AttributeDefinition att2 = new AttributeDefinition();
att2.Position = new Point3d(13.6683, 8.3528, 0.0);
att2.Height = 7.8;
//设置文字高度
att2.WidthFactor = 0.7;
//设置宽度因子
att2.HorizontalMode = TextHorizontalMode.TextMid;
//设置水平对齐方式
att2.VerticalMode = TextVerticalMode.TextVerticalMid;
//设置垂直对齐方式
att2.AlignmentPoint = att2.Position;
att2.Prompt = "孔深";
//设置属性提示
att2.TextString = "0.00";
//设置属性的缺省值
att2.Tag = "孔深";
//设置属性标签
att2.Layer = "0";
att2.TextStyleId = CreateEntity.CreateStyle();
//指定文本样式
att2.ColorIndex = 0;
record.AppendEntity(att2);
//以写的方式打开块表
BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
//判断图块是否存在
if (bt.Has(record.Name) == false)
{
//在块表中加入块
blockId = bt.Add(record);
//通知事务处理
trans.AddNewlyCreatedDBObject(record, true);
//提交事务
trans.Commit();
}
}
return blockId;
}
/// <summary>
/// 创建MK图块
/// </summary>
/// <returns></returns>
/// <remarks></remarks>
public static ObjectId createBlockMK()
{
ObjectId blockId = new ObjectId();
Database db = HostApplicationServices.WorkingDatabase;
//得到当前文档图形数据库
BlockTableRecord record = new BlockTableRecord();
//图块名称
record.Name = "MK";
record.Origin = new Point3d(0, 0, 0);
//打开事务
using (Transaction trans = db.TransactionManager.StartOpenCloseTransaction())
{
//创建第一个多段线对象
Point2dCollection pts1 = new Point2dCollection();
pts1.Add(new Point2d(-3.8, 0.0));
pts1.Add(new Point2d(+3.8, 0.0));
Polyline pline1 = new Polyline();
for (int i = 0; i <= pts1.Count - 1; i++)
{
pline1.AddVertexAt(i, pts1[i], 1, 0.4, 0.4);
}
pline1.Closed = true;
pline1.Layer = "0";
pline1.ColorIndex = 0;
record.AppendEntity(pline1);
//创建第一个多段线对象
Point2dCollection pts2 = new Point2dCollection();
pts2.Add(new Point2d(0.0, 4.0));
pts2.Add(new Point2d(0.0, 14.0));
pts2.Add(new Point2d(28.0, 14.0));
Polyline pline2 = new Polyline();
for (int i = 0; i <= pts2.Count - 1; i++)
{
pline2.AddVertexAt(i, pts2[i], 0, 0.2, 0.2);
}
pline2.Layer = "0";
pline2.ColorIndex = 0;
record.AppendEntity(pline2);
AttributeDefinition att1 = new AttributeDefinition();
att1.Position = new Point3d(13.6683, 18.8785, 0.0);
att1.Height = 7.8;