4.2.4.2. Установить неперекрывающийся видовой экран текущим.

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

    В текущем видовом экране вы указываете точки и выбираете объекты. Для того, чтобы установить видовой экран текущим, используйте системную переменную CVPORT, которой вам нужно указать номер видового экрана, который желаете сделать текущим.

    Вы можете выполнить итерацию по существующим видовым экранам, чтобы найти тот, который вам нужен. Для того, чтобы сделать это, установите записи таблицы видовых экранов (Viewport table) с именами "*Active" используя свойство Имя (Name).

Разделение видового экрана путём итерации по имеющимся окнам

    Этот пример разделяет активный видовой экран на два горизонтальных окна. В процессе итерации по видовым экранам, для каждого из них отображается имя и координаты левого нижнего и правого верхнего углов.

Код VB.NET

   1:  Imports Autodesk.AutoCAD.ApplicationServices
   2:  Imports Autodesk.AutoCAD.DatabaseServices
   3:  Imports Autodesk.AutoCAD.Runtime
   4:  Imports Autodesk.AutoCAD.Geometry 
   5:   
   6:  <CommandMethod("SplitAndIterateModelViewports")> _
   7:  Public Sub SplitAndIterateModelViewports()
   8:   
   9:    '' Получение объекта текущей базы данных
  10:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  11:    Dim acCurDb As Database = acDoc.Database 
  12:   
  13:    '' Запуск транзакции
  14:    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() 
  15:   
  16:        '' Открываем таблицу видовых экранов для записи (Viewport table)
  17:        Dim acVportTbl As ViewportTable
  18:        acVportTbl = acTrans.GetObject(acCurDb.ViewportTableId, _
  19:                                       OpenMode.ForWrite) 
  20:   
  21:        '' Открытие активного видового экрана для записи
  22:        Dim acVportTblRec As ViewportTableRecord
  23:        acVportTblRec = acTrans.GetObject(acDoc.Editor.ActiveViewportId, _
  24:                                          OpenMode.ForWrite) 
  25:   
  26:        Dim acVportTblRecNew As ViewportTableRecord = New ViewportTableRecord()
  27:   
  28:        '' Добавление записи нового видового экрана в таблицу видовых экранов и в транзакцию
  29:        acVportTbl.Add(acVportTblRecNew)
  30:        acTrans.AddNewlyCreatedDBObject(acVportTblRecNew, True) 
  31:   
  32:        '' Присвоение новому видовому экрану имени '*Active'
  33:        acVportTblRecNew.Name = "*Active" 
  34:   
  35:        '' Использование существующего левого нижнего угла для нового видового экрана
  36:        acVportTblRecNew.LowerLeftCorner = acVportTblRec.LowerLeftCorner
  37:   
  38:        '' Вычисление половины от координаты X существующего верхнего угла
  39:        acVportTblRecNew.UpperRightCorner = New Point2d(acVportTblRec.UpperRightCorner.X, _
  40:                                                        acVportTblRec.LowerLeftCorner.Y + _
  41:                                                        ((acVportTblRec.UpperRightCorner.Y - _
  42:                                                          acVportTblRec.LowerLeftCorner.Y) / 2))
  43:        '' Пересчёт угла активного видового экрана
  44:        acVportTblRec.LowerLeftCorner = New Point2d(acVportTblRec.LowerLeftCorner.X, _
  45:                                                    acVportTblRecNew.UpperRightCorner.Y)
  46:   
  47:        '' Обновление отображения в соответствии с новым расположением неперекрывающихся видовых экранов
  48:        acDoc.Editor.UpdateTiledViewportsFromDatabase() 
  49:   
  50:        '' Итерация по каждому объекту в составе символьной таблицы
  51:        For Each acObjId As ObjectId In acVportTbl
  52:   
  53:            '' Открытие объекта для чтения
  54:            Dim acVportTblRecCur As ViewportTableRecord
  55:            acVportTblRecCur = acTrans.GetObject(acObjId, _
  56:                                                 OpenMode.ForRead) 
  57:   
  58:            If (acVportTblRecCur.Name = "*Active") Then
  59:                Application.SetSystemVariable("CVPORT", acVportTblRecCur.Number) 
  60:   
  61:                Application.ShowAlertDialog("Viewport: " & acVportTblRecCur.Number & _
  62:                                            " is now active." & _
  63:                                            vbLf & "Lower left corner: " & _
  64:                                            acVportTblRecCur.LowerLeftCorner.X & ", " & _
  65:                                            acVportTblRecCur.LowerLeftCorner.Y & _
  66:                                            vbLf & "Upper right corner: " & _
  67:                                            acVportTblRecCur.UpperRightCorner.X & ", " & _
  68:                                            acVportTblRecCur.UpperRightCorner.Y)
  69:   
  70:            End If
  71:        Next 
  72:   
  73:        '' Фиксация в транзакции всех произведённых изменений
  74:        acTrans.Commit()
  75:    End Using
  76:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.ApplicationServices;
   2:  using Autodesk.AutoCAD.DatabaseServices;
   3:  using Autodesk.AutoCAD.Runtime;
   4:  using Autodesk.AutoCAD.Geometry; 
   5:   
   6:  [CommandMethod("SplitAndIterateModelViewports")]
   7:  public static void SplitAndIterateModelViewports()
   8:  {
   9:    // Получение объекта текущей базы данных
  10:    Document acDoc = Application.DocumentManager.MdiActiveDocument;
  11:    Database acCurDb = acDoc.Database; 
  12:   
  13:    // Запуск транзакции
  14:    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  15:    {
  16:        // Открытие таблицы видовых экранов для записи
  17:        ViewportTable acVportTbl;
  18:        acVportTbl = acTrans.GetObject(acCurDb.ViewportTableId,
  19:                                       OpenMode.ForWrite) as ViewportTable; 
  20:   
  21:        // Открытие активного видового экрана для записи
  22:        ViewportTableRecord acVportTblRec;
  23:        acVportTblRec = acTrans.GetObject(acDoc.Editor.ActiveViewportId,
  24:                                          OpenMode.ForWrite) as ViewportTableRecord;
  25:   
  26:        ViewportTableRecord acVportTblRecNew = new ViewportTableRecord(); 
  27:   
  28:        // Добавление нового видового экрана в таблицу видовых экранов и в транзакцию
  29:        acVportTbl.Add(acVportTblRecNew);
  30:        acTrans.AddNewlyCreatedDBObject(acVportTblRecNew, true); 
  31:   
  32:        // Присвоение новому видовому экрану имени '*Active'
  33:        acVportTblRecNew.Name = "*Active"; 
  34:   
  35:        // Использование существующего левого нижнего угла для нового видового экрана
  36:        acVportTblRecNew.LowerLeftCorner = acVportTblRec.LowerLeftCorner;
  37:   
  38:   
  39:   
  40:        // Вычисление значения половины координаты X от существующего правого верхнего угла
  41:        acVportTblRecNew.UpperRightCorner = new Point2d(acVportTblRec.UpperRightCorner.X,
  42:                                                        acVportTblRec.LowerLeftCorner.Y +
  43:                                                        ((acVportTblRec.UpperRightCorner.Y -
  44:                                                          acVportTblRec.LowerLeftCorner.Y) / 2)); 
  45:   
  46:        // Перерасчёт угла активного видового экрана
  47:        acVportTblRec.LowerLeftCorner = new Point2d(acVportTblRec.LowerLeftCorner.X,
  48:                                                    acVportTblRecNew.UpperRightCorner.Y); 
  49:   
  50:        // Обновление отображения для новых непенекрывающихся видовых экранов
  51:        acDoc.Editor.UpdateTiledViewportsFromDatabase(); 
  52:   
  53:        // Прохождение в итерации по каждому объекту в составе символьной таблицы
  54:        foreach (ObjectId acObjId in acVportTbl)
  55:        {
  56:            // Открытие объекта для записи
  57:            ViewportTableRecord acVportTblRecCur;
  58:   
  59:            acVportTblRecCur = acTrans.GetObject(acObjId,
  60:                                                 OpenMode.ForRead) as ViewportTableRecord; 
  61:   
  62:            if (acVportTblRecCur.Name == "*Active")
  63:            {
  64:                Application.SetSystemVariable("CVPORT", acVportTblRecCur.Number);
  65:   
  66:                Application.ShowAlertDialog("Viewport: " + acVportTblRecCur.Number +
  67:                                            " is now active." +
  68:                                            "\nLower left corner: " +
  69:                                            acVportTblRecCur.LowerLeftCorner.X + ", " +
  70:                                            acVportTblRecCur.LowerLeftCorner.Y +
  71:                                            "\nUpper right corner: " +
  72:                                            acVportTblRecCur.UpperRightCorner.X + ", " +
  73:                                            acVportTblRecCur.UpperRightCorner.Y);
  74:            }
  75:        } 
  76:   
  77:        // Фиксация изменений, произведённых в транзакции и уничтожение объекта транзакции
  78:        acTrans.Commit();
  79:    }
  80:  }

