Managed .Net API でレイアウト空間のビューポート表示範囲のオブジェクトを取得する方法はありますか?
Solution
AutoCADでの、レイアウトのビューポートは、モデル空間への覗き窓となり、ビューポートに表示されている図形の実態はレイアウト空間には存在しません。
また、ビューポートは、モデル空間とは異なる座標系を持つため、ビューポートに表示されている図形を取得するためには、ビューポートの表示領域の対角点座標をモデル空間上の座標に変換した後に、変換後の座標でモデル空間上の図形を選択する必要があります。
次のコードは、ビューポートに表示されている図形の選択を行うサンプルコードです。
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
ed.SwitchToPaperSpace();
//ビューポートを選択
var peo = new PromptEntityOptions("\nSelect viewport: ");
peo.SetRejectMessage("\nRequires a Viewport");
peo.AddAllowedClass(typeof(Viewport), false);
PromptEntityResult result = ed.GetEntity(peo);
if (result.Status != PromptStatus.OK)
return;
using (var tr = new OpenCloseTransaction())
{
Viewport viewport = (Viewport)tr.GetObject(result.ObjectId, OpenMode.ForRead);
/// ビューポート設定から、変換マトリクスを取得
Point2d viewCenter = viewport.ViewCenter;
double x = viewCenter.X;
viewCenter = viewport.ViewCenter;
Point3d center = new Point3d(x, viewCenter.Y, 0.0);
Point3d vpcenter = viewport.CenterPoint;
Matrix3d tfmatrix = (Matrix3d.Displacement(new Vector3d(vpcenter.X - center.X, vpcenter.Y - center.Y, 0.0))
* Matrix3d.Scaling(viewport.CustomScale, center)
* Matrix3d.Rotation(viewport.TwistAngle, Vector3d.ZAxis, Point3d.Origin)
* Matrix3d.WorldToPlane(new Plane(viewport.ViewTarget, viewport.ViewDirection))).Inverse();
///ビューポートのMin/Max座標を変換マトリクスでモデル座標に変換
Extents3d extents = viewport.GeometricExtents;
Point3d msMinPoint = extents.MinPoint.TransformBy(tfmatrix);
Point3d msMaxPoint = extents.MaxPoint.TransformBy(tfmatrix);
tr.Commit();
ed.SwitchToModelSpace();
//取得したMin、Maxポイントを用いて図形を選択
var psr = ed.SelectWindow(msMinPoint, msMaxPoint);
}