Тема: настройка ViewPort

Создали на Layout свой ViewPort
КАК СКАЗАТЬ ЕМУ СМОТРЕТЬ ВОТ НА ТАКУЮ ТОЧКУ С КООРДИНАТАМИ Х,У ВОТ ПОД ТАКИМ МАСШТАБОМ В ModelSpace
Предположим переменная objVP уже указывает на нужный ViewPort. Знающие люди, прошу подскажите пожалуйста что дальше делать с энтим портом.

Re: настройка ViewPort

во-первых, не ViewPort, а PViewPort
во-вторых, поиск неимоверно рулит! smile

Public Sub VPAdjust(VP As AcadPViewport, Tg As Variant)
 Dim Min, Max As Variant
 VP.GetBoundingBox Min, Max
 oldMode = ThisDrawing.MSpace
 ThisDrawing.MSpace = True
 Min = ThisDrawing.Utility.TranslateCoordinates(Min, acPaperSpaceDCS, acDisplayDCS, False)
 Tg(0) = Tg(0) - Min(0)
 Tg(1) = Tg(1) - Min(1)
 VP.Target = Tg
 ThisDrawing.MSpace = oldMode
End Sub

Tg - это точка пространства модели на которую "смотрит" центр PViewPort'а
ну и код, с помощью которого в пространстве модели будет нарисован прямоугольник, показывающий границы проекции:

Public Sub VPExtentsBox(oPsVp As AcadPViewport)
'draws a box in MS representing the extents
'of the current PS viewport
 Dim oBox As AcadLWPolyline
 Dim dPt1(0 To 2) As Double
 Dim dPt2(0 To 2) As Double
 Dim vCtrPt As Variant
 Dim vCtrPt1 As Variant
 Dim vMinPoint As Variant
 Dim vMaxPoint As Variant
 Dim BBpoints(0 To 9) As Double 'Bounding box points list
 If ThisDrawing.ActiveSpace = acPaperSpace Then 'first check for tilemode = 0
  'If ThisDrawing.MSpace = True Then 'then make sure ms is Active
   vCtrPt = ThisDrawing.GetVariable("viewctr")
   VPCoords oPsVp, vMinPoint, vMaxPoint
   BBpoints(0) = vMinPoint(0): BBpoints(1) = vMinPoint(1)
   BBpoints(2) = vMaxPoint(0): BBpoints(3) = vMinPoint(1)
   BBpoints(4) = vMaxPoint(0): BBpoints(5) = vMaxPoint(1)
   BBpoints(6) = vMinPoint(0): BBpoints(7) = vMaxPoint(1)
   BBpoints(8) = vMinPoint(0): BBpoints(9) = vMinPoint(1)
   Set oBox = ThisDrawing.ModelSpace.AddLightWeightPolyline(BBpoints)
  'Else
   'MsgBox "The active viewport must have ModelSpace active for this command to work.", vbExclamation, "Viewport Extents Box"
  'End If
 Else
  MsgBox "You must be in paperspace with the active viewport in ModelSpace for this command to work.", vbExclamation, "Viewport Extents Box"
 End If
End Sub

Re: настройка ViewPort

отт ведь, забыл:

Public Sub VPCoords(VP As AcadPViewport, ll, ur)
'Calculates the extents of a PaperSpace viewport in ModelSpace units
'Arguments: An AcadPViewport entity and two variants.
' The variants will be filled with the corner points.
 Dim Min, Max, oldMode As Boolean
 VP.GetBoundingBox Min, Max
 oldMode = ThisDrawing.MSpace
 ThisDrawing.MSpace = True
 ll = ThisDrawing.Utility.TranslateCoordinates(Min, acPaperSpaceDCS, acDisplayDCS, False)
 ur = ThisDrawing.Utility.TranslateCoordinates(Max, acPaperSpaceDCS, acDisplayDCS, False)
 ThisDrawing.MSpace = oldMode
End Sub

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

Re: настройка ViewPort

