フォローする

.NET - ズームについて

更新 : 2017-02-02 07:10:20 UTC

.NET API には VBA の GcadApplication.ZoomExtents の様に、
現在のビューを直接操作する為の機能は実装されていません。

API を使用してズームを行うのであればCOMの機能を使用するか、
現在のビューのプロパティを直接編集してズームを行います。

COMの機能を使用する場合のサンプルは次の通りです。

  • VB.NET
    Imports GrxCAD.ApplicationServices
    Imports GrxCAD.Runtime
    
    <Assembly: CommandClass(GetType(Sample_VB.SampleCmd))>
    
    Namespace Sample_VB
        Public Class SampleCmd
    
            <CommandMethod("ZOOM_COM")>
            Public Sub ZoomSample_COM()
                Dim icApp = Application.AcadApplication
                icApp.ZoomExtents()
            End Sub
    
        End Class
    End Namespace
    
  • C#
    using GrxCAD.ApplicationServices;
    using GrxCAD.Runtime;
    
    [assembly: CommandClass(typeof(Sample_CS.SampleCmd))]
    
    namespace Sample_CS
    {
        public class SampleCmd
        {
            [CommandMethod("ZOOM_COM")]
            public void ZoomSample_COM()
            {
                dynamic icApp = Application.AcadApplication;
                icApp.ZoomExtents();
            }
        }
    }
    

 

.NET API のみを使用する場合のサンプルは次の通りです。

  • VB.NET
    Imports GrxCAD.ApplicationServices
    Imports GrxCAD.DatabaseServices
    Imports GrxCAD.EditorInput
    Imports GrxCAD.Geometry
    Imports GrxCAD.Runtime
    
    <Assembly: CommandClass(GetType(Sample_VB.SampleCmd))>
    
    Namespace Sample_VB
        Public Class SampleCmd
    
            <CommandMethod("ZOOM_NET")>
            Public Sub ZoomSample_NET()
                Dim icDb As Database = 
                    Application.DocumentManager.MdiActiveDocument.Database
                Dim IcEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
    
                Using icTrans As Transaction = icDb.TransactionManager.StartTransaction()
    
                    'オブジェクト範囲を更新
                    icDb.UpdateExt(True)
    
                    '現在のビューを取得
                    Using icView As ViewTableRecord = IcEd.GetCurrentView()
    
                        '現在のUCSを取得
                        Dim UCS As Matrix3d = IcEd.CurrentUserCoordinateSystem
                        'UCSから平面を作成
                        Dim ucsPlane = New Plane(
                            UCS.CoordinateSystem3d.Origin,
                            UCS.CoordinateSystem3d.Zaxis)
    
                        'オブジェクト範囲の右上点(Point2dに変換)
                        Dim ExtMax As Point2d = icDb.Extmax.Convert2d(ucsPlane)
                        'オブジェクト範囲の左下点(Point2dに変換)
                        Dim ExtMin As Point2d = icDb.Extmin.Convert2d(ucsPlane)
    
                        'オブジェクト範囲の中心
                        Dim center As Point2d = 
                            ExtMin.Subtract(ExtMax.GetVectorTo(ExtMin) * 0.5)
                        'オブジェクト範囲の幅
                        Dim width As Double = Math.Abs(ExtMax.X - ExtMin.X)
                        'オブジェクト範囲の高さ
                        Dim height As Double = Math.Abs(ExtMax.Y - ExtMin.Y)
    
                        'ビューの中心を変更
                        icView.CenterPoint = center
                        'ビューの幅を変更
                        icView.Width = width * 1.01
                        'ビューの高さを変更
                        icView.Height = height * 1.01
    
                        '変更したビューを現在のビューに設定
                        IcEd.SetCurrentView(icView)
    
                    End Using
                    icTrans.Commit()
                End Using
            End Sub
    
        End Class
    End Namespace
    
  • C#
    using GrxCAD.ApplicationServices;
    using GrxCAD.DatabaseServices;
    using GrxCAD.EditorInput;
    using GrxCAD.Geometry;
    using GrxCAD.Runtime;
    
    [assembly: CommandClass(typeof(Sample_CS.SampleCmd))]
    
    namespace Sample_CS
    {
        public class SampleCmd
        {
            [CommandMethod("ZOOM_NET")]
            public void ZoomSample_NET()
            {
                Database icDb = Application.DocumentManager.MdiActiveDocument.Database;
                Editor icEd = Application.DocumentManager.MdiActiveDocument.Editor;
    
                using (Transaction icTrans = icDb.TransactionManager.StartTransaction())
                {
    
                   //オブジェクト範囲を更新
                    icDb.UpdateExt(true);
    
                    //現在のビューを取得
                    using (ViewTableRecord icView = icEd.GetCurrentView())
                    {
                        //現在のUCSを取得
                        Matrix3d UCS = icEd.CurrentUserCoordinateSystem;
                        //UCSから平面を作成
                        Plane ucsPlane = new Plane(
                            UCS.CoordinateSystem3d.Origin, 
                            UCS.CoordinateSystem3d.Zaxis);
    
                        //オブジェクト範囲の右上点(Point2dに変換)
                        Point2d ExtMax = icDb.Extmax.Convert2d(ucsPlane);
                        //オブジェクト範囲の左下点(Point2dに変換)
                        Point2d ExtMin = icDb.Extmin.Convert2d(ucsPlane);
                        
                        //オブジェクト範囲の中心
                        Point2d center = 
                            ExtMin.Subtract(ExtMax.GetVectorTo(ExtMin) * 0.5);
                        //オブジェクト範囲の幅
                        double width = System.Math.Abs(ExtMax.X - ExtMin.X);
                        //オブジェクト範囲の高さ
                        double height = System.Math.Abs(ExtMax.Y - ExtMin.Y);
    
                        //ビューの中心を変更
                        icView.CenterPoint = center;
                        //ビューの幅を変更
                        icView.Width = width * 1.01;
                        //ビューの高さを変更
                        icView.Height = height * 1.01;
    
                        //変更したビューを現在のビューに設定
                        icEd.SetCurrentView(icView);
                    }
                    icTrans.Commit();
                }
            }
        }
    }
    

.NET API のみを使用したサンプルではデータベースからオブジェクト範囲を取得して、
オブジェクト範囲の中心、幅、高さの計算結果元にビューを作成しています。

ビューの幅と高さの変更の際に width * 1.01 と値を増やしている理由は、
オブジェクト範囲をそのまま使用するとオブジェクトとビューの端がくっついてしまうので、
オブジェクトの端を一目でわかるように、余白を持たせてズームを行っています。

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています
他にご質問がございましたら、リクエストを送信してください

コメント