4.2.4.1. Определение и манипуляция активным видовым экраном

Источник здесь. [перевод не проверен];[перевёл Андрей Бушман]

    Текущие видовые экраны представлены в таблице видовых экранов записями, имеющими имя "*Active". Данное имя не является уникальным для всех неперекрывающихся видовых экранов, отображаемых в текущий момент на вкладке Модель (Model). Каждый отображаемый неперекрывающийся видовой экран имеет определённый номер. Номер текущего видового экрана может быть получен одним из следующих способов:
  • Извлечением значения из системной переменной CVPORT (текущий видовой экран)
  • Используя свойство ActiveViewportId (идентификатор активного видового экрана) экземпляра класса Editor можно получить идентификатор активного видового экрана, с тем, чтобы затем открыть доступ к свойству Number (номер) этого не перекрывающегося видового экрана.
    Получив активный видовой экран один раз, вы контролируете его свойства отображения, вспомогательные средства, такие как сетка и привязка с той же лёгкостью, с какой управляете размерами самого видового экрана. Неперекрывающиеся видовые экраны определяются по двум угловым точкам: левой нижней и правой верхней. Свойства LowerLeftCorner (левый нижний угол) и UpperRightCorner (правый верхний угол) представляют графическое расположение видового экрана на мониторе.

    Единственный не перекрывающийся видовой экран имеет координаты левого нижнего угла (0,0), и правого верхнего - (1,1). Левый нижний угол окна чертежа всегда представлен точкой (0,0), и правый верхний - точкой (1,1), в случае, если вкладка Модель не имеет более одного неперекрывющегося видового экрана. Когда их более одного, левый нижний угол и правый верхний угол будут различными для видоых экранов, но один экран будет иметь левый нижний угол координатой (0,0), и другой экран будет иметь правый верхний угол координатой (1,1).

Эти свойства определяются ниже (пример приведён для случая с 4-мя неперекрывающимися видовыми экранами):



В приведённом выше примере:
  • Видовой экран 1:       LowerLeftCorner = (0, .5),       UpperRightCorner = (.5, 1)
  • Видовой экран 2:       LowerLeftCorner = (.5, .5),      UpperRightCorner = (1, 1)
  • Видовой экран 3:       LowerLeftCorner = (0, 0),        UpperRightCorner = (.5, .5)
  • Видовой экран 4:       LowerLeftCorner = (.5, 0),       UpperRightCorner = (1, .5)
Т.о. показана конфигурация из четырёх неперекрывающихся видовых экранов расположенных в две строки попарно.

    В следующем примере создаётся два горизонтальных видовых экранов как конфигурация именованного видового экрана и переопределяет текущее отображение.

