現在のビューを操作する(.NET)

モデル空間またはペーパー空間内のビューポートの現在のビューにアクセスするには、Editor オブジェクトの GetCurrentView メソッドを使用します。GetCurrentView メソッドは、ViewTableRecord オブジェクトを返します。ViewTableRecord オブジェクトを使用して、アクティブなビューポート内のビューの表示倍率、位置、および方向を操作します。ViewTableRecord オブジェクトを変更したら、SetCurrentView メソッドを使用してアクティブなビューポートの現在のビューを更新します。

現在のビューの操作に使用される一般的なプロパティを次に示します。

VBA コードのクロス リファレンス

AutoCAD .NET API には、ActiveX オートメーション ライブラリにあるような図面の現在のビューを直接操作できるメソッドはありません。たとえば、図面のオブジェクト範囲または図面の範囲にズームするには、現在のビューの WidthHeight、および CenterPoint プロパティを操作する必要があります。図面のオブジェクト範囲または図面の範囲を取得するには、Database オブジェクトの ExtminExtmaxLimmin、および Limmax プロパティを使用します。

現在のビューの操作に使用する関数

次のコード例は、後の例で使用される一般的なプロシージャです。Zoom プロシージャは、4 つのパラメータを受け取り、境界へのズーム、図面のビューの画面移動またはセンタリング、指定された係数での図面のビューの尺度変更を行います。Zoom プロシージャには、すべての座標値を WCS 座標で指定する必要があります。

Zoom プロシージャには次のパラメータがあります。

VB.NET

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

C#

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();
    }
}