Тема: Поворот изометрического вида

Здравствуйте уважаемые Знатоки. Хочу задать вопрос, который неоднократно поднимался на форуме, но на который, так и не получен вразумительный ответ
Имеется 3d модель. Создаю шаблон листа с тремя видовыми экранами: вид сверху, вид спереди и изометрический вид. Нужно, развернуть все виды вдоль оси Z на определенный угол. Если с планарными видами, все вроде бы понятно, то с изометрическим видом проблемы. Я уточняю, что речь идет не о объемном изображении, а о изометрическом. Поворачивать объект  в пространстве модели нельзя.

Re: Поворот изометрического вида

Уважаемые Знатоки, если вопрос вам кажется неясный и запутанный, то пожалуйста разъясните следующее. Имеется лист с несколькими видовыми экранами, подскажите, как написать код , чтобы можно синхронно поворачивать все экраны на определенный угол вокруг оси Z. Я думаю, для этого нужно создать именной UCS и применить его ко всем видовым экранам. Но проблема в том, что направление осей меняются, а модель не поворачивается.

Re: Поворот изометрического вида

Однажды  вам уже ответили:https://www.caduser.ru/forum/topic30602.html
PViewport.Direction
[rus]Spaset otca russkoj demokratii
[/rus]

Re: Поворот изометрического вида

Не конкретно ответ на твой вопрос но многое
даст понять

Public Sub AlignViewPorts()
' By Said Abbassi Nov. 2006
' This is my first successful program (as I think), I publish it as a gift to all the world designers
' Please email comments or suggestions to abbassisaid@yahoo.fr
' This routine aligns the views in 2 or 3 paper view ports
' by selecting a source point in a paper view port,
' and a target points to be aligned with, horizontally or vertically or both in other paper view ports
Dim oMyPViewPort As AcadPViewport
Dim bOldStatePVP As Boolean
Dim vPntTargetMH As Variant
Dim vPntTargetPH As Variant
Dim vPntTargetMV As Variant
Dim vPntTargetPV As Variant
Dim vPntToMoveM As Variant
Dim vPntToMoveP As Variant
Dim vPntNewM As Variant
Dim vPntNewP(0 To 2) As Double
Dim vViewCtr As Variant
If ThisDrawing.ActiveSpace acPaperSpace Then
ThisDrawing.Utility.Prompt vbCrLf & "This command requires the paper space to be on, please active a layout and try again." & vbCr
Exit Sub
ElseIf ThisDrawing.MSpace = False Then
ThisDrawing.Utility.Prompt vbCrLf & "This command requires an active view port, please have one active and try again." & vbCr
Exit Sub
End If
On Error GoTo 1
'Input for horizontal or vertical alignment
Dim sKeyWord As String
Dim sResp As String
sKeyWord = "Vertical Horizontal Both"
ThisDrawing.Utility.InitializeUserInput 2 + 4 + 8 + 16 + 32 + 64, sKeyWord
sResp = ThisDrawing.Utility.GetKeyword(vbCrLf & "Select alignement type: Vertical, Horizontal, :")
If sResp = "" Then sResp = "Both"
' Selection of a point in the 1st view port to be aligned (Moved)
vPntToMoveM = ThisDrawing.Utility.GetPoint(, vbCrLf & "Select the point to be aligned (Moved):")
Set oMyPViewPort = ThisDrawing.ActivePViewport
bOldStatePVP = oMyPViewPort.DisplayLocked
oMyPViewPort.DisplayLocked = False
' Translate it into paper space
vPntToMoveP = ThisDrawing.Utility.TranslateCoordinates(vPntToMoveM, acDisplayDCS, acPaperSpaceDCS, False)
' Selection of a horizontal target point
If sResp = "Horizontal" Or sResp = "Both" Then
vPntTargetMH = ThisDrawing.Utility.GetPoint(, vbCrLf & "Activate the horizontal view port and select a target point:")
' Translate it into paper space
vPntTargetPH = ThisDrawing.Utility.TranslateCoordinates(vPntTargetMH, acDisplayDCS, acPaperSpaceDCS, False)
End If
' Selection of a vertical target point
If sResp = "Vertical" Or sResp = "Both" Then
vPntTargetMV = ThisDrawing.Utility.GetPoint(, vbCrLf & "Activate the vertical view port and select a target point:")
' Translate it into paper space
vPntTargetPV = ThisDrawing.Utility.TranslateCoordinates(vPntTargetMV, acDisplayDCS, acPaperSpaceDCS, False)
End If
' Horizontal alignment
If sResp = "Horizontal" Or sResp = "Both" Then
vPntNewP(0) = vPntToMoveP(0)
vPntNewP(1) = vPntTargetPH(1)
vPntNewP(2) = vPntToMoveP(2) ' for clarity only
End If
' Vertical alignment
If sResp = "Vertical" Or sResp = "Both" Then
vPntNewP(0) = vPntTargetPV(0)
If sResp = "Vertical" Then vPntNewP(1) = vPntToMoveP(1)
vPntNewP(2) = vPntToMoveP(2) ' for clarity only
End If
' Activate the source view port
ThisDrawing.ActivePViewport = oMyPViewPort
' Translate the new point vPntNewP into MS
vPntNewM = ThisDrawing.Utility.TranslateCoordinates(vPntNewP, acPaperSpaceDCS, acDisplayDCS, False)
' Get the center view
vViewCtr = ThisDrawing.GetVariable("VIEWCTR")
If sResp = "Vertical" Or sResp = "Both" Then vViewCtr(0) = vViewCtr(0) + (vPntToMoveM(0) - vPntNewM(0))
If sResp = "Horizontal" Or sResp = "Both" Then vViewCtr(1) = vViewCtr(1) + (vPntToMoveM(1) - vPntNewM(1))
ZoomCenter vViewCtr, ThisDrawing.GetVariable("VIEWSIZE")
oMyPViewPort.DisplayLocked = bOldStatePVP
Exit Sub
1: ThisDrawing.Utility.Prompt "Error: Program ended." & vbCrLf
End Sub

