VB.NET读取Excel数据在CAD上展图
来源:互联网 发布:建设工程预算软件 编辑:程序博客网 时间:2024/04/29 10:45
根据网友的需求,编写此程序:读取Excel文件当中的数据,在CAD图上展绘孔位及其桩号与孔深的属性.
本实例包含以下技术要点:
1.如何用代码创建带属性的块对象,而非导入外部图块文件(尤其是带填充对象的图块).
2.如何更改块属性的属性值.
3.如何创建文本样式.
4.如何读取Excel文件当中的数据.
5.最大的特色是用VB.Net语言编写(因为用VB.Net编写的实例代码,在本论坛较少),望给用VB.Net的朋友有帮助.
6.因本人极少写VB.Net代码,难免水平较低,如有不足之处,请指出批评.
Excel文件的数据格式:
创建图块的源码:
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
''' <summary>
''' 创建图块
''' </summary>
''' <remarks></remarks>
Public Class CreateBlock
''' <summary>
''' 创建JK图块
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function createBlockJK() As ObjectId
Dim blockId As New ObjectId()
Dim db As Database = HostApplicationServices.WorkingDatabase '得到当前文档图形数据库
Dim record As New BlockTableRecord()
'图块名称
record.Name = "JK"
record.Origin = New Point3d(0, 0, 0)
'打开事务
Using trans As Transaction = db.TransactionManager.StartOpenCloseTransaction()
'创建第一个多段线对象
Dim pts1 As New Point2dCollection()
pts1.Add(New Point2d(-3.8, 0.0))
pts1.Add(New Point2d(+3.8, 0.0))
Dim pline1 As New Polyline()
For i As Integer = 0 To pts1.Count - 1
pline1.AddVertexAt(i, pts1.Item(i), 1, 0.4, 0.4)
Next
pline1.Closed = True
pline1.Layer = "0"
pline1.ColorIndex = 0
record.AppendEntity(pline1)
'创建第一个多段线对象
Dim pts2 As 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))
Dim pline2 As New Polyline()
For i As Integer = 0 To pts2.Count - 1
pline2.AddVertexAt(i, pts2.Item(i), 0, 0.2, 0.2)
Next
pline2.Closed = True
pline2.Layer = "0"
pline2.ColorIndex = 0
record.AppendEntity(pline2)
'创建第一个多段线对象
Dim pts3 As 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))
Dim pline3 As New Polyline()
For i As Integer = 0 To pts3.Count - 1
pline3.AddVertexAt(i, pts3.Item(i), 0, 0.2, 0.2)
Next
pline3.Layer = "0"
pline3.ColorIndex = 0
record.AppendEntity(pline3)
Dim att1 As 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)
Dim att2 As 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)
'以写的方式打开块表
Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForWrite)
'判断图块是否存在
If bt.Has(record.Name) = False Then
'在块表中加入块
blockId = bt.Add(record)
'通知事务处理
trans.AddNewlyCreatedDBObject(record, True)
'提交事务
trans.Commit()
End If
End Using
End Function
''' <summary>
''' 创建MK图块
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function createBlockMK() As ObjectId
Dim blockId As New ObjectId()
Dim db As Database = HostApplicationServices.WorkingDatabase '得到当前文档图形数据库
Dim record As New BlockTableRecord()
'图块名称
record.Name = "MK"
record.Origin = New Point3d(0, 0, 0)
'打开事务
Using trans As Transaction = db.TransactionManager.StartOpenCloseTransaction()
'创建第一个多段线对象
Dim pts1 As New Point2dCollection()
pts1.Add(New Point2d(-3.8, 0.0))
pts1.Add(New Point2d(+3.8, 0.0))
Dim pline1 As New Polyline()
For i As Integer = 0 To pts1.Count - 1
pline1.AddVertexAt(i, pts1.Item(i), 1, 0.4, 0.4)
Next
pline1.Closed = True
pline1.Layer = "0"
pline1.ColorIndex = 0
record.AppendEntity(pline1)
'创建第一个多段线对象
Dim pts2 As 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))
Dim pline2 As New Polyline()
For i As Integer = 0 To pts2.Count - 1
pline2.AddVertexAt(i, pts2.Item(i), 0, 0.2, 0.2)
Next
pline2.Layer = "0"
pline2.ColorIndex = 0
record.AppendEntity(pline2)
Dim att1 As 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 = "MK1" '设置属性的缺省值
att1.Tag = "孔号" '设置属性标签
att1.Layer = "0"
att1.TextStyleId = CreateEntity.CreateStyle() '指定文本样式
att1.ColorIndex = 0
record.AppendEntity(att1)
Dim att2 As 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)
'以写的方式打开块表
Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForWrite)
'判断图块是否存在
If bt.Has(record.Name) = False Then
'在块表中加入块
blockId = bt.Add(record)
'通知事务处理
trans.AddNewlyCreatedDBObject(record, True)
'提交事务
trans.Commit()
End If
End Using
End Function
''' <summary>
''' 创建SZB图块
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function createBlockSZB() As ObjectId
Dim blockId As New ObjectId()
Dim db As Database = HostApplicationServices.WorkingDatabase '得到当前文档图形数据库
Dim record As New BlockTableRecord()
'图块名称
record.Name = "SZB"
record.Origin = New Point3d(0, 0, 0)
'打开事务
Using trans As Transaction = db.TransactionManager.StartOpenCloseTransaction()
'创建第一个多段线对象
Dim pts1 As New Point2dCollection()
pts1.Add(New Point2d(-3.8, 0.0))
pts1.Add(New Point2d(+3.8, 0.0))
Dim pline1 As New Polyline()
For i As Integer = 0 To pts1.Count - 1
pline1.AddVertexAt(i, pts1.Item(i), 1, 0.4, 0.4)
Next
pline1.Closed = True
pline1.Layer = "0"
pline1.ColorIndex = 0
record.AppendEntity(pline1)
'创建第一个多段线对象
Dim pline2 As New Polyline()
pline2.AddVertexAt(0, New Point2d(-3.8, 0.0), 0, 0.2, 0.2)
pline2.AddVertexAt(1, New Point2d(+3.8, 0.0), 0, 0.2, 0.2)
pline2.Layer = "0"
pline2.ColorIndex = 0
record.AppendEntity(pline2)
'创建第一个多段线对象
Dim pline3 As New Polyline()
pline3.AddVertexAt(0, New Point2d(0.0, +3.8), 0, 0.2, 0.2)
pline3.AddVertexAt(1, New Point2d(0.0, -3.8), 0, 0.2, 0.2)
pline3.Layer = "0"
pline3.ColorIndex = 0
record.AppendEntity(pline3)
'创建第一个多段线对象
Dim pts4 As New Point2dCollection()
pts4.Add(New Point2d(0.0, 4.0))
pts4.Add(New Point2d(0.0, 14.0))
pts4.Add(New Point2d(28.0, 14.0))
Dim pline4 As New Polyline()
For i As Integer = 0 To pts4.Count - 1
pline4.AddVertexAt(i, pts4.Item(i), 0, 0.2, 0.2)
Next
pline4.Layer = "0"
pline4.ColorIndex = 0
record.AppendEntity(pline4)
Dim att1 As 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 = "SKS1" '设置属性的缺省值
att1.Tag = "孔号" '设置属性标签
att1.Layer = "0"
att1.TextStyleId = CreateEntity.CreateStyle() '指定文本样式
att1.ColorIndex = 0
record.AppendEntity(att1)
Dim att2 As 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)
'以写的方式打开块表
Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForWrite)
'判断图块是否存在
If bt.Has(record.Name) = False Then
'在块表中加入块
blockId = bt.Add(record)
'通知事务处理
trans.AddNewlyCreatedDBObject(record, True)
'提交事务
trans.Commit()
End If
End Using
End Function
''' <summary>
''' 创建TC图块
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function createBlockTC() As ObjectId
Dim blockId As New ObjectId()
Dim db As Database = HostApplicationServices.WorkingDatabase '得到当前文档图形数据库
'打开事务
Using trans As Transaction = db.TransactionManager.StartTransaction()
'以写的方式打开块表
Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForWrite)
'判断图块是否存在
If bt.Has("TC") = False Then
Dim MyHatch As New Hatch()
MyHatch.SetDatabaseDefaults()
MyHatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID")
Dim record As New BlockTableRecord()
'图块名称
record.Name = "TC"
record.Origin = New Point3d(0, 0, 0)
'在块表中加入块
blockId = bt.Add(record)
trans.AddNewlyCreatedDBObject(record, True)
'创建第一个多段线对象
Dim pts1 As New Point2dCollection()
pts1.Add(New Point2d(-6.346, +2.866))
pts1.Add(New Point2d(+6.346, +2.866))
pts1.Add(New Point2d(+6.346, -2.866))
pts1.Add(New Point2d(-6.346, -2.866))
Dim pline1 As New Polyline()
For i As Integer = 0 To pts1.Count - 1
pline1.AddVertexAt(i, pts1.Item(i), 0, 0.4, 0.4)
Next
pline1.Closed = True
pline1.Layer = "0"
pline1.ColorIndex = 0
record.AppendEntity(pline1)
'创建第一个多段线对象
Dim pts2 As New Point2dCollection()
pts2.Add(New Point2d(0.0, 2.866))
pts2.Add(New Point2d(0.0, 12.866))
pts2.Add(New Point2d(28.0, 12.866))
Dim pline2 As New Polyline()
For i As Integer = 0 To pts2.Count - 1
pline2.AddVertexAt(i, pts2.Item(i), 0, 0.2, 0.2)
Next
pline2.Closed = True
pline2.Layer = "0"
pline2.ColorIndex = 0
record.AppendEntity(pline2)
'创建第一个多段线对象
Dim pts3 As New Point2dCollection()
pts3.Add(New Point2d(+6.346, +2.866))
pts3.Add(New Point2d(+6.346, -2.866))
pts3.Add(New Point2d(-6.346, -2.866))
Dim pline3 As New Polyline()
For i As Integer = 0 To pts3.Count - 1
pline3.AddVertexAt(i, pts3.Item(i), 0, 0, 0)
Next
pline3.Closed = True
pline3.Layer = "0"
pline3.ColorIndex = 0
pline3.Closed = True
Dim objId As ObjectId = record.AppendEntity(pline3)
record.AppendEntity(MyHatch)
Dim att1 As 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 = "TS1" '设置属性的缺省值
att1.Tag = "孔号" '设置属性标签
att1.Layer = "0"
att1.TextStyleId = CreateEntity.CreateStyle() '指定文本样式
att1.ColorIndex = 0
record.AppendEntity(att1)
Dim att2 As 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)
'通知事务处理
trans.AddNewlyCreatedDBObject(pline1, True)
trans.AddNewlyCreatedDBObject(pline2, True)
trans.AddNewlyCreatedDBObject(pline3, True)
trans.AddNewlyCreatedDBObject(att1, True)
trans.AddNewlyCreatedDBObject(att2, True)
trans.AddNewlyCreatedDBObject(MyHatch, True)
Dim Ids As New ObjectIdCollection()
Ids.Add(objId)
MyHatch.Associative = True
MyHatch.AppendLoop(HatchLoopTypes.Default, Ids)
MyHatch.EvaluateHatch(True)
MyHatch.Layer = "0"
MyHatch.ColorIndex = 0
'提交事务
trans.Commit()
End If
End Using
End Function
''' <summary>
''' 创建ZK图块
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function createBlockZK() As ObjectId
Dim blockId As New ObjectId()
Dim db As Database = HostApplicationServices.WorkingDatabase '得到当前文档图形数据库
'打开事务
Using trans As Transaction = db.TransactionManager.StartTransaction()
'以写的方式打开块表
Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForWrite)
'判断图块是否存在
If bt.Has("ZK") = False Then
Dim MyHatch As New Hatch()
MyHatch.SetDatabaseDefaults()
MyHatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID")
Dim record As New BlockTableRecord()
'图块名称
record.Name = "ZK"
record.Origin = New Point3d(0, 0, 0)
'在块表中加入块
blockId = bt.Add(record)
trans.AddNewlyCreatedDBObject(record, True)
'创建第一个多段线对象
Dim pts1 As New Point2dCollection()
pts1.Add(New Point2d(-3.8, 0.0))
pts1.Add(New Point2d(+3.8, 0.0))
Dim pline1 As New Polyline()
For i As Integer = 0 To pts1.Count - 1
pline1.AddVertexAt(i, pts1.Item(i), 1, 0.4, 0.4)
Next
pline1.Closed = True
pline1.Layer = "0"
pline1.ColorIndex = 0
record.AppendEntity(pline1)
'创建第一个多段线对象
Dim pts2 As New Point2dCollection()
pts2.Add(New Point2d(0.0, 3.8))
pts2.Add(New Point2d(0.0, 14.0))
pts2.Add(New Point2d(28.0, 14.0))
Dim pline2 As New Polyline()
For i As Integer = 0 To pts2.Count - 1
pline2.AddVertexAt(i, pts2.Item(i), 0, 0.2, 0.2)
Next
pline2.Layer = "0"
pline2.ColorIndex = 0
record.AppendEntity(pline2)
'创建第一个多段线对象
Dim pline3 As New Polyline()
pline3.AddVertexAt(0, New Point2d(0.0, -3.8), 1, 0, 0)
pline3.AddVertexAt(1, New Point2d(0.0, +3.8), 0, 0, 0)
pline3.Layer = "0"
pline3.ColorIndex = 0
pline3.Closed = True
Dim objId As ObjectId = record.AppendEntity(pline3)
record.AppendEntity(MyHatch)
Dim att1 As New AttributeDefinition
att1.Position = New Point3d(13.668, 18.878, 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 = "ZKS1" '设置属性的缺省值
att1.Tag = "孔号" '设置属性标签
att1.Layer = "0"
att1.TextStyleId = CreateEntity.CreateStyle() '指定文本样式
att1.ColorIndex = 0
record.AppendEntity(att1)
Dim att2 As New AttributeDefinition
att2.Position = New Point3d(13.668, 8.649, 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)
'通知事务处理
trans.AddNewlyCreatedDBObject(pline1, True)
trans.AddNewlyCreatedDBObject(pline2, True)
trans.AddNewlyCreatedDBObject(pline3, True)
trans.AddNewlyCreatedDBObject(att1, True)
trans.AddNewlyCreatedDBObject(att2, True)
trans.AddNewlyCreatedDBObject(MyHatch, True)
Dim Ids As New ObjectIdCollection()
Ids.Add(objId)
MyHatch.Associative = True
MyHatch.AppendLoop(HatchLoopTypes.Default, Ids)
MyHatch.EvaluateHatch(True)
MyHatch.Layer = "0"
MyHatch.ColorIndex = 0
'提交事务
trans.Commit()
End If
End Using
End Function
End Class
创建实体源码:
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.DatabaseServices
''' <summary>
''' 创建实体对象
''' </summary>
''' <remarks></remarks>
Public Class CreateEntity
''' <summary>
''' 将图形对象加入到模型空间的函数
''' </summary>
''' <param name="ent"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function AppendEntity(ByVal ent As Entity) As ObjectId
' 得到当前文档图形数据库.
Dim db As Database = HostApplicationServices.WorkingDatabase
Dim entId As ObjectId
Using trans As Transaction = db.TransactionManager.StartTransaction
' 以读方式打开块表.
Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
' 以写方式打开模型空间块表记录.
Dim btr As BlockTableRecord = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
' 将图形对象的信息添加到块表记录中,并返回ObjectId对象.
entId = btr.AppendEntity(ent)
' 把图形对象添加到事务处理中.
trans.AddNewlyCreatedDBObject(ent, True)
' 提交事务处理.
trans.Commit()
End Using
Return entId
End Function
''' <summary>
''' 由二维点集合和线宽创建二维优化多段线的函数
''' </summary>
''' <param name="pts">Point2d集合</param>
''' <param name="width">线宽</param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function AddPline(ByVal pts As Point2dCollection, ByVal width As Double) As ObjectId
Try
' 得到点集合的数量.
Dim n As Integer = pts.Count
' 在内存中创建一个二维优化多段线对象.
Dim ent As New Polyline(n)
' 向多段线添加顶点.
For i As Integer = 0 To n - 1
ent.AddVertexAt(i, pts.Item(i), 0, width, width)
Next
' 调用EntityToModelSpace函数,将二维多段线加入到模型空间.
Dim entId As ObjectId = AppendEntity(ent)
Return entId
Catch
' 创建失败,则返回一个空的ObjectId.
Dim nullId As ObjectId = ObjectId.Null
Return nullId
End Try
End Function
''' <summary>
''' 插入一个带属性的块
''' </summary>
''' <param name="blockName">图块名称</param>
''' <param name="point">插入点</param>
''' <param name="scale">图块比例</param>
''' <param name="rotateAngle">图块旋转角度</param>
''' <param name="KHstring">属性值:孔号</param>
''' <param name="KSdouble">属性值:孔深</param>
''' <remarks></remarks>
Public Sub InsertBlockRefWithAtt(ByVal blockName As String, _
ByVal point As Point3d, _
ByVal scale As Scale3d, _
ByVal rotateAngle As Double, _
ByVal KHstring As String, _
ByVal KSdouble As Double)
Dim db As Database = HostApplicationServices.WorkingDatabase
Using trans As Transaction = db.TransactionManager.StartTransaction
Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
If (bt.Has(blockName) = False) Then
Return
End If
Dim block As BlockTableRecord = trans.GetObject(bt(blockName), OpenMode.ForRead)
Dim blockref As BlockReference = New BlockReference(point, bt(blockName))
blockref.ScaleFactors = scale
blockref.Rotation = rotateAngle
Dim btr As BlockTableRecord = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite)
btr.AppendEntity(blockref)
trans.AddNewlyCreatedDBObject(blockref, True)
'获取blockName块的遍历器,以实现对块中对象的访问
Dim iterator As BlockTableRecordEnumerator = block.GetEnumerator()
'如果blockName块包含属性
If block.HasAttributeDefinitions Then
'利用块遍历器对块中的对象进行遍历
While iterator.MoveNext
'获取块遍历器当前指向的块中的对象
Dim obj As DBObject = trans.GetObject(iterator.Current, OpenMode.ForRead)
'定义一个新的属性参照对象
Dim att As New AttributeReference()
'判断块遍历器当前指向的块中的对象是否为属性定义
If TypeOf (obj) Is AttributeDefinition Then
'获取属性定义对象
Dim attdef As AttributeDefinition = obj
'从属性定义对象中继承相关的属性到属性参照对象中
att.SetAttributeFromBlock(attdef, blockref.BlockTransform)
'设置属性参照对象的位置为属性定义的位置+块参照的位置
att.Position = attdef.Position + blockref.Position.GetAsVector()
'判断属性定义的名称
Select Case attdef.Tag
'设置块参照的属性值
Case "孔号"
att.TextString = KHstring
Case "孔深"
att.TextString = FormatNumber(KSdouble, 2)
End Select
'判断块参照是否可写,如不可写,则切换为可写状态
If Not blockref.IsWriteEnabled Then
blockref.UpgradeOpen()
End If
'添加新创建的属性参照
blockref.AttributeCollection.AppendAttribute(att)
'通知事务处理添加新创建的属性参照
trans.AddNewlyCreatedDBObject(att, True)
End If
End While
End If
trans.Commit() '提交事务处理
End Using
End Sub
''' <summary>
''' 创建文本样式
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function CreateStyle() As ObjectId
Dim TextstyleId As New ObjectId
Dim db As Database = HostApplicationServices.WorkingDatabase
Using trans As Transaction = db.TransactionManager.StartTransaction
' 得到文字样式表
Dim st As TextStyleTable = trans.GetObject(db.TextStyleTableId, OpenMode.ForWrite)
Dim StyleName As String = "hzhz"
' 如果文字样式不存在,则新建一个文字样式.
If st.Has(StyleName) = False Then
' 新建一个文字样式表记录.
Dim str As New TextStyleTableRecord()
' 设置文字样式名.
str.Name = StyleName
' 设置TrueType字体(黑体)
str.FileName = "SIMHEI.TTF"
'---------------------------------------------
' 设置SHX字体
' str.FileName = "gbenor"
' 设置大字体.
' str.BigFontFileName = "gbcbig"
' --------------------------------------------
' 设置倾斜角(弧度).
'str.ObliquingAngle = 15 * Math.PI / 180
' 设置宽度比例.
'str.XScale = 0.67
' 把文字样式表记录添加到文字样式表中.
TextstyleId = st.Add(str)
' 把文字样式表记录添加到事务处理中.
trans.AddNewlyCreatedDBObject(str, True)
' 将文字样式设置为当前文字样式
db.Textstyle = TextstyleId
trans.Commit()
Else
TextstyleId = st(StyleName)
End If
End Using
End Function
End Class
我在工程项目添加了一个窗体及一个按钮,按钮的单击事件代码如下:
Imports System.Data.OleDb
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.OpenFileDialog1.Title = "打开展点文件"
Me.OpenFileDialog1.Filter = "Excle 文件(*.xls)|*xls"
Me.OpenFileDialog1.FileName = ""
If Me.OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
Dim PathString As String = Me.OpenFileDialog1.FileName
Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + PathString + ";" + "Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"
Dim strExcel As String = "select * from [sheet1$]"
Dim conn As New OleDbConnection
Try
conn = New OleDbConnection(strConn)
conn.Open()
Dim cmd As OleDbCommand = New OleDbCommand(strExcel, conn)
Dim read As OleDbDataReader = cmd.ExecuteReader()
'得到当前文档图形数据库.
Dim db As Database = HostApplicationServices.WorkingDatabase
'图形文档加锁
Using Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument()
'创建图块
CreateBlock.createBlockJK()
CreateBlock.createBlockMK()
CreateBlock.createBlockTC()
CreateBlock.createBlockZK()
CreateBlock.createBlockSZB()
Using trans As Transaction = db.TransactionManager.StartTransaction
'以读方式打开块表.
Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
'以写方式打开模型空间块表记录.
Dim btr As BlockTableRecord = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
While read.Read()
'获取坐标值
Dim strX As String = read.GetValue(2)
Dim strY As String = read.GetValue(3)
Dim strZ As String = read.GetValue(4)
If IsNumeric(strX) And IsNumeric(strY) And IsNumeric(strZ) Then
Dim pt As New Point3d(CDbl(strX), CDbl(strY), CDbl(strZ))
Dim strBlockName As String
Select Case read.GetString(1)
Case "静力触探孔", "静力触探", "静探"
strBlockName = "JK"
Case "十字板孔", "十字板试验孔", "十字板"
strBlockName = "SZB"
Case "槽探", "探槽"
strBlockName = "TC"
Case "麻花钻", "麻花钻孔", "螺纹钻", "螺纹钻孔"
strBlockName = "MK"
Case Else
strBlockName = "ZK"
End Select
'获取深度值
Dim douSD As Double
Dim strSD As String = read.GetValue(5)
If IsNumeric(strSD) Then
douSD = CDbl(strSD)
Else
douSD = 0.0
End If
Dim createEntity As New CreateEntity()
createEntity.InsertBlockRefWithAtt(strBlockName, pt, New Scale3d(1), 0, read.GetString(0), douSD)
End If
End While
trans.Commit()
End Using
End Using
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute("zoom e ", True, False, False)
Catch
End Try
conn.Close()
Me.Close()
End If
End Sub
End Class
- VB.NET读取Excel数据在CAD上展图
- C#读取Excel数据在CAD上展图
- C#读取Excel数据在CAD上展图
- vb.net 读取EXCEL文件中的数据
- vb.net读取EXCEL
- vb.net 读取Excel
- vb.net中从datatable读取数据到Excel
- vb读取excel中的数据并在窗体上显示
- VB读取excel表数据
- [VB.NET]在VB.NET怎样动态读取EXCEL单元格的值?
- vb.net和C#.net读取EXCEL
- [VB.NET]如何在vb。net中打开一个excel表 并获取数据阿
- vb.net读取dbf、Excel、Access数据文件
- VB.NET读取EXCEL 里面的内容
- vb.net ADO快速读取excel
- 在 .net 中读取Excel文件中的日期数据
- VB读取excel表中的数据
- C#CAD二次开发读取CAD表格数据
- Activity中ConfigChanges属性的用法
- ecshop后台权限处理原理
- 继续学习 DLINQ和ADO.NET实体框架
- QT中调用外部程序的方法 QProcess类
- User Account Control 与WMI
- VB.NET读取Excel数据在CAD上展图
- Android IPC 通讯机制源码分析
- qt可停靠控件和工具栏(Dock Widgets and Toolbars)
- PHP-MemCache的安装方法
- 开始正式学习.NET
- [软件人生]读史的三个境界看软件业
- crontab的用法---linux定时任务
- WPF中ListView绑定Dictionary,顺带提右键菜单和checkbox
- 【技术应用】Qt Creator使用体会与小技巧