Zooming to a window or entity inside AutoCAD



https://through-the-interface.typepad.com/thro ... 2008/06/zooming-to-a-wi.html

Zooming to a window or entity inside AutoCAD with .NET

程序代码:
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.ApplicationServices

Namespace ZoomZoom
    Public Class Commands
        ' Zoom to a window specified by the user
        <CommandMethod("ZW")> _
        Public Shared Sub ZoomWindow()
            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor

            ' Get the window coordinates

            Dim ppo As New PromptPointOptions(vbLf & "Specify first corner:")
            Dim ppr As PromptPointResult = ed.GetPoint(ppo)
            If ppr.Status <> PromptStatus.OK Then
                Return
            End If
            Dim min As Point3d = ppr.Value
            Dim pco As New PromptCornerOptions(vbLf & "Specify opposite corner: ", ppr.Value)
            ppr = ed.GetCorner(pco)
            If ppr.Status <> PromptStatus.OK Then
                Return
            End If
            Dim max As Point3d = ppr.Value
            
            ' Call out helper function
            ' [Change this to ZoomWin2 or WoomWin3 to
            ' use different zoom techniques]
            ZoomWin(ed, min, max)
        End Sub

        ' Zoom to the extents of an entity
        <CommandMethod("ZE")> _
        Public Shared Sub ZoomToEntity()
            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor
            ' Get the entity to which we'll zoom
            Dim peo As New PromptEntityOptions(vbLf & "Select an entity:")
            Dim per As PromptEntityResult = ed.GetEntity(peo)
            If per.Status <> PromptStatus.OK Then
                Return
            End If
            ' Extract its extents
            Dim ext As Extents3d
            Dim tr As Transaction = db.TransactionManager.StartTransaction()
            Using tr
                Dim ent As Entity = CType(tr.GetObject(per.ObjectId, OpenMode.ForRead), Entity)
                ext = ent.GeometricExtents
                tr.Commit()
            End Using
            ext.TransformBy(ed.CurrentUserCoordinateSystem.Inverse())
            ' Call our helper function
            ' [Change this to ZoomWin2 or WoomWin3 to
            ' use different zoom techniques]
            ZoomWin(ed, ext.MinPoint, ext.MaxPoint)
        End Sub
        ' Helper functions to zoom using different techniques
        ' Zoom using a view object
        Private Shared Sub ZoomWin(ed As Editor, min As Point3d, max As Point3d)
            Dim min2d As New Point2d(min.X, min.Y)
            Dim max2d As New Point2d(max.X, max.Y)
            Dim view As New ViewTableRecord()
            view.CenterPoint = min2d + ((max2d - min2d) / 2.0)
            view.Height = max2d.Y - min2d.Y
            view.Width = max2d.X - min2d.X
            ed.SetCurrentView(view)
        End Sub

        ' Zoom via COM
        Private Shared Sub ZoomWin2(ed As Editor, min As Point3d, max As Point3d)
            Dim app As AcadApplication = CType(Application.AcadApplication, AcadApplication)
            Dim lower As Double() = New Double(3) {min.X, min.Y, min.Z}
            Dim upper As Double() = New Double(3) {max.X, max.Y, max.Z}
            app.ZoomWindow(lower, upper)
        End Sub
        ' Zoom by sending a command
        Private Shared Sub ZoomWin3(ed As Editor, min As Point3d, max As Point3d)
            Dim lower As String = min.ToString().Substring(1, min.ToString().Length - 2)
            Dim upper As String = max.ToString().Substring(1, max.ToString().Length - 2)
            Dim cmd As String = "_.ZOOM _W " + lower + " " + upper + " "
            ' Call the command synchronously using COM
            Dim app As AcadApplication = CType(Application.AcadApplication, AcadApplication)
            app.ActiveDocument.SendCommand(cmd)
            ' Could also use async command calling:
            'ed.Document.SendStringToExecute(
            '  cmd, true, false, true
            ');
        End Sub
    End Class
End Namespace




祝融之灾也就是火灾



欢迎关注微信公众账号ByCAD