乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 161|回复: 8

利用VB写的随鼠标移动的图形

[复制链接]

1

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
7
发表于 2008-1-24 11:25:00 | 显示全部楼层 |阅读模式
Imports Autodesk..Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common
Public Class Class1
     _
    Public Sub test()
        Dim ed As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
        Dim sd As New MotionalMousePoint
        AddHandler ed.PointFilter, AddressOf sd.GetMousePoint
        Dim pro As PromptPointOptions = New PromptPointOptions("请选择插入点...")
        ed.GetPoint(pro)
        RemoveHandler ed.PointFilter, AddressOf sd.GetMousePoint
    End Sub
End Class
Public Class MotionalMousePoint
    Private MousePoint As Point3d = New Point3d(0, 0, 0) '保存当前鼠标位置      
    ''动态获取鼠标位置   
    Public Sub GetMousePoint(ByVal sender As Object, ByVal e As PointFilterEventArgs)
        MousePoint = e.Context.ComputedPoint
        Dim m_ed As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
        DelegateTest(MousePoint, AddressOf ObjectMove2Mouse)
    End Sub
    Delegate Sub MathOperator(ByVal pt As Point3d)
    Sub DelegateTest(ByVal pt As Point3d, ByVal op As MathOperator)
        op.Invoke(pt)
    End Sub
    Public Sub ObjectMove2Mouse(ByVal pt As Point3d)
        Dim acadApp As AcadApplication = CType(Application.AcadApplication, AcadApplication)
        Dim acadDoc As AcadDocument = acadApp.ActiveDocument
        Try
            Static blnFirst As Boolean = False
            Static blnFst As Boolean = False
            Static objTem(2) As AcadObject
            Dim cirObj As AcadCircle
            Dim center(2) As Double
            Dim radius As Double
            Dim lineObj As AcadLine
            Dim sPnt(2), ePnt(2) As Double
            Dim textObj As AcadText
            Dim istPoint(2) As Double
            center(0) = pt(0) + 0 : center(1) = pt(1) + 0 : center(2) = pt(2) + 0 : radius = 50
            sPnt(0) = center(0) : sPnt(1) = center(1) : sPnt(2) = 0
            ePnt(0) = center(0) + 100 : ePnt(1) = center(1) + 100 : ePnt(2) = 0
            istPoint(0) = center(0) : istPoint(1) = center(1) : istPoint(2) = center(2)
            If blnFirst = True Then
                For i As Integer = 0 To 2
                    objTem(i).Delete()    '删除上次绘制的对象
                Next
                cirObj = acadDoc.ModelSpace.AddCircle(center, radius)  '创建一个圆对象
                cirObj.color = ACAD_COLOR.acRed                     '将圆的颜色设为红色
                lineObj = acadDoc.ModelSpace.AddLine(sPnt, ePnt)   '创建一条直线
                lineObj.Lineweight = ACAD_LWEIGHT.acLnWt060
                textObj = acadDoc.ModelSpace.AddText("哈!成了。", istPoint, 15) '创建单行文字
                textObj.color = ACAD_COLOR.acWhite
                objTem(0) = cirObj
                objTem(1) = lineObj
                objTem(2) = textObj
            Else
                cirObj = acadDoc.ModelSpace.AddCircle(center, radius)    '创建一个圆对象
                cirObj.color = ACAD_COLOR.acRed                      '将圆的颜色设为红色               
                lineObj = acadDoc.ModelSpace.AddLine(sPnt, ePnt)    '创建一条直线
                lineObj.Lineweight = ACAD_LWEIGHT.acLnWt060
                textObj = acadDoc.ModelSpace.AddText("哈!成了。", istPoint, 15) '创建单行文字
                textObj.color = ACAD_COLOR.acWhite
                objTem(0) = cirObj
                objTem(1) = lineObj
                objTem(2) = textObj
                blnFirst = True
            End If
        Catch ex As Exception
        End Try
    End Sub
End Class
回复

使用道具 举报

10

主题

31

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
71
发表于 2008-1-27 09:59:00 | 显示全部楼层
加入鼠标事件方法值得借鉴,但采用不断加入数据库对象、再不断删除的方法来实现动态显示的方法不可取
回复

使用道具 举报

1

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
7
发表于 2008-1-28 21:08:00 | 显示全部楼层
重新修改为利用块移动
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common
Public Class Class1
     _
    Public Sub test()
        Dim ed As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
        Dim sd As New MotionalMousePoint
        AddHandler ed.PointFilter, AddressOf sd.GetMousePoint
        Dim pro As PromptPointOptions = New PromptPointOptions("请选择插入点...")
        ed.GetPoint(pro)
        RemoveHandler ed.PointFilter, AddressOf sd.GetMousePoint
    End Sub
