2012년 3월 9일 금요일

Manipulate the Current View(현제 뷰 조작)

Some of the common properties that you will use to manipulate the current view are:
//현제뷰의 조작을 위해 사용하는 속성

CenterPoint - Center point of a view in DCS coordinates.
//dcs죄표의 중심???

Height - Height of a view in DCS coordinates. Increase the height to zoom out;
decrease the height to zoom in.

Target - Target of a view in WCS coordinates.

ViewDirection - Vector from the target to the camera of a view in WCS coordinates.

ViewTwist - Twist angle in radians of a view.

Width - Width of a view in DCS coordinates. Increase the width to zoom out; decrease the width to zoom in.

The parameters of the Zoom procedure are:
//줌 프로시져의 매개변수(프로시져면 함수?)


Minimum point - 3D point used to define the lower-left corner of the area to display.
//왼쪽아레

Maximum point - 3D point used to define the upper-right corner of the area to display.
//오른쪽위

Center point - 3D point used to define the center of a view.

Scale factor - Real number used to specify the scale to increase or decrease the size of a view.



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

출처
http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer%27s%20Guide/index.html


댓글 1개 :