Код VB.NET

  1:  ''Определяем используемые пространства имён
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:  Imports Autodesk.AutoCAD.Runtime
   5:  Imports Autodesk.AutoCAD.Geometry 
   6:   
   7:  <CommandMethod("CreateModelViewport")> _
   8:  Public Sub CreateModelViewport()
   9:   
  10:    '' Получение объекта текущей базы данных
  11:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  12:    Dim acCurDb As Database = acDoc.Database 
  13:   
  14:    '' Запуск транзакции
  15:    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  16:   
  17:        '' Открытие таблицы видовых экранов для чтения
  18:        Dim acVportTbl As ViewportTable
  19:        acVportTbl = acTrans.GetObject(acCurDb.ViewportTableId, OpenMode.ForRead) 
  20:   
  21:        '' Проверка именованного видового экрана 'TEST_VIEWPORT' на существование
  22:        If (acVportTbl.Has("TEST_VIEWPORT") = False) Then
  23:   
  24:            '' Открытие таблицы видовых экранов для чтения
  25:            acVportTbl.UpgradeOpen() 
  26:   
  27:            '' Добавление нового видового экрана в таблицу видовых экранов и в транзакцию
  28:            Dim acVportTblRecLwr As ViewportTableRecord = New ViewportTableRecord()
  29:            acVportTbl.Add(acVportTblRecLwr)
  30:            acTrans.AddNewlyCreatedDBObject(acVportTblRecLwr, True) 
  31:   
  32:            '' Новому видовому экрану присваиваем имя 'TEST_VIEWPORT' и размещаем его в нижней половине окна чертежа
  33:            acVportTblRecLwr.Name = "TEST_VIEWPORT"
  34:            acVportTblRecLwr.LowerLeftCorner = New Point2d(0, 0)
  35:            acVportTblRecLwr.UpperRightCorner = New Point2d(1, 0.5) 
  36:   
  37:            '' Добавление нового видового экрана в таблицу видовых экранов и в транзакцию
  38:            Dim acVportTblRecUpr As ViewportTableRecord = New ViewportTableRecord()
  39:            acVportTbl.Add(acVportTblRecUpr)
  40:            acTrans.AddNewlyCreatedDBObject(acVportTblRecUpr, True) 
  41:   
  42:            '' Новому видовому экрану присваиваем имя 'TEST_VIEWPORT'
  43:            '' и располагаем его в верхней половине окна чертежа
  44:            acVportTblRecUpr.Name = "TEST_VIEWPORT"
  45:            acVportTblRecUpr.LowerLeftCorner = New Point2d(0, 0.5)
  46:            acVportTblRecUpr.UpperRightCorner = New Point2d(1, 1) 
  47:   
  48:            '' Назначение новых видовых экранов активными 
  49:            '' Видовые экраны, имеющие имена '*Active' должны быть удалены и восстановлены заново основываясь на имени 'TEST_VIEWPORT' 
  50:   
  51:            '' Шаг, выполняемый для каждого объекта символьной таблицы
  52:            For Each acObjId As ObjectId In acVportTbl
  53:                '' Открытие объекта для чтения
  54:                Dim acVportTblRec As ViewportTableRecord
  55:                acVportTblRec = acTrans.GetObject(acObjId, _
  56:                                                  OpenMode.ForRead) 
  57:   
  58:                '' Проверяем, если это один из активных видовых экранов, то удаляем его
  59:                If (acVportTblRec.Name = "*Active") Then
  60:                    acVportTblRec.UpgradeOpen()
  61:                    acVportTblRec.Erase()
  62:                End If
  63:            Next 
  64:   
  65:            '' Создаём копию новых видовых экранов как активных
  66:            For Each acObjId As ObjectId In acVportTbl
  67:                '' Открытие объектов для чтения
  68:                Dim acVportTblRec As ViewportTableRecord
  69:                acVportTblRec = acTrans.GetObject(acObjId, _
  70:                                                  OpenMode.ForRead) 
  71:   
  72:                '' Проверяем, если это один из активных видовых экранов, то копируем его.
  73:                If (acVportTblRec.Name = "TEST_VIEWPORT") Then
  74:                    Dim acVportTblRecClone As ViewportTableRecord
  75:                    acVportTblRecClone = acVportTblRec.Clone() 
  76:   
  77:                    '' Добавляем новый видовой экран в таблицу видовых экранов и в транзакцию
  78:                    acVportTbl.Add(acVportTblRecClone)
  79:                    acVportTblRecClone.Name = "*Active"
  80:                    acTrans.AddNewlyCreatedDBObject(acVportTblRecClone, True)
  81:                End If
  82:            Next 
  83:   
  84:            '' Обновляем отображение с новыми неперекрывающимися видовыми экранами
  85:            acDoc.Editor.UpdateTiledViewportsFromDatabase() 
  86:   
  87:            '' Фиксация произведённых в блоке "using" изменений
  88:            acTrans.Commit()
  89:        End If
  90:   
  91:        '' Уничтожение объекта транзакции
  92:    End Using
  93:  End Sub

