ADN Open CIS
Сообщество программистов Autodesk в СНГ

13/09/2021

Создаём четыре видовых экрана модели и назначаем ортогональные виды

Недавно пользователю понадобилось модифицировать код для создания раздельных видовых экранов в модели и установить каждому из них различные ортогональные виды. Код ниже создаёт четыре раздельных видовых экрана в модели. Для этого мы создаём новые ViewportTableRecord, которые представляют новые видовые экраны, а их параметры устанавливаем на основе текущей ViewportTableRecord. Это гарантирует, что ViewportTableRecord будет правильно настроен для установки орфографического представления. И в конечном итоге мы выполняем показ до  границ. Вот скриншот результирующего расположения видовых экранов.

 

Код - C#: [Выделить]
  1. // Создаём четыре видовых экрана модели,
  2.  // устанавливаем в каждом различные ортографические виды
  3.  // и показываем до границ.
  4.  [CommandMethod("SplitMVP" )]
  5.  public  static  void  SplitAndSetViewModelViewports()
  6.  {
  7.      Document doc
  8.          = Application.DocumentManager.MdiActiveDocument;
  9.      Database db = doc.Database;
  10.  
  11.      db.UpdateExt(true );
  12.      Extents3d dbExtent
  13.          = new  Extents3d(db.Extmin, db.Extmax);
  14.  
  15.      using  (Transaction tr
  16.          = db.TransactionManager.StartTransaction())
  17.      {
  18.          ViewportTable vt = tr.GetObject(
  19.              db.ViewportTableId, OpenMode.ForWrite)
  20.              as  ViewportTable;
  21.  
  22.          ViewportTableRecord vtr1 = tr.GetObject(
  23.              doc.Editor.ActiveViewportId,
  24.              OpenMode.ForWrite) as  ViewportTableRecord;
  25.  
  26.          Point2d ll = vtr1.LowerLeftCorner;
  27.          Point2d ur = vtr1.UpperRightCorner;
  28.  
  29.          vtr1.LowerLeftCorner = ll;
  30.          vtr1.UpperRightCorner = new  Point2d(
  31.              ll.X + (ur.X - ll.X) * 0.5,
  32.              ll.Y + (ur.Y - ll.Y) * 0.5);
  33.          vtr1.SetViewDirection(OrthographicView.LeftView);
  34.          ZoomExtents(vtr1, dbExtent);
  35.  
  36.          ViewportTableRecord vtr2 =
  37.              CreateVTR(vt, vtr1,
  38.              new  Point2d(ll.X + (ur.X - ll.X) * 0.5, ll.Y),
  39.              new  Point2d(ur.X, ll.Y + (ur.Y - ll.Y) * 0.5),
  40.              dbExtent, OrthographicView.RightView);
  41.          vt.Add(vtr2);
  42.          tr.AddNewlyCreatedDBObject(vtr2, true );
  43.  
  44.          ViewportTableRecord vtr3 =
  45.              CreateVTR(vt, vtr1,
  46.              vtr1.UpperRightCorner, ur,
  47.              dbExtent, OrthographicView.BottomView);
  48.          vt.Add(vtr3);
  49.          tr.AddNewlyCreatedDBObject(vtr3, true );
  50.  
  51.          ViewportTableRecord vtr4 =
  52.              CreateVTR(vt, vtr1,
  53.              new  Point2d(ll.X, ll.Y + (ur.Y - ll.Y) * 0.5),
  54.              new  Point2d(ll.X + (ur.X - ll.X) * 0.5, ur.Y),
  55.              dbExtent, OrthographicView.TopView);
  56.          vt.Add(vtr4);
  57.          tr.AddNewlyCreatedDBObject(vtr4, true );
  58.  
  59.          // Обновляем дисплей с новыми неперекрывающимися видовыми экранами
  60.          doc.Editor.UpdateTiledViewportsFromDatabase();
  61.  
  62.          // Применяем изменения
  63.          tr.Commit();
  64.      }
  65.  }
  66.  
  67.  // Создаём видовой экран модели, используя параметры исходного видового
  68.  // экрана перед установкой ортографического вида и показа до границ
  69.  public  static  ViewportTableRecord CreateVTR(
  70.      ViewportTable vt, ViewportTableRecord refVTR,
  71.      Point2d ll, Point2d ur, Extents3d dbExtent,
  72.      OrthographicView ov)
  73.  {
  74.      ViewportTableRecord newVTR = new  ViewportTableRecord();
  75.  
  76.      newVTR.LowerLeftCorner = ll;
  77.      newVTR.UpperRightCorner = ur;
  78.      newVTR.Name = "*Active" ;
  79.  
  80.      newVTR.ViewDirection = refVTR.ViewDirection;
  81.      newVTR.ViewTwist = refVTR.ViewTwist;
  82.      newVTR.Target = refVTR.Target;
  83.      newVTR.BackClipEnabled = refVTR.BackClipEnabled;
  84.      newVTR.BackClipDistance = refVTR.BackClipDistance;
  85.      newVTR.FrontClipEnabled = refVTR.FrontClipEnabled;
  86.      newVTR.FrontClipDistance = refVTR.FrontClipDistance;
  87.      newVTR.Elevation = refVTR.Elevation;
  88.      newVTR.SetViewDirection(ov);
  89.  
  90.      ZoomExtents(newVTR, dbExtent);
  91.  
  92.      return  newVTR;
  93.  }
  94.  
  95.  public  static  void  ZoomExtents
  96.      (ViewportTableRecord vtr, Extents3d dbExtent)
  97.  {
  98.      // Получаем пропорции видового экрана
  99.      // вычисляем высоту и ширину
  100.      double  scrRatio = (vtr.Width / vtr.Height);
  101.  
  102.      // Готовим матрицу преобразования ДСК (DCS) в МСК (WCS)
  103.      Matrix3d matWCS2DCS
  104.          = Matrix3d.PlaneToWorld(vtr.ViewDirection);
  105.  
  106.         // Для ДСК целевая точка – начало координат
  107.      matWCS2DCS = Matrix3d.Displacement
  108.          (vtr.Target - Point3d.Origin) * matWCS2DCS;
  109.  
  110.         // Поворачиваем ось X МСК на угол поворота
  111.      matWCS2DCS = Matrix3d.Rotation(-vtr.ViewTwist,
  112.                                      vtr.ViewDirection,
  113.                                      vtr.Target
  114.                                  ) * matWCS2DCS;
  115.  
  116.         matWCS2DCS = matWCS2DCS.Inverse();
  117.  
  118.         // Преобразуем границы в ДСК  
  119.      // определенной по viewdir
  120.         dbExtent.TransformBy(matWCS2DCS);
  121.  
  122.         // ширина границ в текущем виде
  123.         double  width
  124.          = (dbExtent.MaxPoint.X - dbExtent.MinPoint.X);
  125.  
  126.         // высота границ в текущем виде
  127.         double  height
  128.          = (dbExtent.MaxPoint.Y - dbExtent.MinPoint.Y);
  129.  
  130.         // получаем центр вида
  131.         Point2d center = new  Point2d(
  132.          (dbExtent.MaxPoint.X + dbExtent.MinPoint.X) * 0.5,
  133.                (dbExtent.MaxPoint.Y + dbExtent.MinPoint.Y) * 0.5);
  134.  
  135.      // проверяем больше ли ширина, чем у текущего окна
  136.      // если нет, тогда получаем новую высоту согласно пропорциям
  137.      // видовых экранов
  138.         if  (width > (height * scrRatio))
  139.                height = width / scrRatio;
  140.  
  141.      vtr.Height = height;
  142.      vtr.Width = height * scrRatio;
  143.      vtr.CenterPoint = center;
  144.  }

 

 

Источник: https://adndevblog.typepad.com/autocad/2015/08/create-four-split-modelspace-viewports-and-set-different-orthographic-views.html

 

Автор перевода: Александр Ривилис
Опубликовано 13.09.2021