モデル空間またはペーパー空間内のビューポートの現在のビューにアクセスするには、Editor オブジェクトの GetCurrentView メソッドを使用します。GetCurrentView メソッドは、ViewTableRecord オブジェクトを返します。ViewTableRecord オブジェクトを使用して、アクティブなビューポート内のビューの表示倍率、位置、および方向を操作します。ViewTableRecord オブジェクトを変更したら、SetCurrentView メソッドを使用してアクティブなビューポートの現在のビューを更新します。
現在のビューの操作に使用される一般的なプロパティを次に示します。
AutoCAD .NET API には、ActiveX オートメーション ライブラリにあるような図面の現在のビューを直接操作できるメソッドはありません。たとえば、図面のオブジェクト範囲または図面の範囲にズームするには、現在のビューの Width、Height、および CenterPoint プロパティを操作する必要があります。図面のオブジェクト範囲または図面の範囲を取得するには、Database オブジェクトの Extmin、Extmax、Limmin、および Limmax プロパティを使用します。
次のコード例は、後の例で使用される一般的なプロシージャです。Zoom プロシージャは、4 つのパラメータを受け取り、境界へのズーム、図面のビューの画面移動またはセンタリング、指定された係数での図面のビューの尺度変更を行います。Zoom プロシージャには、すべての座標値を WCS 座標で指定する必要があります。
Zoom プロシージャには次のパラメータがあります。
Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.Geometry Public Sub Zoom(ByVal pMin As Point3d, ByVal pMax As Point3d, _ ByVal pCenter As Point3d, ByVal dFactor As Double) '' Get the current document and database Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database Dim nCurVport As Integer = System.Convert.ToInt32(Application.GetSystemVariable("CVPORT")) '' Get the extents of the current space when no points '' or only a center point is provided '' Check to see if Model space is current If acCurDb.TileMode = True Then If pMin.Equals(New Point3d()) = True And _ pMax.Equals(New Point3d()) = True Then pMin = acCurDb.Extmin pMax = acCurDb.Extmax End If Else '' Check to see if Paper space is current If nCurVport = 1 Then If pMin.Equals(New Point3d()) = True And _ pMax.Equals(New Point3d()) = True Then pMin = acCurDb.Pextmin pMax = acCurDb.Pextmax End If Else '' Get the extents of Model space If pMin.Equals(New Point3d()) = True And _ pMax.Equals(New Point3d()) = True Then pMin = acCurDb.Extmin pMax = acCurDb.Extmax End If End If End If '' Start a transaction Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() '' Get the current view Using acView As ViewTableRecord = acDoc.Editor.GetCurrentView() Dim eExtents As Extents3d '' Translate WCS coordinates to DCS Dim matWCS2DCS As Matrix3d matWCS2DCS = Matrix3d.PlaneToWorld(acView.ViewDirection) matWCS2DCS = Matrix3d.Displacement(acView.Target - Point3d.Origin) * matWCS2DCS matWCS2DCS = Matrix3d.Rotation(-acView.ViewTwist, _ acView.ViewDirection, _ acView.Target) * matWCS2DCS '' If a center point is specified, define the min and max '' point of the extents '' for Center and Scale modes If pCenter.DistanceTo(Point3d.Origin) <> 0 Then pMin = New Point3d(pCenter.X - (acView.Width / 2), _ pCenter.Y - (acView.Height / 2), 0) pMax = New Point3d((acView.Width / 2) + pCenter.X, _ (acView.Height / 2) + pCenter.Y, 0) End If '' Create an extents object using a line Using acLine As Line = New Line(pMin, pMax) eExtents = New Extents3d(acLine.Bounds.Value.MinPoint, _ acLine.Bounds.Value.MaxPoint) End Using '' Calculate the ratio between the width and height of the current view Dim dViewRatio As Double dViewRatio = (acView.Width / acView.Height) '' Tranform the extents of the view matWCS2DCS = matWCS2DCS.Inverse() eExtents.TransformBy(matWCS2DCS) Dim dWidth As Double Dim dHeight As Double Dim pNewCentPt As Point2d '' Check to see if a center point was provided (Center and Scale modes) If pCenter.DistanceTo(Point3d.Origin) <> 0 Then dWidth = acView.Width dHeight = acView.Height If dFactor = 0 Then pCenter = pCenter.TransformBy(matWCS2DCS) End If pNewCentPt = New Point2d(pCenter.X, pCenter.Y) Else '' Working in Window, Extents and Limits mode '' Calculate the new width and height of the current view dWidth = eExtents.MaxPoint.X - eExtents.MinPoint.X dHeight = eExtents.MaxPoint.Y - eExtents.MinPoint.Y '' Get the center of the view pNewCentPt = New Point2d(((eExtents.MaxPoint.X + eExtents.MinPoint.X) * 0.5), _ ((eExtents.MaxPoint.Y + eExtents.MinPoint.Y) * 0.5)) End If '' Check to see if the new width fits in current window If dWidth > (dHeight * dViewRatio) Then dHeight = dWidth / dViewRatio '' Resize and scale the view If dFactor <> 0 Then acView.Height = dHeight * dFactor acView.Width = dWidth * dFactor End If '' Set the center of the view acView.CenterPoint = pNewCentPt '' Set the current view acDoc.Editor.SetCurrentView(acView) End Using '' Commit the changes acTrans.Commit() End Using End Sub
using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Geometry; static void Zoom(Point3d pMin, Point3d pMax, Point3d pCenter, double dFactor) { // Get the current document and database Document acDoc = Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; int nCurVport = System.Convert.ToInt32(Application.GetSystemVariable("CVPORT")); // Get the extents of the current space when no points // or only a center point is provided // Check to see if Model space is current if (acCurDb.TileMode == true) { if (pMin.Equals(new Point3d()) == true && pMax.Equals(new Point3d()) == true) { pMin = acCurDb.Extmin; pMax = acCurDb.Extmax; } } else { // Check to see if Paper space is current if (nCurVport == 1) { // Get the extents of Paper space if (pMin.Equals(new Point3d()) == true && pMax.Equals(new Point3d()) == true) { pMin = acCurDb.Pextmin; pMax = acCurDb.Pextmax; } } else { // Get the extents of Model space if (pMin.Equals(new Point3d()) == true && pMax.Equals(new Point3d()) == true) { pMin = acCurDb.Extmin; pMax = acCurDb.Extmax; } } } // Start a transaction using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // Get the current view using (ViewTableRecord acView = acDoc.Editor.GetCurrentView()) { Extents3d eExtents; // Translate WCS coordinates to DCS Matrix3d matWCS2DCS; matWCS2DCS = Matrix3d.PlaneToWorld(acView.ViewDirection); matWCS2DCS = Matrix3d.Displacement(acView.Target - Point3d.Origin) * matWCS2DCS; matWCS2DCS = Matrix3d.Rotation(-acView.ViewTwist, acView.ViewDirection, acView.Target) * matWCS2DCS; // If a center point is specified, define the min and max // point of the extents // for Center and Scale modes if (pCenter.DistanceTo(Point3d.Origin) != 0) { pMin = new Point3d(pCenter.X - (acView.Width / 2), pCenter.Y - (acView.Height / 2), 0); pMax = new Point3d((acView.Width / 2) + pCenter.X, (acView.Height / 2) + pCenter.Y, 0); } // Create an extents object using a line using (Line acLine = new Line(pMin, pMax)) { eExtents = new Extents3d(acLine.Bounds.Value.MinPoint, acLine.Bounds.Value.MaxPoint); } // Calculate the ratio between the width and height of the current view double dViewRatio; dViewRatio = (acView.Width / acView.Height); // Tranform the extents of the view matWCS2DCS = matWCS2DCS.Inverse(); eExtents.TransformBy(matWCS2DCS); double dWidth; double dHeight; Point2d pNewCentPt; // Check to see if a center point was provided (Center and Scale modes) if (pCenter.DistanceTo(Point3d.Origin) != 0) { dWidth = acView.Width; dHeight = acView.Height; if (dFactor == 0) { pCenter = pCenter.TransformBy(matWCS2DCS); } pNewCentPt = new Point2d(pCenter.X, pCenter.Y); } else // Working in Window, Extents and Limits mode { // Calculate the new width and height of the current view dWidth = eExtents.MaxPoint.X - eExtents.MinPoint.X; dHeight = eExtents.MaxPoint.Y - eExtents.MinPoint.Y; // Get the center of the view pNewCentPt = new Point2d(((eExtents.MaxPoint.X + eExtents.MinPoint.X) * 0.5), ((eExtents.MaxPoint.Y + eExtents.MinPoint.Y) * 0.5)); } // Check to see if the new width fits in current window if (dWidth > (dHeight * dViewRatio)) dHeight = dWidth / dViewRatio; // Resize and scale the view if (dFactor != 0) { acView.Height = dHeight * dFactor; acView.Width = dWidth * dFactor; } // Set the center of the view acView.CenterPoint = pNewCentPt; // Set the current view acDoc.Editor.SetCurrentView(acView); } // Commit the changes acTrans.Commit(); } }