Make A Tiled Viewport Current
 
 
 

You enter points and select objects in the current viewport. To make a viewport current, use the CVPORT system variable and specify the viewport by its number that you want to set current.

You can iterate through existing viewports to find a particular viewport. To do this, identify the Viewport table records with the name "*Active" using the Name property.

Split a viewport, then iterate through the windows

This example splits the active viewport into two horizontal windows. It then iterates through all the tiled viewports in the drawing and displays the viewport name and the lower-left and upper-right corner for each viewport.

VB.NET

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry
 
<CommandMethod("SplitAndIterateModelViewports")> _
Public Sub SplitAndIterateModelViewports()
  '' Get the current database
  Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  Dim acCurDb As Database = acDoc.Database
 
  '' Start a transaction
  Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
 
      '' Open the Viewport table for write
      Dim acVportTbl As ViewportTable
      acVportTbl = acTrans.GetObject(acCurDb.ViewportTableId, _
                                     OpenMode.ForWrite)
 
      '' Open the active viewport for write
      Dim acVportTblRec As ViewportTableRecord
      acVportTblRec = acTrans.GetObject(acDoc.Editor.ActiveViewportId, _
                                        OpenMode.ForWrite)
 
      Dim acVportTblRecNew As ViewportTableRecord = New ViewportTableRecord()
 
      '' Add the new viewport to the Viewport table and the transaction
      acVportTbl.Add(acVportTblRecNew)
      acTrans.AddNewlyCreatedDBObject(acVportTblRecNew, True)
 
      '' Assign the name '*Active' to the new Viewport
      acVportTblRecNew.Name = "*Active"
 
      '' Use the existing lower left corner for the new viewport
      acVportTblRecNew.LowerLeftCorner = acVportTblRec.LowerLeftCorner
      '' Get half the X of the existing upper corner
      acVportTblRecNew.UpperRightCorner = New Point2d(acVportTblRec.UpperRightCorner.X, _
                                                      acVportTblRec.LowerLeftCorner.Y + _
                                                      ((acVportTblRec.UpperRightCorner.Y - _
                                                        acVportTblRec.LowerLeftCorner.Y) / 2))
      '' Recalculate the corner of the active viewport
      acVportTblRec.LowerLeftCorner = New Point2d(acVportTblRec.LowerLeftCorner.X, _
                                                  acVportTblRecNew.UpperRightCorner.Y)
 
      '' Update the display with the new tiled viewports arrangement
      acDoc.Editor.UpdateTiledViewportsFromDatabase()
 
      '' Step through each object in the symbol table
      For Each acObjId As ObjectId In acVportTbl
          '' Open the object for read
          Dim acVportTblRecCur As ViewportTableRecord
          acVportTblRecCur = acTrans.GetObject(acObjId, _
                                               OpenMode.ForRead)
 
          If (acVportTblRecCur.Name = "*Active") Then
              Application.SetSystemVariable("CVPORT", acVportTblRecCur.Number)
 
              Application.ShowAlertDialog("Viewport: " & acVportTblRecCur.Number & _
                                          " is now active." & _
                                          vbLf & "Lower left corner: " & _
                                          acVportTblRecCur.LowerLeftCorner.X & ", " & _
                                          acVportTblRecCur.LowerLeftCorner.Y & _
                                          vbLf & "Upper right corner: " & _
                                          acVportTblRecCur.UpperRightCorner.X & ", " & _
                                          acVportTblRecCur.UpperRightCorner.Y)
          End If
      Next
 
      '' Commit the changes and dispose of the transaction
      acTrans.Commit()
  End Using
End Sub

C#

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
 
[CommandMethod("SplitAndIterateModelViewports")]
public static void SplitAndIterateModelViewports()
{
  // Get the current database
  Document acDoc = Application.DocumentManager.MdiActiveDocument;
  Database acCurDb = acDoc.Database;
 
  // Start a transaction
  using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  {
      // Open the Viewport table for write
      ViewportTable acVportTbl;
      acVportTbl = acTrans.GetObject(acCurDb.ViewportTableId,
                                     OpenMode.ForWrite) as ViewportTable;
 
      // Open the active viewport for write
      ViewportTableRecord acVportTblRec;
      acVportTblRec = acTrans.GetObject(acDoc.Editor.ActiveViewportId,
                                        OpenMode.ForWrite) as ViewportTableRecord;
 
      ViewportTableRecord acVportTblRecNew = new ViewportTableRecord();
 
      // Add the new viewport to the Viewport table and the transaction
      acVportTbl.Add(acVportTblRecNew);
      acTrans.AddNewlyCreatedDBObject(acVportTblRecNew, true);
 
      // Assign the name '*Active' to the new Viewport
      acVportTblRecNew.Name = "*Active";
 
      // Use the existing lower left corner for the new viewport
      acVportTblRecNew.LowerLeftCorner = acVportTblRec.LowerLeftCorner;
 
      // Get half the X of the existing upper corner
      acVportTblRecNew.UpperRightCorner = new Point2d(acVportTblRec.UpperRightCorner.X,
                                                      acVportTblRec.LowerLeftCorner.Y +
                                                      ((acVportTblRec.UpperRightCorner.Y -
                                                        acVportTblRec.LowerLeftCorner.Y) / 2));
 
      // Recalculate the corner of the active viewport
      acVportTblRec.LowerLeftCorner = new Point2d(acVportTblRec.LowerLeftCorner.X,
                                                  acVportTblRecNew.UpperRightCorner.Y);
 
      // Update the display with the new tiled viewports arrangement
      acDoc.Editor.UpdateTiledViewportsFromDatabase();
 
      // Step through each object in the symbol table
      foreach (ObjectId acObjId in acVportTbl)
      {
          // Open the object for read
          ViewportTableRecord acVportTblRecCur;
          acVportTblRecCur = acTrans.GetObject(acObjId,
                                               OpenMode.ForRead) as ViewportTableRecord;
 
          if (acVportTblRecCur.Name == "*Active")
          {
              Application.SetSystemVariable("CVPORT", acVportTblRecCur.Number);
 
              Application.ShowAlertDialog("Viewport: " + acVportTblRecCur.Number +
                                          " is now active." +
                                          "\nLower left corner: " +
                                          acVportTblRecCur.LowerLeftCorner.X + ", " +
                                          acVportTblRecCur.LowerLeftCorner.Y +
                                          "\nUpper right corner: " +
                                          acVportTblRecCur.UpperRightCorner.X + ", " +
                                          acVportTblRecCur.UpperRightCorner.Y);
          }
      }
 
      // Commit the changes and dispose of the transaction
      acTrans.Commit();
  }
}
VBA/ActiveX Code Reference