明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2203|回复: 2

在UCS下画线出现问题

[复制链接]
发表于 2010-8-6 12:00:00 | 显示全部楼层 |阅读模式

如题,为什么我第二次画的线和第三次画的线重合?代码如下:

'CAD
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common
Public Class Form1
    Dim AcadApp As AcadApplication
    Dim thisdrawing As AcadDocument
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            AcadApp = GetObject("autocad.application")
        Catch ex As Exception
            Try
                AcadApp = CreateObject("autocad.application")
            Catch ex1 As Exception
                MsgBox("无法打开AutoCAD")
                Exit Sub
            End Try
        End Try
        AcadApp.Visible = True
        AppActivate(AcadApp.Caption)
        thisdrawing = AcadApp.ActiveDocument
        For i = 1 To 3
            Dim origin(0 To 2) As Double
            Call AddLine_UCS(1, 1, 0, 12, 12, 0)
            'Dim origin(0 To 2) As Double
            origin(0) = 8 : origin(1) = 8 : origin(2) = 0
            Call MoveOriginUCS(origin, "MyUcs")
        Next

    End Sub
    '通过移动坐标原点定义坐标系
    Public Function MoveOriginUCS(ByVal originWcs As Object, ByVal ucsName As String) As AcadUCS
        ' 获得新UCS原点在当前UCS中的坐标
        Dim originUcs As Object
        originUcs = TranslatePointWcsToUcs(originWcs)

        ' 获得X、Y正半轴上任一点的UCS坐标
        Dim ptXUcs(0 To 2) As Double, ptYUcs(0 To 2) As Double
        ptXUcs(0) = originUcs(0) + 1
        ptXUcs(1) = originUcs(1)
        ptXUcs(2) = originUcs(2)
        ptYUcs(0) = originUcs(0)
        ptYUcs(1) = originUcs(1) + 1
        ptYUcs(2) = originUcs(2)

        ' 获得X、Y正半轴上任一点的WCS坐标
        Dim ptXWcs As Object, ptYWcs As Object
        originWcs = TranslatePointUcsToWcs(originUcs)
        ptXWcs = TranslatePointUcsToWcs(ptXUcs)
        ptYWcs = TranslatePointUcsToWcs(ptYUcs)

        ' 创建UCS
        MoveOriginUCS = thisdrawing.UserCoordinateSystems.Add(originWcs, ptXWcs, ptYWcs, ucsName)
        'MoveOriginUCS = thisdrawing.UserCoordinateSystems.Add(originUcs, ptXUcs, ptYUcs, ucsName)
        '' 显示 UCS 图标
        'thisdrawing.ActiveViewport.UCSIconAtOrigin = True
        'thisdrawing.ActiveViewport.UCSIconOn = True
        '' 使新的 UCS 成为活动的 UCS
        'thisdrawing.ActiveUCS = MoveOriginUCS
    End Function
    ' 将点的坐标从UCS转换到WCS
    Public Function TranslatePointUcsToWcs(ByVal ucsPoint As Object) As Object
        Debug.Assert(VarType(ucsPoint) = vbArray + vbDouble)
        Debug.Assert(LBound(ucsPoint) = 0 And UBound(ucsPoint) = 2)
        TranslatePointUcsToWcs = thisdrawing.Utility.TranslateCoordinates(ucsPoint, AcCoordinateSystem.acUCS, AcCoordinateSystem.acWorld, False)
    End Function

    ' 将点的坐标从WCS转换到UCS
    Public Function TranslatePointWcsToUcs(ByVal wcsPoint As Object) As Object
        Debug.Assert(VarType(wcsPoint) = vbArray + vbDouble)
        Debug.Assert(LBound(wcsPoint) = 0 And UBound(wcsPoint) = 2)
        TranslatePointWcsToUcs = thisdrawing.Utility.TranslateCoordinates(wcsPoint, AcCoordinateSystem.acWorld, AcCoordinateSystem.acUCS, False)
    End Function
    Public Function AddLine_UCS(ByVal p1x As Double, ByVal p1y As Double, ByVal p1z As Double, ByVal p2x As Double, ByVal p2y As Double, ByVal p2z As Double) As AcadLine
        ' 保存当前的UCS
        Dim curUcs As AcadUCS
        curUcs = GetActiveUCS()
        ' 返回到WCS
        thisdrawing.ActiveUCS = GetWCS()
        Dim ptStart(2) As Double
        Dim ptEnd(2) As Double
        ptStart(0) = p1x
        ptStart(1) = p1y
        ptStart(2) = p1z

        ptEnd(0) = p2x
        ptEnd(1) = p2y
        ptEnd(2) = p2z

        ' 在WCS中创建轻量多段线
        Dim objLine As AcadLine
        objLine = thisdrawing.ModelSpace.AddLine(ptStart, ptEnd)

        ' 恢复保存的UCS
        thisdrawing.ActiveUCS = curUcs

        ' 对长方体进行变换
        Dim transMatrix As Object
        transMatrix = curUcs.GetUCSMatrix()
        objLine.TransformBy(transMatrix)
        objLine.Update()

        AddLine_UCS = objLine
    End Function
    Public Function GetWCS() As AcadUCS
        ' 定义创建UCS的三个点
        Dim ptOrigin(2) As Double, ptXAxis(2) As Double, ptYAxis(2) As Double
        ptOrigin(0) = 0 : ptOrigin(1) = 0 : ptOrigin(2) = 0
        ptXAxis(0) = 1 : ptXAxis(1) = 0 : ptXAxis(2) = 0
        ptYAxis(0) = 0 : ptYAxis(1) = 1 : ptYAxis(2) = 0
        GetWCS = thisdrawing.UserCoordinateSystems.Add(ptOrigin, ptXAxis, ptYAxis, "WCS")
    End Function
    Public Function GetActiveUCS() As AcadUCS
        If thisdrawing.GetVariable("UCSNAME") = "" Then
            Dim ptOrigin(2) As Double       ' 要创建的UCS的原点
            Dim ptXAxis(2) As Double        ' UCS的X轴正半轴上一点
            Dim ptYAxis(2) As Double        ' UCS的Y轴正半轴上一点
            Dim xDir, yDir, org As Object  ' 当前UCS的参数

            ' 获得当前UCS的参数
            xDir = thisdrawing.GetVariable("UCSXDIR")
            yDir = thisdrawing.GetVariable("UCSYDIR")
            org = thisdrawing.GetVariable("UCSORG")

            ' UCS的原点
            ptOrigin(0) = org(0)
            ptOrigin(1) = org(1)
            ptOrigin(2) = org(2)

            ' 获得UCS的X轴正半轴上的一点
            ptXAxis(0) = org(0) + xDir(0)
            ptXAxis(1) = org(1) + xDir(1)
            ptXAxis(2) = org(2) + xDir(2)

            ' 获得UCS的Y轴正半轴上的一点
            ptYAxis(0) = org(0) + yDir(0)
            ptYAxis(1) = org(1) + yDir(1)
            ptYAxis(2) = org(2) + yDir(2)

            ' 创建和当前UCS重合的UCS
            GetActiveUCS = thisdrawing.UserCoordinateSystems.Add(ptOrigin, ptXAxis, ptYAxis, "MyUCS")

            thisdrawing.ActiveUCS = GetActiveUCS
        Else
            GetActiveUCS = thisdrawing.ActiveUCS
        End If
    End Function
End Class

 楼主| 发表于 2010-8-10 10:53:00 | 显示全部楼层
问题已经解决了!
发表于 2013-5-22 17:28:04 | 显示全部楼层
楼上是怎么解决的啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 13:52 , Processed in 0.176234 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表