https://through-the-interface.typepad.com/thro ... 2008/06/zooming-to-a-wi.htmlZooming 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