Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
AndrejS
Зарегистрирован: 12.10.2006 Сообщения: 18
|
Добавлено: Чт Окт 12, 2006 1:25 pm Заголовок сообщения: VBA позиционирование вида на Attachment |
|
|
Здравствуйте!
У меня такая проблема:
Нужно позиционировать вид на элементе, который находится в Attachment-файле. В данный момент есть такой код:
Код: |
Public Sub ZoomReferenceElement(ele As Element, Transform As Point3d) ' Transform - точка начала координат Attachment-файла
Dim Ext As Point3d ' Extension - тут содержатся размеры
Dim pntHigh As Point3d ' Нижние значения коорд. осей в элементе
Dim pntLow As Point3d ' Верхние значения коорд. осей в элементе
Dim oView As View ' Объект "Вид"
Dim Center As Point3d ' Центр элемента
Dim ViewCounter As Integer ' Счетчик видов
' Считываем мин. и макс. значения коорд осей для рассматриваемого элемента
pntHigh = ele.Range.High
pntLow = ele.Range.Low
' Вносим поправки на смещение Attachment Origin относительно Master Origin
pntHigh.X = pntHigh.X + Transform.X
pntHigh.Y = pntHigh.Y + Transform.Y
pntHigh.Z = pntHigh.Z + Transform.Z
pntLow.X = pntLow.X + Transform.X
pntLow.Y = pntLow.Y + Transform.Y
pntLow.Z = pntLow.Z + Transform.Z
' Вычисляем размеры элемента
Ext.X = pntHigh.X - pntLow.X
Ext.Y = pntHigh.Y - pntLow.Y
Ext.Z = pntHigh.Z - pntLow.Z
' Вычисляем центр элемента
Center.X = (pntHigh.X + pntLow.X) / 2
Center.Y = (pntHigh.Y + pntLow.Y) / 2
Center.Z = (pntHigh.Z + pntLow.Z) / 2
' Позиционируем 4 основных вида на рассматриваемый элемент
For ViewCounter = 1 To 4
' Берем вид, с котрым будем работать
If (ActiveDesignFile.Views(ViewCounter).IsOpen = True) Then
Set oView = ActiveDesignFile.Views(ViewCounter)
With oView
Dim viewExtents As Point3d
viewExtents = .Extents
.SetArea1 pntLow, pntHigh, .Origin, viewExtents.Z, .Rotation, .ActiveDepth
' Проводим зум на центре элемента
.ZoomAboutPoint Center, 1.5
' Обновляем вид
.Redraw
End With
End If
Next ViewCounter
End Sub
|
Всё работает нормально, НО когда attach-файл начинаешь шкалировать, поворачивать, отражать и т.д. видимо сбиваются оси и единицы измерения по X,Y,Z. Вобщем позиционируется вид неправильно. Что делать? |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Пт Окт 13, 2006 10:44 am Заголовок сообщения: |
|
|
У меня все работает нормально, сначала элемент появляестя в центре вида, а потом если что делать с референсом, то все отображается без проблем
Может там дело в передаваемой точке Transform?
Я передавал точку 0,0,0
Или я что-то так не понял...
Опишите подробнее действия, когда возникает проблема, чтобы ее поймать... |
|
Вернуться к началу |
|
|
AndrejS
Зарегистрирован: 12.10.2006 Сообщения: 18
|
Добавлено: Пн Окт 16, 2006 11:19 am Заголовок сообщения: |
|
|
Да, верно. Что-то перемудрил со смещением. Спасибо.
Тперь код такой:
Код: |
Sub ZoomReferenceElement(ele As Element)
Dim Ext As Point3d ' Extension - тут содержатся размеры элемента
Dim pntHigh As Point3d ' Нижние значения коорд. осей в элементе
Dim pntLow As Point3d ' Верхние значения коорд. осей в элементе
Dim oView As View ' Объект "Вид"
Dim ViewCounter As Integer ' Счетчик видов
Dim oLine As LineElement
' Считываем мин. и макс. значения коорд осей для рассматриваемого элемента
pntHigh = ele.Range.High
pntLow = ele.Range.Low
Set oLine = CreateLineElement2(Nothing, pntLow, pntHigh)
ActiveModelReference.AddElement oLine
oLine.Redraw
' Вычисляем размеры элемента
Ext.X = pntHigh.X - pntLow.X
Ext.Y = pntHigh.Y - pntLow.Y
Ext.Z = pntHigh.Z - pntLow.Z
' Позиционируем 4 основных вида на рассматриваемый элемент
Dim pntZoom As Point3d
For ViewCounter = 1 To 4
' Берем вид, с котрым будем работать
If (ActiveDesignFile.Views(ViewCounter).IsOpen = True) Then
Set oView = ActiveDesignFile.Views(ViewCounter)
With oView
pntZoom = Point3dAddScaled(pntLow, Ext, 0.5)
Dim viewExtents As Point3d
viewExtents = .Extents
.SetArea1 pntLow, pntHigh, .Origin, viewExtents.Z, .Rotation, .ActiveDepth
' Проводим зум на центре элемента
.ZoomAboutPoint pntZoom, 1.5
' Обновляем вид
.Redraw
End With
End If
Next ViewCounter
End Sub |
Но тут я не до конца понял с функцией Point3dAddScaled(pntLow, Ext, 0.5) тут первых 2-а параметра ясно что делают, а вот 3-ий что-то шкалирует. Но вот что... Может быть кто-то знает... |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Пн Окт 16, 2006 3:03 pm Заголовок сообщения: |
|
|
Третий параметр просто умножается на вектор между двумя точками. В результате получается вектор с заданным масштабом.
Это легко проследить на след. примере
Код: |
Dim m_atPoints(0 To 1) As Point3d
Dim oEl As LineElement
m_atPoints(1).X = 100# ' все остальные 0
' получаем линию длиной 100.0*0.5=50.0
m_atPoints(1) = Point3dAddScaled(m_atPoints(0), m_atPoints(1), 0.5)
Set oEl = CreateLineElement1(Nothing, m_atPoints)
ActiveModelReference.AddElement oEl
oEl.Redraw
|
|
|
Вернуться к началу |
|
|
AndrejS
Зарегистрирован: 12.10.2006 Сообщения: 18
|
Добавлено: Вт Окт 17, 2006 3:36 pm Заголовок сообщения: |
|
|
Да, всё верно. Спасибо.
Кстати. Этот макрос работает неправильно, если
в окне используется эффект перспективы!
Буду думать над изменением параметров перспективы вида... |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|