Код VBA / ActiveX

   1:  Sub SplitandInterateModelViewports()
   2:   
   3:      ' Получение текущего видового экрана
   4:      Dim vportObj As AcadViewport
   5:      Set vportObj = ThisDrawing.ActiveViewport 
   6:   
   7:      ' Разделение видового экрана на два окна
   8:      vportObj.Split acViewport2Horizontal 
   9:   
  10:      ' Итерация по видовым экранам,
  11:      ' подсветка каждого экрана и отображение координат его верхнего правого и левого нижнего угла
  12:      Dim vport As AcadViewport
  13:      Dim LLCorner As Variant
  14:      Dim URCorner As Variant 
  15:   
  16:      For Each vport In ThisDrawing.Viewports
  17:          ThisDrawing.ActiveViewport = vport
  18:          LLCorner = vport.LowerLeftCorner
  19:          URCorner = vport.UpperRightCorner
  20:          MsgBox "Viewport: " & vport.Name & " is now active." & _
  21:                 vbCrLf & "Lower left corner: " & _
  22:                 LLCorner(0) & ", " & LLCorner(1) & vbCrLf & _
  23:                 "Upper right corner: " & _
  24:                 URCorner(0) & ", " & URCorner(1)
  25:      Next vport
  26:  End Sub

Comments