End Class
Public Class MotionalMousePoint
    Private MousePoint As Point3d = New Point3d(0, 0, 0) '保存当前鼠标位置      
    ''动态获取鼠标位置   
    Public Sub GetMousePoint(ByVal sender As Object, ByVal e As PointFilterEventArgs)
        MousePoint = e.Context.ComputedPoint
        Dim m_ed As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
        DelegateTest(MousePoint, AddressOf Move2Mouse)
    End Sub
    Delegate Sub MathOperator(ByVal pt As Point3d)
    Sub DelegateTest(ByVal pt As Point3d, ByVal op As MathOperator)
        op.Invoke(pt)
    End Sub
    Public Sub Move2Mouse(ByVal pt As Point3d)
        Dim acadApp As AcadApplication = CType(Application.AcadApplication, AcadApplication)
        Dim acaddoc As AcadDocument = acadApp.ActiveDocument
        Try
            Static blnFirst As Boolean = False
            Static basePoint As Object
            Static blkRefObj As AcadBlockReference
            Dim insertPnt(2) As Double
            insertPnt(0) = pt(0) + 0 : insertPnt(1) = pt(1) + 0 : insertPnt(2) = pt(2) + 0    '指定模型空间的插入点
            Dim blkObject As AcadBlock
            Dim blkName As String = ""
            Dim blk As New CreateBlock
            For Each blkObject In acaddoc.Blocks()
                If blkObject.Name = "TestBlock1" And blnFirst = False Then
                    blkName = blkObject.Name
                    blkRefObj = acaddoc.ModelSpace.InsertBlock(insertPnt, blkName, 1.0#, 1.0#, 1.0#, 0.0#)    '插入图块
                    basePoint = blkRefObj.InsertionPoint
                    blnFirst = True
                    Exit For
                End If
            Next
            If blnFirst = True Then
                blkRefObj.Move(basePoint, insertPnt)
                basePoint = blkRefObj.InsertionPoint
            Else
                blkRefObj = blk.CreateBlock()
                blkRefObj.Delete()
                'blkRefObj.Update()
                'acaddoc.Regen(AcRegenType.acActiveViewport)
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
End Class
Public Class CreateBlock
    Public Function CreateBlock() As AcadBlockReference
        Dim acadApp As AcadApplication = CType(Application.AcadApplication, AcadApplication)
        Dim acaddoc As AcadDocument = acadApp.ActiveDocument
        Dim blkObj As AcadBlock
        Dim insPnt(2) As Double
        Dim blkRefObj As AcadBlockReference
        Dim insertPnt(2) As Double
        insPnt(0) = 0 : insPnt(1) = 0 : insPnt(2) = 0
        insertPnt(0) = 0 : insertPnt(1) = 0 : insertPnt(2) = 0    '指定模型空间的插入点
        blkObj = acaddoc.Blocks.Add(insPnt, "TestBlock1") '在Blocks集合中创建名为TestBlock1的块对象
        '本段代码将在TestBlock1块对象中创建2个图元对象
        Dim cirObj As AcadCircle
        Dim center(0 To 2) As Double
        Dim radius As Double
        center(0) = 0 : center(1) = 0 : center(2) = 0 : radius = 38
        Dim lineObj As AcadLine
        Dim sPnt(2), ePnt(2) As Double
        sPnt(0) = center(0) : sPnt(1) = center(1) : sPnt(2) = 0
        ePnt(0) = center(0) + 60 : ePnt(1) = center(1) + 80 : ePnt(2) = 0
        cirObj = blkObj.AddCircle(center, radius)    '创建一个圆对象
        cirObj.color = ACAD_COLOR.acRed          '将圆的颜色设为红色
        lineObj = blkObj.AddLine(sPnt, ePnt)     '创建一条直线
        blkRefObj = acaddoc.ModelSpace.InsertBlock(insertPnt, "TestBlock1", 1.0#, 1.0#, 1.0#, 0.0#)    '插入图块
        Return blkRefObj
    End Function
End Class
回复

使用道具 举报

0

主题

7

帖子

3

银币

初来乍到

Rank: 1

铜币
7
发表于 2008-3-5 09:57:00 | 显示全部楼层
十分感谢!!
学习一下
回复

使用道具 举报

23

主题

122

帖子

7

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
214
发表于 2008-3-28 11:34:00 | 显示全部楼层
我现在也用的是这种方法,但还是有一些缺点:
1.需要删除添回循环;
2.移动过的地方都会留下对象捕捉点,使CAD中的对象捕捉功能不能很好利用;
3.不能像CAD中移动功能一样移动
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2008-3-29 11:38:00 | 显示全部楼层
没有详细看!只是这类问题不能利用Jig类吗?
回复

使用道具 举报

0

主题

12

帖子

5

银币

初来乍到

Rank: 1

铜币
12
发表于 2008-6-29 17:04:00 | 显示全部楼层
收藏下来了,有时间学习学习
回复

使用道具 举报

15

主题

22

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
82
发表于 2008-9-20 11:17:00 | 显示全部楼层
我赞成SIEBEN的想法,我利用EntityJig类已编出代码,也比较好用.网上有关于这方面的资料.
回复

使用道具 举报

24

主题

59

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
155
发表于 2015-1-7 18:32:00 | 显示全部楼层
这个只能说明是一个例子。实际应用是采用这样的方便是下策!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-28 19:07 , Processed in 4.121540 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表