13/09/2021
Создаём четыре видовых экрана модели и назначаем ортогональные виды
Недавно пользователю понадобилось модифицировать код для создания раздельных видовых экранов в модели и установить каждому из них различные ортогональные виды. Код ниже создаёт четыре раздельных видовых экрана в модели. Для этого мы создаём новые ViewportTableRecord, которые представляют новые видовые экраны, а их параметры устанавливаем на основе текущей ViewportTableRecord. Это гарантирует, что ViewportTableRecord будет правильно настроен для установки орфографического представления. И в конечном итоге мы выполняем показ до границ. Вот скриншот результирующего расположения видовых экранов.
Код - C#: [Выделить]
- // Создаём четыре видовых экрана модели,
- // устанавливаем в каждом различные ортографические виды
- // и показываем до границ.
- [CommandMethod("SplitMVP" )]
- public static void SplitAndSetViewModelViewports()
- {
- Document doc
- = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- db.UpdateExt(true );
- Extents3d dbExtent
- = new Extents3d(db.Extmin, db.Extmax);
- using (Transaction tr
- = db.TransactionManager.StartTransaction())
- {
- ViewportTable vt = tr.GetObject(
- db.ViewportTableId, OpenMode.ForWrite)
- as ViewportTable;
- ViewportTableRecord vtr1 = tr.GetObject(
- doc.Editor.ActiveViewportId,
- OpenMode.ForWrite) as ViewportTableRecord;
- Point2d ll = vtr1.LowerLeftCorner;
- Point2d ur = vtr1.UpperRightCorner;
- vtr1.LowerLeftCorner = ll;
- vtr1.UpperRightCorner = new Point2d(
- ll.X + (ur.X - ll.X) * 0.5,
- ll.Y + (ur.Y - ll.Y) * 0.5);
- vtr1.SetViewDirection(OrthographicView.LeftView);
- ZoomExtents(vtr1, dbExtent);
- ViewportTableRecord vtr2 =
- CreateVTR(vt, vtr1,
- new Point2d(ll.X + (ur.X - ll.X) * 0.5, ll.Y),
- new Point2d(ur.X, ll.Y + (ur.Y - ll.Y) * 0.5),
- dbExtent, OrthographicView.RightView);
- vt.Add(vtr2);
- tr.AddNewlyCreatedDBObject(vtr2, true );
- ViewportTableRecord vtr3 =
- CreateVTR(vt, vtr1,
- vtr1.UpperRightCorner, ur,
- dbExtent, OrthographicView.BottomView);
- vt.Add(vtr3);
- tr.AddNewlyCreatedDBObject(vtr3, true );
- ViewportTableRecord vtr4 =
- CreateVTR(vt, vtr1,
- new Point2d(ll.X, ll.Y + (ur.Y - ll.Y) * 0.5),
- new Point2d(ll.X + (ur.X - ll.X) * 0.5, ur.Y),
- dbExtent, OrthographicView.TopView);
- vt.Add(vtr4);
- tr.AddNewlyCreatedDBObject(vtr4, true );
- // Обновляем дисплей с новыми неперекрывающимися видовыми экранами
- doc.Editor.UpdateTiledViewportsFromDatabase();
- // Применяем изменения
- tr.Commit();
- }
- }
- // Создаём видовой экран модели, используя параметры исходного видового
- // экрана перед установкой ортографического вида и показа до границ
- public static ViewportTableRecord CreateVTR(
- ViewportTable vt, ViewportTableRecord refVTR,
- Point2d ll, Point2d ur, Extents3d dbExtent,
- OrthographicView ov)
- {
- ViewportTableRecord newVTR = new ViewportTableRecord();
- newVTR.LowerLeftCorner = ll;
- newVTR.UpperRightCorner = ur;
- newVTR.Name = "*Active" ;
- newVTR.ViewDirection = refVTR.ViewDirection;
- newVTR.ViewTwist = refVTR.ViewTwist;
- newVTR.Target = refVTR.Target;
- newVTR.BackClipEnabled = refVTR.BackClipEnabled;
- newVTR.BackClipDistance = refVTR.BackClipDistance;
- newVTR.FrontClipEnabled = refVTR.FrontClipEnabled;
- newVTR.FrontClipDistance = refVTR.FrontClipDistance;
- newVTR.Elevation = refVTR.Elevation;
- newVTR.SetViewDirection(ov);
- ZoomExtents(newVTR, dbExtent);
- return newVTR;
- }
- public static void ZoomExtents
- (ViewportTableRecord vtr, Extents3d dbExtent)
- {
- // Получаем пропорции видового экрана
- // вычисляем высоту и ширину
- double scrRatio = (vtr.Width / vtr.Height);
- // Готовим матрицу преобразования ДСК (DCS) в МСК (WCS)
- Matrix3d matWCS2DCS
- = Matrix3d.PlaneToWorld(vtr.ViewDirection);
- // Для ДСК целевая точка – начало координат
- matWCS2DCS = Matrix3d.Displacement
- (vtr.Target - Point3d.Origin) * matWCS2DCS;
- // Поворачиваем ось X МСК на угол поворота
- matWCS2DCS = Matrix3d.Rotation(-vtr.ViewTwist,
- vtr.ViewDirection,
- vtr.Target
- ) * matWCS2DCS;
- matWCS2DCS = matWCS2DCS.Inverse();
- // Преобразуем границы в ДСК
- // определенной по viewdir
- dbExtent.TransformBy(matWCS2DCS);
- // ширина границ в текущем виде
- double width
- = (dbExtent.MaxPoint.X - dbExtent.MinPoint.X);
- // высота границ в текущем виде
- double height
- = (dbExtent.MaxPoint.Y - dbExtent.MinPoint.Y);
- // получаем центр вида
- Point2d center = new Point2d(
- (dbExtent.MaxPoint.X + dbExtent.MinPoint.X) * 0.5,
- (dbExtent.MaxPoint.Y + dbExtent.MinPoint.Y) * 0.5);
- // проверяем больше ли ширина, чем у текущего окна
- // если нет, тогда получаем новую высоту согласно пропорциям
- // видовых экранов
- if (width > (height * scrRatio))
- height = width / scrRatio;
- vtr.Height = height;
- vtr.Width = height * scrRatio;
- vtr.CenterPoint = center;
- }
Автор перевода: Александр Ривилис
Опубликовано 13.09.2021
Опубликовано 13.09.2021