分享

VB.net开发CAD[通用版本技巧]

 战神之家 2014-09-28

VB.net开发CAD[通用版本技巧]  

2013-06-21 10:12:43|  分类: CAD二次开发 |举报 |字号 订阅

      用.Net开发CAD一般都需要添加引用CAD的库文件,但是由于不同版本的CAD,其库文件也有很多的差别。为了避免由于版本不同而引起各种问题,特别是要求软件使用者的CAD版本与软件开发者的CAD版本一致,这种要求比较苛刻,在现实生活中也很难实现,在此介绍一种方法。下面以在CAD中绘制线、坐标、输入文字等几种常用的操作为例:
1)启动Visual Studio,选择一个开发环境,在此以Visual Basic.net开发为例。
2)添加引用您的CAD库,如AutoCAD 2004版本的库

3)添加一个按钮控件,该控件用于完成在CAD中操作,设计该按钮实现以下几个功能:

(1)启动CAD对象;

(2)保存CAD文件;

(3)在CAD文件中绘制一条根据数组数据得到的PolyLine线;

(4)在CAD文件中绘制坐标X轴、Y轴及它们的箭头;

(5)在CAD文件中输入文字。
4)代码如下:

Public Class Form1

    Public x() As Double

    Public y() As Double

    Public count As Integer

    '其中xyPolyLine线的xy坐标数组,countPolyLine线上节点的个数,即xy数组的长度。

    '为该按钮添加程序代码如下:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        On Error GoTo handle01

        Dim AcadApp As AutoCAD.AcadApplication

        On Error Resume Next

        AcadApp = GetObject(, "AutoCAD.Application") '如果CAD已经运行,则返回对CAD应用程序对象的引用,否则发生一个错误

        If Err.Number Then '如果Err.Number非零(为真)

            Err.Clear()

            AcadApp = CreateObject("AutoCAD.Application")

            If Err.Number Then

                MsgBox(Err.Description)

                Exit Sub

            End If

        End If

 

        'AcadApp.Visible = True '设置界面可视

        'AcadApp.WindowState = AutoCAD.AcWindowState.acMax '设置界面最大化

        'AppActivate(AcadApp.Caption) '显示AutoCAD界面

 

        ''---------------------------------

        ''AcadApp 不再使用时,应该使用 AcadApp=Nothing 来释放占用的内存资源

        ''---------------------------------

        Dim dg As New SaveFileDialog

        dg.Filter = "CAD文件(*.dwg)*.dwg"

        dg.ShowDialog()

        Dim savePathname As String

        savePathname = dg.FileName

        '====================================================================

        x = {0, 100, 200, 300}

        y = {0, 50, 0, 50}

        count = 4

        Dim i As Integer

        Dim points(2 * (count - 1) + 1) As Double

        For i = 0 To count - 1

            points(i * 2) = x(i)

            points(i * 2 + 1) = y(i)

        Next

        Dim Ymax As Double = y(0)

        For i = 0 To count - 1

            If Ymax < y(i) Then

                Ymax = y(i)

            End If

        Next

        AcadApp.ActiveDocument.ModelSpace.AddLightWeightPolyline(points)

        '绘制X

        Dim pointsXAxis(3), XAxisTextCord(2), XAxisArrowCord(5) As Double

        pointsXAxis(0) = 0 : pointsXAxis(1) = 0

        pointsXAxis(2) = x(count - 1) + 10 : pointsXAxis(3) = 0

        XAxisTextCord(0) = pointsXAxis(2) : XAxisTextCord(1) = pointsXAxis(3)

        XAxisArrowCord(0) = x(count - 1) : XAxisArrowCord(1) = 5

        XAxisArrowCord(2) = x(count - 1) + 10 : XAxisArrowCord(3) = 0

        XAxisArrowCord(4) = x(count - 1) : XAxisArrowCord(5) = -5

        AcadApp.ActiveDocument.ModelSpace.AddLightWeightPolyline(pointsXAxis)

        AcadApp.ActiveDocument.ModelSpace.AddText("距离", XAxisTextCord, 6)

        AcadApp.ActiveDocument.ModelSpace.AddLightWeightPolyline(XAxisArrowCord)

        '绘制Y

        Dim pointsYAxis(3), YAxisTextCord(2), YAxisArrowCord(5) As Double

        pointsYAxis(0) = 0 : pointsYAxis(1) = 0

        pointsYAxis(2) = 0 : pointsYAxis(3) = Ymax + 20

        YAxisTextCord(0) = pointsYAxis(2) : YAxisTextCord(1) = Ymax + 20

        YAxisArrowCord(0) = -5 : YAxisArrowCord(1) = Ymax + 10

        YAxisArrowCord(2) = 0 : YAxisArrowCord(3) = Ymax + 20

        YAxisArrowCord(4) = 5 : YAxisArrowCord(5) = Ymax + 10

        AcadApp.ActiveDocument.ModelSpace.AddLightWeightPolyline(pointsYAxis)

        AcadApp.ActiveDocument.ModelSpace.AddText("高程", YAxisTextCord, 6)

        AcadApp.ActiveDocument.ModelSpace.AddLightWeightPolyline(YAxisArrowCord)

        '绘制原点

        Dim XYAxisTextCord(2) As Double

        XYAxisTextCord(0) = -10 : XYAxisTextCord(1) = -10

        AcadApp.ActiveDocument.ModelSpace.AddText("0,0", XYAxisTextCord, 6)

        '====================================================================

        AcadApp.ActiveDocument.SaveAs(savePathname)

        AcadApp.Quit()

        MsgBox("保存CAD文件成功!")

        Exit Sub

handle01:

        MsgBox(Err.Description)

    End Sub

End Class

 


运行程序,点击按钮即保存了一个CAD图形文件。
VB.net开发CAD[通用版本技巧] - 逍遥客 -  海阔凭鱼跃  天高任鸟飞

 

    但是这种方式只适合在本版本的CAD中使用,对于不是这个版本的CAD将无法使用。如现在使用的是AutoCAD 2004开发的,如果用户使用的是非2004版本的,他就无法使用这个程序。为了使这种开发变得通用,只需要将程序中凡是属于CAD对象的类名称全部更改为Object,使用模糊识别的方式。如将AutoCAD.AcadApplication更改为Object,则该程序就可以在AutoCAD其它版本中使用,包括其它对象也是一样。现将按钮Click事件中代码的代码AutoCAD.AcadApplication更改为Object,运行程序,同样可以实现相同的功能,而且还可以在AutoCAD其它版本中使用,如在AutoCAD 2007中就可以使用.
此外,在CAD开发中经常要来猜对象里面的结构,如3DPolyline的具有哪些属性?如何创建它?如何设置它的高程值?如何对它进行复制、删除等编辑操作?如果不去查专业的开发帮助文档,可能很难知道它里面的结构。在编程中,可以先定义一个3DPolyline的对象,如Dim p1 As AutoCAD.Acad3DPolyline,然后通过p1的属性或方法提示就可以知道它具有哪些属性和方法,如获取第一个点的Y值坐标为p1.Coordinate(0)(1),在对它实例化时只需要将是Acad3DPolyline类型的对象赋予给p1即可。当要这个程序通用时,就将AutoCAD.Acad3DPolyline改为Object即可

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多