乐筑天下

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

一起来学VB.net(6,实现BOUNDARY命令)

[复制链接]

10

主题

45

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2014-3-13 16:57:00 | 显示全部楼层 |阅读模式
读贴之前可以先看下CAD官方的代码,net实现
命令行实现
net自带的api功能太简单,只让输入一个点参数
但是我们知道CAD的boundary命令很强大,它可以输入一个选择集,只对这个选择集进行boundary.在同事(lsp高手LLXXZZ)的帮助下,我用net封装了这个功能,当然是通过同步发送命令行实现的。
这里只写了对一个物件进行boundary,你也可以修改成对一个选择集进行boundary.
            '获取bo重新生成后的多段线(☆☆☆☆命令的执行模式必须为应用程序环境中执行
Public Class GetBoo
                Dim m_crv As Curve = Nothing, m_rebuildcrv As Curve = Nothing, m_delete As Boolean
                Shared commandName As String = ""
                Dim doc As Document = Application.DocumentManager.MdiActiveDocument
                Dim db As Database = doc.Database
                Dim ed As Editor = doc.Editor
                Private Shared Function IsCommandActive() As Boolean
                    Dim str As [String] = DirectCast(Application.GetSystemVariable("CMDNAMES"), [String])
                    If [String].Compare(commandName, str, True)  0 Then
                        Return True
                    End If
                    Return False
                End Function
                Public Sub New(crv As Curve, delete As Boolean)
                    Try
                        m_crv = crv
                        m_delete = delete
                        Dim Mhandle As String = "", rightcrv As Curve = Nothing, offsetdistance As Double = 0.1
                        Using tr As Transaction = db.TransactionManager.StartTransaction
                            Mhandle = m_crv.AcadObject.Handle
                            '   Dim crvdis As Double = m_crv.GeometricExtents.MaxPoint.DistanceTo(m_crv.GeometricExtents.MinPoint)
                            Dim dbobjts1 As DBObjectCollection = m_crv.GetOffsetCurves(offsetdistance)
                            Dim dbobjts2 As DBObjectCollection = m_crv.GetOffsetCurves(-offsetdistance)
                            If dbobjts1.Count  len2 Then
                                rightcrv = CType(dbobjts2.Item(0), Curve)
                            Else
                                rightcrv = CType(dbobjts1.Item(0), Curve)
                            End If
                        End Using
                        Dim innerpt As Point3d = rightcrv.StartPoint
                        Dim ptarray As Double() = {innerpt.X, innerpt.Y, innerpt.Z}
                        'SegZoom.Zoom(New Point3d, New Point3d, innerpt, 2 * offsetdistance)
                        Application.AcadApplication.ZoomCenter(ptarray, 2 * offsetdistance)
                        'MsgBox("dd")
                        Dim ptstr As String = String.Format(" {0},{1} ", innerpt.X, innerpt.Y)
                        Dim cmdecho As Integer = Application.GetSystemVariable("CMDECHO")
                        Application.SetSystemVariable("CMDECHO", 0)
                        commandName = DirectCast(Application.GetSystemVariable("CMDNAMES"), [String])
                        Dim GetBoundry As String = "._-boundary A B N !(handent """ + Mhandle + """" + ")" + vbCr + vbCr + ptstr + vbCr
                        ' InputBox("", "", GetBoundry)
                        ' Dim GetBoundry As String = "(vl-cmdf " + """" + "._-boundary" + """" + " " + """" + "A" + """" + " " + """" + "B" + """" + " " + """" + "N" + """" + " " + "(handent """ + Mhandle + """" + ")" + """" + """" + " " + """" + """" + ptstr + """" + """" + ")" + vbCr
                        ' Dim comboundry As String = ._-boundary A B N !(handent "58D")"" ""'(1.51325142283495 0.422664600584449 0)""
                        AddHandler db.ObjectAppended, AddressOf db_ObjectAppended
                        ' doc.SendStringToExecute(GetBoundry, True, True, False)
                        ' Application.AcadApplication.ActiveDocument.SendCommand(GetBoundry)
                        'WPF.UI.Pause(2)
                        Dim dataArry As Object() = New Object(0) {}
                        dataArry(0) = GetBoundry
                        doc.AcadDocument.[GetType]().InvokeMember("SendCommand", Reflection.BindingFlags.InvokeMethod, Nothing, doc.AcadDocument, dataArry)
                        'If IsCommandActive() = True Then
                        '    dataArry(0) = "Yes "
                        '    doc.AcadDocument.[GetType]().InvokeMember("SendCommand", Reflection.BindingFlags.InvokeMethod, Nothing, doc.AcadDocument, dataArry)
                        'End If
                        RemoveHandler db.ObjectAppended, AddressOf db_ObjectAppended
                        Application.SetSystemVariable("CMDECHO", cmdecho)
                        Application.AcadApplication.ZoomPrevious()
                        If m_delete Then
                            Using dblock As DocumentLock = doc.LockDocument
                                Using tr As Transaction = db.TransactionManager.StartTransaction
                                    'Dim bt As BlockTable = DirectCast(tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead), BlockTable)
                                    ' Dim ms As BlockTableRecord = DirectCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
                                    Dim mcrv As Curve = RebuildCrv.ObjectId.GetObject(OpenMode.ForWrite)
                                    mcrv.Erase(True)
                                    tr.Commit()
                                End Using
                            End Using
                        End If
                    Catch ex As Exception
                        MsgBox(ex.Message + Environment.NewLine + ex.StackTrace + Environment.NewLine + "请联系作者61692!")
                    End Try
                End Sub
                Public ReadOnly Property RebuildCrv As Curve
                    Get
                        Return m_rebuildcrv
                    End Get
                End Property
                Private Sub db_ObjectAppended(sender As Object, e As ObjectEventArgs)
                    'add the object id
                    m_rebuildcrv = CType(e.DBObject, Curve) '最后一次添加的物件才是重新生成合并的线,前几次是断线
                End Sub
            End Class

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2014-3-13 17:30:00 | 显示全部楼层
Editor.TraceBoundary
回复

使用道具 举报

89

主题

410

帖子

8

银币

中流砥柱

Rank: 25

铜币
766
发表于 2014-3-19 21:06:00 | 显示全部楼层
其实就是同步调用command,可以用两种方法实现,我有个例子,希望对你有用!
http://www.cnblogs.com/swtool/p/SWTOOL_00012.html
回复

使用道具 举报

10

主题

45

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2014-3-20 12:33:00 | 显示全部楼层

看到了,第一个是通过反射,第二个是dll注入点的方式调用的arx函数,都很不错。不过如果执行的lsp代码很长,可能写起来比较麻烦--
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:16 , Processed in 0.364123 second(s), 60 queries .

© 2020-2025 乐筑天下

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