明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 683|回复: 10

[几何] 如何在命令中交互绘制多段线

[复制链接]
发表于 2024-10-30 23:43:28 | 显示全部楼层 |阅读模式
请问下高手们,怎样才能在自己编写的命令中交互绘制多段线(像pl命令一样,可以回退、闭合等)呢?
发表于 2024-10-31 00:18:37 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-10-31 00:48 编辑

Jig内容呀,只需要添加关键字,
u就是撤回,撤回就是队列上面移除,
c就是闭合,
这些IFox内都封装好了...
https://gitee.com/inspirefunctio ... stShared/TestJig.cs


还是最美的几个封装之一,
让你不再写继承,而是通过队列和委托实现定义.
 楼主| 发表于 2024-10-31 10:42:00 | 显示全部楼层
你有种再说一遍 发表于 2024-10-31 00:18
Jig内容呀,只需要添加关键字,
u就是撤回,撤回就是队列上面移除,
c就是闭合,

我通过其他方式已经解决了,jig没接触过,对我来说还是有点难
发表于 2024-10-31 14:51:32 | 显示全部楼层
changyiran 发表于 2024-10-31 10:42
我通过其他方式已经解决了,jig没接触过,对我来说还是有点难

新人最忌讳的就是没有摸全再干,要通过一个个测试慢慢摸会
发表于 2024-11-30 17:42:47 来自手机 | 显示全部楼层
changyiran 发表于 2024-10-31 10:42
我通过其他方式已经解决了,jig没接触过,对我来说还是有点难

怎么实现的,厉害
回复 支持 反对

使用道具 举报

发表于 2024-11-30 17:47:52 来自手机 | 显示全部楼层
羊羊羊 发表于 2024-11-30 17:42
怎么实现的,厉害

不用jip.是不是 选择点时从前点 拉出一根线
回复 支持 反对

使用道具 举报

发表于 2024-12-2 11:51:48 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2024-12-13 11:32:52 | 显示全部楼层
Public Class MyPlineCmds

    <CommandMethod("MYPOLY")> _
    Public Sub MyPoly()

        '定义AutoCAD的文档对象(net)'获取当前文件
        acDoc = AppAcad.DocumentManager.MdiActiveDocument

        '获得当前文档的编辑器(Net)'获取当前命令行对象
        acEdit = acDoc.Editor

        '得到当前文档图形数据库
        Dim db As Database = HostApplicationServices.WorkingDatabase

        '原始点(绘制橡皮线的基点)
        Dim OldPoint As New Point2d
        '拾取的当前点
        Dim curPoint As New Point2d


        ' Get the current UCS
        Dim ucs As Matrix3d = acEdit.CurrentUserCoordinateSystem
        Dim origin As New Point3d(0, 0, 0)
        Dim normal As New Vector3d(0, 0, 1)
        normal = normal.TransformBy(ucs)

        'Create a temporary plane
        Dim plane As New Plane(origin, normal)

        ' Get the current color
        Dim col As Color = acDoc.Database.Cecolor


        '定义一个点拖动交互类
        Dim PointOpt As New PromptPointOptions("")
        'Dim PointOpt As New PromptPointOptions(vbLf & "Select polyline vertex: ")

        '允许输入空值(未选择直接按回车键)
        PointOpt.AllowNone = True

        '.Keywords.Add("Undo", "Undo", "放弃(U)")
        '.Keywords.Add("U", "U", "撤回(U)")

        Dim acPoly As New Polyline

        Do

            If acPoly.NumberOfVertices = 0 Then

                '当acPoly图元还未创建时,只需询问起点即可
                PointOpt.Message = vbLf & "指定起点[退出<esc>]:"

                '关闭绘制一条橡皮线.不然从原点会拉出橡皮线
                PointOpt.UseBasePoint = False

            ElseIf acPoly.NumberOfVertices > 0 Then

                '当acPoly图元已存在时,从老点拉出橡皮线
                PointOpt.SetMessageAndKeywords(vbLf & "指定下一点或 [放弃(U)]: ", "U")

                'UseBasePoint和BasePoint属性控制是否从基点绘制一条橡皮线
                PointOpt.UseBasePoint = True

                '设置拖动光标基点
                PointOpt.BasePoint = New Point3d(OldPoint.X, OldPoint.Y, 0)

            End If

            '在CAD图中拾取点坐标
            Dim PointRes As PromptPointResult = acEdit.GetPoint(PointOpt)

            curPoint = PointRes.Value.Convert2d(New Plane)

            '如果用户按了 ESC 键或取消了命令就退出
            If PointRes.Status = PromptStatus.None Or PointRes.Status = PromptStatus.Cancel Then
                Exit Do
            End If


            '当点被选择到的OK状态
            If PointRes.Status = PromptStatus.OK Then

                '当acPoly图元已经存在时
                If acPoly.NumberOfVertices >= 1 Then

                    '启动一个事务
                    Using Trans As Transaction = db.TransactionManager.StartTransaction()

                        '升级图元对象为可写
                        acPoly.UpgradeOpen()

                        Dim Ncount As Integer = acPoly.NumberOfVertices

                        acPoly.AddVertexAt(Ncount, curPoint, 0, 0, 0)

                        Trans.Commit() ''提交事务处理以实现真实

                    End Using

                    OldPoint = curPoint

                End If

                '当acPoly图元不存在时
                If acPoly.NumberOfVertices = 0 Then

                    ''在内存中创建多段线<polyline>
                    acPoly = New Polyline()
                    acPoly.SetDatabaseDefaults()
                    acPoly.AddVertexAt(0, curPoint, 0, 0, 0)

                    '调用AppendEntity函数,将图形对象加入到模型空间.
                    Call AppendEntity(acPoly)

                    OldPoint = curPoint

                End If

            End If

            '当点选获取了用户输入关键字时
            If PointRes.Status = PromptStatus.Keyword Then

                If PointRes.StringResult.ToUpper = "U" Then

                    '启动一个事务,根据 ObjectId 得到 DBobject

                    Using Trans As Transaction = db.TransactionManager.StartTransaction()

                        '升级图元对象为可写
                        acPoly.UpgradeOpen()

                        Dim Ncount As Integer = acPoly.NumberOfVertices

                        If Ncount >= 2 Then
                            acPoly.RemoveVertexAt(Ncount - 1)
                        End If

                        Trans.Commit() '提交事务处理以实现真实

                    End Using

                    OldPoint = acPoly.GetPoint2dAt(acPoly.NumberOfVertices - 1)

                End If

            End If


        Loop


        acEdit.Regen()

    End Sub

End Class
回复 支持 反对

使用道具 举报

发表于 2024-12-13 11:36:07 | 显示全部楼层
上面的代码是我自己琢磨出来的,没有用jip,只用了 PointOpt.UseBasePoint = true 从原点会拉出橡皮线。希望对大家有帮助。
回复 支持 反对

使用道具 举报

发表于 2024-12-13 22:29:41 | 显示全部楼层
羊羊羊 发表于 2024-12-13 11:36
上面的代码是我自己琢磨出来的,没有用jip,只用了 PointOpt.UseBasePoint = true 从原点会拉出橡皮线。希 ...

阿羊怎么还在敲VB,是时候来学IFox了,大把函数都已经敲好了,各种优美封装...
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 12:34 , Processed in 0.167290 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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