Спасибо за совет
Я сделал уже следующим образом, может это поможет избежать косяка когда "Важно: PViewPort, скоторым проводятся все эти манипуляции должен весь находится в границах видимой области экрана. иначе получается не совсем то что хочется. а точнее типичное нето".
Создал на бумаге PViewPort (хотя кстати имя его "AcDbViewport" - поэтому я его назвал ViewPort)
захожу в него и посылаю команду Zoom Window с координатами нужной области, вроде все правильно работает и пока вышеуказанного косяка не замечал.

Re: настройка ViewPort

Подскажите, пожалуйста, что делать.
У меня почему-то функция VPAdjust (см. 20-ой пост) вылетает на строчке:

ThisDrawing.MSpace = True

почему это может быть?...
Более подробно, дело обстоит так. Я создаю вьюпорт через SendCommand, потом нужно присвоить ему Target. Если присвоить Target вьюпорту, созданному программно

Dim oldVP As AcadPViewport
Set oldVP = ThisDrawing.PaperSpace.AddPViewport(pt_center, width, height)
oldVP.Target = Tg

, то всё хорошо. Координаты Tg - на ModelSpase.
Если создавать PViewPort с помощью SedCommand, то получается, что PViewPort смотрит на некоторую непонятную мне точку, а координаты его Target-a в Debuger-e показвыаются (0,0,0).
Почему-то с присвоением CustomScale проблем не возникло, а Target ну никак победить не могу... Надеюсь на вашу помощь.

Re: настройка ViewPort

masha пишет:

У меня почему-то функция VPAdjust (см. 20-ой пост) вылетает

Запускаете в ModelSpace?
И вообще у вышеприведенного кода, по-моему, немного другой смысл:)
Просмотрите еще раз все свойства объекта viewport, - там есть еще свойство .center Может, Вам нужно именно оно?
И вообще, штудировать хелп куда полезнее.. И время экономите, и в процессе еще много "левой" полезной информации откладывается в подкорке:)

Re: настройка ViewPort

Help я уже читала, ответа не нашла, поэтому и спрашиваю. :) Center - это, насколько я поняла, на листе, а вовсе не в модели. Мне нужно, чтоб мой вьюпорт смотрел на заданную точку модели. А что понимается под запуском в ModelSpace?  Вообще, перед вызовом этой функции у меня было

ThisDrawing.ActiveSpace = acPaperSpace

, но даже если на время вернуть ModelSpace, всё рано ничего не получается с Target.

Re: настройка ViewPort

Хочется всё-таки поставить точку в этом и подобных вопросах. Target и Center для меня никогда не работали, несмотря на многочисленные примеры Дмитрия про Target. Вид смотрит куда попало. Работает считывание переменной VIEWCTR времени исполнения с активного порта. Вот эта функция C# отцентрует геометрию модели в порте, если даны размеры и центр. Последний параметр для манипуляции масштабом геометрии, если хотим чтобы заполняло всё окошко камеры или нет, 0-1.

        public static void CenterPaperspaceViewport(AcadPViewport viewport, double ModelCenterX, double ModelCenterY, double ModelWidth, double ModelHeight, double ViewportConsume)
        {
            AcadDocument doc = (AcadDocument)viewport.Document;
            bool oldMode = doc.MSpace;
            AcadPViewport oldActiveViewport = null;
            if (doc.ActivePViewport != null)
            {
                oldActiveViewport = (AcadPViewport)doc.ActivePViewport;
            }
            doc.MSpace = true;
            doc.ActivePViewport = viewport;
            //centering
            Object vpcenter = doc.GetVariable("VIEWCTR");
            double[] target = new double[3];
            target[0] = ModelCenterX - ((double[])vpcenter)[0];
            target[1] = ModelCenterY - ((double[])vpcenter)[1];
            target[2] = 0;
            viewport.Target = target;
            //scaling
            double scaleWhat, scaleTo;
            if (ModelWidth > ModelHeight)
            {
                scaleTo = viewport.Width;
                scaleWhat = ModelWidth;
            }
            else
            {
                scaleTo = viewport.Height;
                scaleWhat = ModelHeight;
            }
            double factor = (scaleTo * ViewportConsume) / scaleWhat;
            viewport.StandardScale = AcViewportScale.acVpCustomScale;
            viewport.CustomScale = factor;
            doc.MSpace = oldMode;
            doc.ActivePViewport = oldActiveViewport;
        }