论文部分内容阅读
[摘要]本文主要介绍在Terrasolid环境下的正射影像成果利用VB.NET进行二次开发,形成与AutoCAD对接的特点、原理及方法。通过实例验证图形自动生成技术,测试该软件在实际工作中的作业效率,达到提高生产效率的目的。
[关键词]Terrasolid 正射影像 AutoCAD 图形自动生成
[中图分类号] P2 [文献码] B [文章编号] 1000-405X(2014)-7-232-3
0引言
作为一种通用计算机辅助设计软件,AutoCAD由于其强大的设计功能,已被应用于各行各业。然而,在实际应用中仍存在较多不足之处,如对重复工作的自动化程度较差等。因此,对AutoCAD软件进行二次开发是更有效地应用该软件的最佳途径之一。.NET结合了VC++功能强大与VBA易学易用的特点,可以快速的开发出实用的程序。本论文最终设计并实现了一个基于VB编程语言的AutoCAD二次开发软件。
1程序开发
1.1程序设计
本软件可以根据用户设定,生成带有坐标的截图框,并在图框中自动标注左下角坐标。用户在Terrasolid软件中可利用该图框对正射影像图进行截图和分图,得到的分幅图将自动以图框中的标注作为文件名。方便用户对正射影像图的后处理以及和数字地形图的坐标追踪。并可以运用到其他在面状地形图中截取线型地形图的工作中。本程序使用VS2005开发,运行于CAD2009。
1.2程序啟动
首先启动Visual Studio 2005,选择【文件】|【新建】|【项目】菜单,在项目类型中选择Visual Basic语言,然后在模板列表中选择【类库】项目,在下面的【名称】,【位置】等文本框中输入相应的内容,单击确定完成项目创建。其次在项目解决方案浏览器中右键单击项目,选择【添加引用】菜单,在CAD2009安装目录下找到acdbmgd.dll和acdmgd.dll,点击确定即自动添加。
1.3核心设计
Public Class Class1
'创建四边形
Public Sub CreatSquare()
'接收用户键盘输入 起始 x,y
Dim db As Database = HostApplicationServices.WorkingDatabase
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim user_col As Double: Dim user_row As Double
Dim optPoint As New PromptPointOptions(vbCrLf & "请捕捉,或手工输入左下角坐标!")
optPoint.AllowNone = True
Dim resPoint As PromptPointResult = ed.GetPoint(optPoint)
If resPoint.Status = PromptStatus.Cancel Then Return
Dim ptStart As Point3d
If resPoint.Status = PromptStatus.None Then
ptStart = New Point3d(100, 200, 0)
Else
ptStart = resPoint.Value
End If
Dim ptPrevious As Point3d = ptStart
Dim pt1 As New Point2d(ptPrevious(0), ptPrevious(1))
user_row = ModelSpace.GetUserInputRow()Ⅰ
user_col = ModelSpace.GetUserInputCol()
下面我定义了一个边长为1km为单位坐标增加量(dx = 1000, dy = 1000),用户也可以利用Input语句与用户动态的交互,得到dx,dy,以便得到不同需求四边形,从而增加程序的灵活及使用性,本文中此数值确定为1km.
之后利用For语句进行双重循环,先对列循环,完成每个图形单元(本文中为四边形)的绘制, 与此同时, 将提取到的左下角坐标(x_txt, y_txt)以特定长度(x值取4位长度,y值取3为长度)字符串拼接形式,呈现在图形单元的(Position_x, Position_y)点. 后对行循环,完成行数方向上的图形绘制.
Dim x, y As Double: Dim dx, dy As Integer
dx = 1000: dy = 1000
x = ptPrevious(0): y = ptPrevious(1)
Dim pt(4) As Point2d
Dim i_col As Integer: Dim set_txt As String
Dim Position_x As Integer: Dim Position_y As Integer
For i_Row As Integer = 0 To user_row - 1
For i_col = 0 To user_col - 1
pt(0) = New Point2d(x + i_col * dx, y + i_Row * dy) Dim y_txt As Integer = Left(x + i_col * dx, 3)
Dim x_txt As Integer = Left(y + i_Row * dy, 4)
set_txt = x_txt & "+" & y_txt
Position_x = x + i_col * dx + 200: Position_y = y + i_Row * dy + 500
Dim textId As ObjectId = ModelSpace.AddText(New Point3d(Position_x, Position_y, 0), set_txt, 75, 0)
pt(1) = New Point2d(x + (i_col + 1) * dx, y + i_Row * dy)
pt(2) = New Point2d(x + (i_col + 1) * dx, y + (i_Row + 1) * dy)
pt(3) = New Point2d(x + i_col * dx, y + (i_Row + 1) * dy)
pt(4) = New Point2d(x + i_col * dx, y + i_Row * dy)
Dim pts As New Point2dCollection(pt)
Dim plineId As ObjectId = ModelSpace.AddSquare(pts, 0)
Next
Next
End Sub
以下两段代码位于另一个类ModelSpace中,主要功能是完成与用户交互和在模型空间中绘制单个的图形(本文中为1km*1km正方形)。
Public Class ModelSpace
Public Shared Function GetUserInputRow() As Integer
' 定義一个整数的用户交互类______row.
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim jq_I_Num As New PromptIntegerOptions(vbCrLf & "请输入总行数!")
jq_I_Num.AllowNegative = False
jq_I_Num.DefaultValue = 50
Dim res_I_Num As PromptIntegerResult = ed.GetInteger(jq_I_Num)
If res_I_Num.Status = PromptStatus.OK Then
Dim user_row As Integer = res_I_Num.Value
Return user_row
End If
End Function
同理可得到用户的列数。
Public Shared Function AddSquare(ByVal p As Point2dCollection, ByVal width As Double) As ObjectId
'绘制四边形到模型空间
Try
Dim n As Integer = p.Count
Dim ent As New Polyline(n)
For i As Integer = 0 To n - 1
ent.AddVertexAt(i, p.Item(i), 0, width, width)
Next
Dim entId As ObjectId = AppendEntity(ent)
Return entId
Catch
Dim nullId As ObjectId = ObjectId.Null
Return nullId
End Try
End Function
1.4程序运行
打开CAD2009,输入netload命令,加载.dll文件。输入jt命令,可以手工输入或点选第一个四边形的左下角坐标,与用户交互后得到总的行列数。运行后可得到需要的结果(如图1所示,这里我设定了一个6*6的方格网)。用户也可以多次使用jt命令添加图框。
2应用实例
在图像外的图框可任意删除,不会对其他图框差生影响(如图2所示)。从而绘制好的图框可以被运用到其他软件中。如在Terrasolid软件中,我们要将一张完整的正射影像图分割成一个个图块,以供后期航片刺点和地形图绘制使用。
分割好的照片自动以图框中的标注命名,方便用户后期查找。(如图3所示)
3结束语
本文以VB.NET为基础,根据实际工作中的需要对AutoCAD进行了二次开发,通过实例证明了使用.NET开发CAD程序简洁高效,可针对用户的不同需要做出及时的修改等特点。以CAD为基础的多软件之间的相互引用是当前测量工作的特点,所以对它的二次开发就显得尤为重要。
VB.NET based on secondary-development-interface of Terrasolid and AutoCAD interface
Qiu Zhi-gang,Qi Ji-qiang
( Xinjiang Highway Plannig Survey Design and Research Institute,Urmqi 830006)
Abstract:This paper describes the features,principles and methods on secondary-development of Terrasolid orthophoto environment using by VB.NET ,and forms of fully automated docking with AutoCAD.Examples demonstrate the automatic generation technology of graphics, and test the operating efficiency of software in practical work , to improve production efficiency.
Key words: Terrasolid; Orthophoto;AutoCAD;The automatic generation of graphics
参考文献
[1]李冠亿编著.深入浅出AutoCAD.NET二次开发.[M].中国建筑工业出版社.2012.
[2]王文波,邹清源,张斯珩编著.AutoCAD二次开发实例教程.[M].2010.
[3]马永昌,李建民.基于VB.NET的AutoCAD数据转换研究及应用[J].测绘与空间地理信息,2010,33(3):97-99.
[4]罗照,李凯. VB(VBA)在AutoCAD2005二次开发中的应用[J]. 信息技术与信息化. 2005(05).
[5]米炜雄. 基于VB的AutoCAD二次开发及其在测绘中的应用[J]. 科技咨询导报. 2007(10).
[关键词]Terrasolid 正射影像 AutoCAD 图形自动生成
[中图分类号] P2 [文献码] B [文章编号] 1000-405X(2014)-7-232-3
0引言
作为一种通用计算机辅助设计软件,AutoCAD由于其强大的设计功能,已被应用于各行各业。然而,在实际应用中仍存在较多不足之处,如对重复工作的自动化程度较差等。因此,对AutoCAD软件进行二次开发是更有效地应用该软件的最佳途径之一。.NET结合了VC++功能强大与VBA易学易用的特点,可以快速的开发出实用的程序。本论文最终设计并实现了一个基于VB编程语言的AutoCAD二次开发软件。
1程序开发
1.1程序设计
本软件可以根据用户设定,生成带有坐标的截图框,并在图框中自动标注左下角坐标。用户在Terrasolid软件中可利用该图框对正射影像图进行截图和分图,得到的分幅图将自动以图框中的标注作为文件名。方便用户对正射影像图的后处理以及和数字地形图的坐标追踪。并可以运用到其他在面状地形图中截取线型地形图的工作中。本程序使用VS2005开发,运行于CAD2009。
1.2程序啟动
首先启动Visual Studio 2005,选择【文件】|【新建】|【项目】菜单,在项目类型中选择Visual Basic语言,然后在模板列表中选择【类库】项目,在下面的【名称】,【位置】等文本框中输入相应的内容,单击确定完成项目创建。其次在项目解决方案浏览器中右键单击项目,选择【添加引用】菜单,在CAD2009安装目录下找到acdbmgd.dll和acdmgd.dll,点击确定即自动添加。
1.3核心设计
Public Class Class1
'创建四边形
'接收用户键盘输入 起始 x,y
Dim db As Database = HostApplicationServices.WorkingDatabase
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim user_col As Double: Dim user_row As Double
Dim optPoint As New PromptPointOptions(vbCrLf & "请捕捉,或手工输入左下角坐标!
optPoint.AllowNone = True
Dim resPoint As PromptPointResult = ed.GetPoint(optPoint)
If resPoint.Status = PromptStatus.Cancel Then Return
Dim ptStart As Point3d
If resPoint.Status = PromptStatus.None Then
ptStart = New Point3d(100, 200, 0)
Else
ptStart = resPoint.Value
End If
Dim ptPrevious As Point3d = ptStart
Dim pt1 As New Point2d(ptPrevious(0), ptPrevious(1))
user_row = ModelSpace.GetUserInputRow()Ⅰ
user_col = ModelSpace.GetUserInputCol()
下面我定义了一个边长为1km为单位坐标增加量(dx = 1000, dy = 1000),用户也可以利用Input语句与用户动态的交互,得到dx,dy,以便得到不同需求四边形,从而增加程序的灵活及使用性,本文中此数值确定为1km.
之后利用For语句进行双重循环,先对列循环,完成每个图形单元(本文中为四边形)的绘制, 与此同时, 将提取到的左下角坐标(x_txt, y_txt)以特定长度(x值取4位长度,y值取3为长度)字符串拼接形式,呈现在图形单元的(Position_x, Position_y)点. 后对行循环,完成行数方向上的图形绘制.
Dim x, y As Double: Dim dx, dy As Integer
dx = 1000: dy = 1000
x = ptPrevious(0): y = ptPrevious(1)
Dim pt(4) As Point2d
Dim i_col As Integer: Dim set_txt As String
Dim Position_x As Integer: Dim Position_y As Integer
For i_Row As Integer = 0 To user_row - 1
For i_col = 0 To user_col - 1
pt(0) = New Point2d(x + i_col * dx, y + i_Row * dy) Dim y_txt As Integer = Left(x + i_col * dx, 3)
Dim x_txt As Integer = Left(y + i_Row * dy, 4)
set_txt = x_txt & "+" & y_txt
Position_x = x + i_col * dx + 200: Position_y = y + i_Row * dy + 500
Dim textId As ObjectId = ModelSpace.AddText(New Point3d(Position_x, Position_y, 0), set_txt, 75, 0)
pt(1) = New Point2d(x + (i_col + 1) * dx, y + i_Row * dy)
pt(2) = New Point2d(x + (i_col + 1) * dx, y + (i_Row + 1) * dy)
pt(3) = New Point2d(x + i_col * dx, y + (i_Row + 1) * dy)
pt(4) = New Point2d(x + i_col * dx, y + i_Row * dy)
Dim pts As New Point2dCollection(pt)
Dim plineId As ObjectId = ModelSpace.AddSquare(pts, 0)
Next
Next
End Sub
以下两段代码位于另一个类ModelSpace中,主要功能是完成与用户交互和在模型空间中绘制单个的图形(本文中为1km*1km正方形)。
Public Class ModelSpace
Public Shared Function GetUserInputRow() As Integer
' 定義一个整数的用户交互类______row.
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim jq_I_Num As New PromptIntegerOptions(vbCrLf & "请输入总行数!")
jq_I_Num.AllowNegative = False
jq_I_Num.DefaultValue = 50
Dim res_I_Num As PromptIntegerResult = ed.GetInteger(jq_I_Num)
If res_I_Num.Status = PromptStatus.OK Then
Dim user_row As Integer = res_I_Num.Value
Return user_row
End If
End Function
同理可得到用户的列数。
Public Shared Function AddSquare(ByVal p As Point2dCollection, ByVal width As Double) As ObjectId
'绘制四边形到模型空间
Try
Dim n As Integer = p.Count
Dim ent As New Polyline(n)
For i As Integer = 0 To n - 1
ent.AddVertexAt(i, p.Item(i), 0, width, width)
Next
Dim entId As ObjectId = AppendEntity(ent)
Return entId
Catch
Dim nullId As ObjectId = ObjectId.Null
Return nullId
End Try
End Function
1.4程序运行
打开CAD2009,输入netload命令,加载.dll文件。输入jt命令,可以手工输入或点选第一个四边形的左下角坐标,与用户交互后得到总的行列数。运行后可得到需要的结果(如图1所示,这里我设定了一个6*6的方格网)。用户也可以多次使用jt命令添加图框。
2应用实例
在图像外的图框可任意删除,不会对其他图框差生影响(如图2所示)。从而绘制好的图框可以被运用到其他软件中。如在Terrasolid软件中,我们要将一张完整的正射影像图分割成一个个图块,以供后期航片刺点和地形图绘制使用。
分割好的照片自动以图框中的标注命名,方便用户后期查找。(如图3所示)
3结束语
本文以VB.NET为基础,根据实际工作中的需要对AutoCAD进行了二次开发,通过实例证明了使用.NET开发CAD程序简洁高效,可针对用户的不同需要做出及时的修改等特点。以CAD为基础的多软件之间的相互引用是当前测量工作的特点,所以对它的二次开发就显得尤为重要。
VB.NET based on secondary-development-interface of Terrasolid and AutoCAD interface
Qiu Zhi-gang,Qi Ji-qiang
( Xinjiang Highway Plannig Survey Design and Research Institute,Urmqi 830006)
Abstract:This paper describes the features,principles and methods on secondary-development of Terrasolid orthophoto environment using by VB.NET ,and forms of fully automated docking with AutoCAD.Examples demonstrate the automatic generation technology of graphics, and test the operating efficiency of software in practical work , to improve production efficiency.
Key words: Terrasolid; Orthophoto;AutoCAD;The automatic generation of graphics
参考文献
[1]李冠亿编著.深入浅出AutoCAD.NET二次开发.[M].中国建筑工业出版社.2012.
[2]王文波,邹清源,张斯珩编著.AutoCAD二次开发实例教程.[M].2010.
[3]马永昌,李建民.基于VB.NET的AutoCAD数据转换研究及应用[J].测绘与空间地理信息,2010,33(3):97-99.
[4]罗照,李凯. VB(VBA)在AutoCAD2005二次开发中的应用[J]. 信息技术与信息化. 2005(05).
[5]米炜雄. 基于VB的AutoCAD二次开发及其在测绘中的应用[J]. 科技咨询导报. 2007(10).