~'J'~

Re: Поворот изометрического вида

Спасибо всем! Я этот вопрос уже один раз поднимал на форуме но разобраться до конца не смог. Постараюсь разобраться с кодом.
Gogi спасибо, что не оставил без ответа отца русской демократии.

Re: Поворот изометрического вида

Дорогие друзья, подскажите пожалуйста, в чем ошибка.
Делаю цикл по всем видовым экранам на листе. Хочу узнать их target и center. Пока хочу просто понять данный метод, а затем захочу вводить эти значения. Но выдается ошибка Can’t assign to array. Подскажите пожалуйста, как правильно задать этот чертов массив.
Dim centerPoint(0 To 2) As Double
    Dim Vie As Variant
    ThisDrawing.ActiveSpace = acPaperSpace
    For Each Vie In ThisDrawing.PaperSpace
   If Vie.ObjectName = "AcDbViewport" Then
    TextBox2.Text = Vie.ObjectName
    ThisDrawing.MSpace = True
    centerPoint = ThisDrawing.ActivePViewport.center
    centerPoint = ThisDrawing.ActivePViewport.Target
    End If
    Next

Re: Поворот изометрического вида

> Андрей
Ты указываешь только на активный вьюпорт а на самом
деле в цикле перебираешь все:

centerPoint = Vie.center
centerPoint = Vie.Target

Впрочем на рисунке не проверял
~'J'~

Re: Поворот изометрического вида

Спасибо за внимание, но все равно Автокад также ругается.
Ему не нравиться массив точки center и target.
Если даже я выделяю один видовой экран, то все равно он возмущается и указывает на неправильный массив.

Re: Поворот изометрического вида

Строчки типа centerPoint = Vie.center не работает.
Но мой старый вариант заработал, если массив координаты, я «растаскиваю» отдельно по каждой оси.
Dim centerPoint(0 To 2) As Double
Dim Vie As Variant
ThisDrawing.ActiveSpace = acPaperSpace
For Each Vie In ThisDrawing.PaperSpace
If Vie.ObjectName = "AcDbViewport" Then
centerPoint = Vie.center
'ThisDrawing.MSpace = True
centerPoint(0) = ThisDrawing.ActivePViewport.center(0)
centerPoint(1) = ThisDrawing.ActivePViewport.center(1)
centerPoint(2) = ThisDrawing.ActivePViewport.center(2)
ThisDrawing.MSpace = False
End If
Next
Но почему не работает строка типа 'centerPoint = ThisDrawing.ActivePViewport.center?

Re: Поворот изометрического вида

Уважаемые Знатоки, подскажите пожалуйста, я изменяю значения Сenter и Target, но в видовых экранах вид не меняется. Читал хелп, но не понял.
Dim centerPoint(0 To 2) As Double
Dim Vie As Variant
ThisDrawing.ActiveSpace = acPaperSpace
For Each Vie In ThisDrawing.PaperSpace
If Vie.ObjectName = "AcDbViewport" Then
ThisDrawing.MSpace = True
ThisDrawing.ActivePViewport.center(0) = 1000
ThisDrawing.ActivePViewport.center(1) = 200
ThisDrawing.ActivePViewport.center(2) = 300
ThisDrawing.ActivePViewport.Target(0) = 1000
ThisDrawing.ActivePViewport.Target(1) = 400
ThisDrawing.ActivePViewport.Target(2) = 500
ThisDrawing.MSpace = False
ThisDrawing.Regen acActiveViewport
'ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport
End If
Next

Re: Поворот изометрического вида

Попробуй:

Dim Vie As Variant
Dim NewDirection(0 To 2) As Double
NewDirection(0) = -1: NewDirection(1) = -1: NewDirection(2) = 1
ThisDrawing.ActiveSpace = acPaperSpace
For n = 1 To ThisDrawing.PaperSpace.Count - 1
    Set Vie = ThisDrawing.PaperSpace.Item(n)
    If Vie.ObjectName = "AcDbViewport" Then
        Vie.Direction = NewDirection
    End If
Next

Re: Поворот изометрического вида

Большое спасибо, все работает!!!!
Этот форум, просто классный. Большое спасибо всем специалистам и организаторам данного форума, за вашу деятельность!!!!

Re: Поворот изометрического вида

Насколько я понял, свойство Direction определяет точку с которой смотришь на начало координат. Теперь не меняя этой точки, как я могу повернуть «камеру» по отношению к осям.
Если вопрос туманен, то более простым языком. В видовом экране вид Top. Хочу повернуть вид так, чтобы определенная грань модели была параллельна видовому окну. Во всех примерах в инете речь идет о создании нового вида, а мне нужно повернуть уже созданный.
Очень прошу подскажите пожалуйста, а то я с этими PViewport и Viewport окончательно запутался, не могу даже понять разницу между ними.