Код C#

   1:  //Определяем используемые пространства имён
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices;
   4:  using Autodesk.AutoCAD.Runtime;
   5:  using Autodesk.AutoCAD.Geometry; 
   6:   
   7:  [CommandMethod("CreateModelViewport")]
   8:  public static void CreateModelViewport()
   9:  {
  10:    // Получаем объект текущей базы данных
  11:    Document acDoc = Application.DocumentManager.MdiActiveDocument;
  12:    Database acCurDb = acDoc.Database; 
  13:   
  14:    // Запускаем транзакцию
  15:    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  16:    {
  17:        // Открытие таблицы видовых экранов для чтения
  18:        ViewportTable acVportTbl;
  19:        acVportTbl = acTrans.GetObject(acCurDb.ViewportTableId,
  20:                                       OpenMode.ForRead) as ViewportTable; 
  21:   
  22:        // Проверка на наличие в таблице записей об именованных неперекрывающихся видовых экранах с именем 'TEST_VIEWPORT'
  23:        if (acVportTbl.Has("TEST_VIEWPORT") == false)
  24:        {
  25:            // Смена режима открытия таблицы (переходим из режима чтения в режим редактирования)
  26:            acVportTbl.UpgradeOpen(); 
  27:   
  28:            // Добавление нового видового экрана в таблицу видовых экранов и в транзакцию
  29:            ViewportTableRecord acVportTblRecLwr = new ViewportTableRecord();
  30:            acVportTbl.Add(acVportTblRecLwr);
  31:            acTrans.AddNewlyCreatedDBObject(acVportTblRecLwr, true); 
  32:   
  33:            // Назначение созданному экрану имени 'TEST_VIEWPORT'и размещение его в нижней части окна чертежа
  34:            acVportTblRecLwr.Name = "TEST_VIEWPORT";
  35:            acVportTblRecLwr.LowerLeftCorner = new Point2d(0, 0);
  36:            acVportTblRecLwr.UpperRightCorner = new Point2d(1, 0.5); 
  37:   
  38:            // ДОбавление нового видового экрана в таблицу видовых экранов и в транзакцию
  39:            ViewportTableRecord acVportTblRecUpr = new ViewportTableRecord();
  40:            acVportTbl.Add(acVportTblRecUpr);
  41:            acTrans.AddNewlyCreatedDBObject(acVportTblRecUpr, true); 
  42:   
  43:            // Назначение видовому экрану имени 'TEST_VIEWPORT' и размещение его в верхней половине окна чертежа
  44:            acVportTblRecUpr.Name = "TEST_VIEWPORT";
  45:            acVportTblRecUpr.LowerLeftCorner = new Point2d(0, 0.5);
  46:            acVportTblRecUpr.UpperRightCorner = new Point2d(1, 1); 
  47:   
  48:            // Установка новых видовых экранов текущими. Для этого следует удалить из таблицы все видовые экраны с именем '*Active',
  49:            // и создать новые видовые экраны под этим именем, основываясь на экранах, имеющих имя 'TEST_VIEWPORT' 
  50:   
  51:            // Шаг выполняется для каждого объекта символьной таблицы
  52:            foreach (ObjectId acObjId in acVportTbl)
  53:            {
  54:                // Открытие объекта для чтения
  55:                ViewportTableRecord acVportTblRec;
  56:                acVportTblRec = acTrans.GetObject(acObjId,
  57:                                                  OpenMode.ForRead) as ViewportTableRecord; 
  58:   
  59:                // Проверяем, если это один из активных видовых экранов - удаляем его
  60:                if (acVportTblRec.Name == "*Active")
  61:                {
  62:                    acVportTblRec.UpgradeOpen();
  63:                    acVportTblRec.Erase();
  64:                }
  65:            } 
  66:   
  67:            // Создаём копии видовых экранов, устанавливая эти копии активными
  68:            foreach (ObjectId acObjId in acVportTbl)
  69:            {
  70:                //Открываем объект для чтения
  71:                ViewportTableRecord acVportTblRec;
  72:                acVportTblRec = acTrans.GetObject(acObjId,
  73:                                                  OpenMode.ForRead) as ViewportTableRecord; 
  74:   
  75:                // Проверяем, если это нужный нам видовой экран - создаём его копию
  76:                if (acVportTblRec.Name == "TEST_VIEWPORT")
  77:                {
  78:                    ViewportTableRecord acVportTblRecClone;
  79:                    acVportTblRecClone = acVportTblRec.Clone() as ViewportTableRecord; 
  80:   
  81:                    // Добавляем созданный объект в таблицу видовых экранов и в транзакцию
  82:                    acVportTbl.Add(acVportTblRecClone);
  83:                    acVportTblRecClone.Name = "*Active";
  84:                    acTrans.AddNewlyCreatedDBObject(acVportTblRecClone, true);
  85:                }
  86:            } 
  87:   
  88:            // Обновляем отображение в соответствии с созданными нами новыми неперекрывающимися видовыми экранами
  89:            acDoc.Editor.UpdateTiledViewportsFromDatabase(); 
  90:   
  91:            // Фиксируем изменения
  92:            acTrans.Commit();
  93:        }
  94:        // Здесь объект транзакции утилизируется
  95:    }
  96:  }

Код VBA / ActiveX

   1:  Sub CreateModelViewport()
   2:   
   3:      ' Создание нового видового экрана
   4:      Dim vportObj As AcadViewport
   5:      Set vportObj = ThisDrawing.Viewports.Add("TEST_VIEWPORT") 
   6:   
   7:      ' Разделяем vportObj на два горизонтальных окна
   8:      vportObj.Split acViewport2Horizontal 
   9:   
  10:      ' Устанавливаем vportObj активным
  11:      ThisDrawing.ActiveViewport = vportObj
  12:   
  13:  End Sub

Comments