Как повернуть 3dsolid
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как повернуть 3dsolid

Как повернуть 3dsolid

Ответ
Поиск в этой теме
Непрочитано 21.04.2009, 11:30 #1
Как повернуть 3dsolid
Mikka
 
Регистрация: 05.08.2008
Сообщений: 155

Доброго времени суток!
У меня такой вопрос:
1. существует выдавленный солид
2. существует линия в пространстве
Нужно повернуть этот солид так, что бы олиния совпала с его осью...

Солид выдавлен в доль оси Z МСК

как это сделать?
Просмотров: 3534
 
Непрочитано 21.04.2009, 11:34
#2
Monolit-aga


 
Регистрация: 24.03.2009
Москва
Сообщений: 223


Наверно Align поможет... или я что то не так понял??
Monolit-aga вне форума  
 
Автор темы   Непрочитано 21.04.2009, 12:59
#3
Mikka


 
Регистрация: 05.08.2008
Сообщений: 155


Цитата:
Сообщение от Monolit-aga Посмотреть сообщение
Наверно Align поможет... или я что то не так понял??
Да наверное подходит, вот только я забы сказать, что мне это нужно сделать на VBA!

т.е так, чтобы команда align не была видна в командной строке! (может кто знает как удалить последнюю команду из списка команд?)
Mikka вне форума  
 
Непрочитано 21.04.2009, 13:12
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Ихмо это большой гемор - определить куда он выдавлен по простому не получиться, начиная с 2007 автокад позволяет пользователю "играть" с величиной выдавливания, но как до нее програмно добраться? Задача сильно упростится, если это будет не солид, а блок из оного - там специально обученная 210 группа есть.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.04.2009, 14:15
#5
Mikka


 
Регистрация: 05.08.2008
Сообщений: 155


Мне не нужно определять куда он выдавлен, я это знаю! Мне нужно выполнить команду align програмно на vba, или через консоль, но после этого удалить ее из списка выполненных команда, а в идеале вообще не записывать в консоль...

Проблема в том, что в VBA у объетка 3dsolid нет метода align...
Mikka вне форума  
 
Непрочитано 22.04.2009, 09:09
#6
serov


 
Регистрация: 06.03.2008
Сообщений: 165


Цитата:
Сообщение от Mikka Посмотреть сообщение
Проблема в том, что в VBA у объетка 3dsolid нет метода align...
align=move + rotate
serov вне форума  
 
Непрочитано 22.04.2009, 10:25
#7
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Mikka Посмотреть сообщение
Мне не нужно определять куда он выдавлен, я это знаю! Мне нужно выполнить команду align програмно на vba, или через консоль, но после этого удалить ее из списка выполненных команда, а в идеале вообще не записывать в консоль...

Проблема в том, что в VBA у объетка 3dsolid нет метода align...
Тогда, все просто!
У тебя есть метод TransformBy, осталось на лету создать матрицу поворота в пространстве и поворот готов...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 22.04.2009, 16:14
#8
Mikka


 
Регистрация: 05.08.2008
Сообщений: 155


вроде бы все просто, матрицы поворота выглядятк так:
Код:
[Выделить все]
Function RotateMatrixZ(ang As Double) As Variant
Dim tmx(0 To 3, 0 To 3) As Double
    tmx(0, 0) = Cos(ang): tmx(0, 1) = -1 * Sin(ang): tmx(0, 2) = 0#: tmx(0, 3) = 0#
    tmx(1, 0) = Sin(ang): tmx(1, 1) = Cos(ang):      tmx(1, 2) = 0#: tmx(1, 3) = 0#
    tmx(2, 0) = 0#:       tmx(2, 1) = 0#:            tmx(2, 2) = 1#: tmx(2, 3) = 0#
    tmx(3, 0) = 0#:       tmx(3, 1) = 0#:            tmx(3, 2) = 0#: tmx(3, 3) = 1#
    RotateMatrixZ = tmx
End Function
Function RotateMatrixX(ang As Double) As Variant
Dim tmx(0 To 3, 0 To 3) As Double
    tmx(0, 0) = 1#:  tmx(0, 1) = 0#:        tmx(0, 2) = 0#:             tmx(0, 3) = 0
    tmx(1, 0) = 0#:  tmx(1, 1) = Cos(ang):  tmx(1, 2) = -1 * Sin(ang):  tmx(1, 3) = 0
    tmx(2, 0) = 0#:  tmx(2, 1) = Sin(ang):  tmx(2, 2) = Cos(ang):       tmx(2, 3) = 0
    tmx(3, 0) = 0#:  tmx(3, 1) = 0#:        tmx(3, 2) = 0#:             tmx(3, 3) = 1#
    RotateMatrixX = tmx
End Function
Function RotateMatrixY(ang As Double) As Variant
Dim tmx(0 To 3, 0 To 3) As Double
    tmx(0, 0) = Cos(ang):   tmx(0, 1) = 0#:   tmx(0, 2) = -1 * Sin(ang):  tmx(0, 3) = 0#
    tmx(1, 0) = 0#:         tmx(1, 1) = 1#:   tmx(1, 2) = 0#:             tmx(1, 3) = 0#
    tmx(2, 0) = Sin(ang):   tmx(2, 1) = 0#:   tmx(2, 2) = Cos(ang):       tmx(2, 3) = 0#
    tmx(3, 0) = 0#:         tmx(3, 1) = 0#:   tmx(3, 2) = 0#:             tmx(3, 3) = 1#
    RotateMatrixY = tmx
End Function

а вот определить углы наклона прямой у меня не выходит:
Sub getAng(normal, angX As Double, angY As Double, angZ As Double)
'возвращает углы поворота вокруг осей x,y,z
    Dim xx  As Double
    Dim yy  As Double
    Dim zz  As Double
    
    xx = normal(0)
    yy = normal(1)
    zz = normal(2)

    
    If xx <> 0 Then angZ = Atn(zz / xx) Else angZ = 0
    If yy <> 0 Then angX = Atn(zz / yy) Else angY = 0
    If xx <> 0 Then angY = Atn(yy / xx) Else angX = 0
        
End
Контур самогоп профиля находится в плоскости xoy МСК

Последний раз редактировалось Солидворкер, 22.04.2009 в 19:07.
Mikka вне форума  
 
Непрочитано 22.04.2009, 18:21
#9
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Матрица поворота в общем случае произведение 3х матриц:
1 - перенос точки относительно которой вращаем в начало координат
2 - собственно повориот
3 - перенос начала координат в точку оносительно которой вращали
т.е. move * rotate * (-move), а не move + rotate
не учитывать move можно только если вращаем относительно начала координат.
Для расчета матрицы поворота не нужно знать никаких углов
матрица поворота - комбинация базисных векторов
уже известен 1 вектор (oz) - ваша линия
для расчета ox и oy - нужно воспользоваться "arbitraly axis algoritm" описаном в хелпе в разделе dxf reference
zamtmn вне форума  
 
Непрочитано 22.04.2009, 19:56
#10
sbi


 
Регистрация: 27.04.2008
SPB
Сообщений: 3,285
Отправить сообщение для sbi с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Матрица поворота в общем случае произведение 3х матриц:
1 - перенос точки относительно которой вращаем в начало координат
2 - собственно повориот
3 - перенос начала координат в точку оносительно которой вращали
т.е. move * rotate * (-move), а не move + rotate
не учитывать move можно только если вращаем относительно начала координат.
Для расчета матрицы поворота не нужно знать никаких углов
матрица поворота - комбинация базисных векторов
уже известен 1 вектор (oz) - ваша линия
для расчета ox и oy - нужно воспользоваться "arbitraly axis algoritm" описаном в хелпе в разделе dxf reference
Проще, для "рабочих и крестьян- все-таки чей-то день рожденья" можно и без матрицы обойтись:
1. переносим тело и его ось на любую точку требуемой прямой. Ось тела и прямая образывает при пересении плоскость.
2.делаем видовой экран на эту плоскость и определяем угол между прямыми
3 Вращаем тело в этой плоскости, таким образом ,чтобы ось тела и прямой совродали.
Вот и все (пока нет времени для кода)
Кончно, с точки зрения векторнй алгебры, матрицы нужно перемножать.
__________________
С уважением sbi

Последний раз редактировалось sbi, 22.04.2009 в 19:59. Причина: уточнение
sbi вне форума  
 
Непрочитано 22.04.2009, 20:24
#11
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Проще, для "рабочих и крестьян- все-таки чей-то день рожденья" можно и без матрицы обойтись:
Смотря что понимать под проще)) помоему проще чем несколько векторных умножений и составления из их результатов матрицы трансформации ничего быть не может.
видовые экраны - это как из тюмени в тобольск через владивосток. хотя если в хорошей компании, с пивом и на халяву, то почему нет
zamtmn вне форума  
 
Непрочитано 22.04.2009, 20:47
#12
sbi


 
Регистрация: 27.04.2008
SPB
Сообщений: 3,285
Отправить сообщение для sbi с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
>>Проще, для "рабочих и крестьян- все-таки чей-то день рожденья" можно и без матрицы обойтись:
Смотря что понимать под проще)) помоему проще чем несколько векторных умножений и составления из их результатов матрицы трансформации ничего быть не может.
видовые экраны - это как из тюмени в тобольск через владивосток. хотя если в хорошей компании, с пивом и на халяву, то почему нет
Тяжелый случай, надо думать, а так не хочется, А попробуй перемнож, может ,что получится. Знаешь что на что умножать?
Пример для изменения viewing direction
Change the viewing direction of the viewport
Dim NewDirection(0 To 2) As Double
NewDirection(0) = -1: NewDirection(1) = -1: NewDirection(2) = 1
ThisDrawing.ActiveViewport.direction = NewDirection
ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport
ThisDrawing.Regen True
__________________
С уважением sbi

Последний раз редактировалось sbi, 22.04.2009 в 21:03.
sbi вне форума  
 
Непрочитано 22.04.2009, 22:14
#13
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>Тяжелый случай, надо думать, а так не хочется
вот именно, думать не хочется. когда в руках молоток - всё вокруг гвозди)) Зачем крутить вид? чтобы узнать угол между отрезками? Думаю в VB должен быть способ попроще, а если нет, можно применить скалярное произведение векторов

>>А попробуй перемнож, может ,что получится. Знаешь что на что умножать?
в бейсике я не силен, в общем случае так -
получаем еденичный вектор N (направление линии "на которую" надо повернуть, N - чтоб название совпадало с цитатой)
далее цитата из хелпа
The algorithm does the following (all vectors are assumed to be in 3D space and specified in the world coordinate system):

Let the given normal vector be called N.
Let the world Y axis be called Wy, which is always (0,1,0).
Let the world Z axis be called Wz, which is always (0,0,1).
Here we are looking for the arbitrary X and Y axes to go with the normal N. They will be called Ax and Ay. N could also be called Az (the arbitrary Z axis) as follows:

If (abs (Nx) < 1/64) and (abs (Ny) < 1/64) then
Ax = Wy X N (where “X” is the cross-product operator).
Otherwise,
Ax = Wz X N.
Scale Ax to unit length.

где cross-product - векторное произведение
в итоге имеем
Ax - базисный еденичный вектор 0X поворота
Ay - базисный еденичный вектор 0Y поворота
N - базисный еденичный вектор 0Z поворота

искомая матрица поворота соответственно будет
Axх Ayx Nx 0
Axy Ayy Ny 0
Axz Ayz Nz 0
0 0 0 1
либо
Axx Axy Axz 0
Ayy Ayy Ayz 0
Nx Ny Nz 0
0 0 0 1
в зависимости от того как в VB принято хранить массивы по строкам или по столбцам


ну и еще
>>1. переносим тело и его ось на любую точку требуемой прямой. Ось тела и прямая образывает при пересении плоскость.
а если они паралельны? Все пропало, Шеф, всё пропало...©))

Последний раз редактировалось zamtmn, 22.04.2009 в 23:05.
zamtmn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как повернуть 3dsolid



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
на злобу дня !! zaza-noza Разное 63 22.05.2009 15:10
Как быстро повернуть содержимое видового экрана Red Nova AutoCAD 11 30.04.2008 19:45
Civil 3D 2008. Как повернуть проектные отметки на плане ? Valery Brelovsky Прочее. Отраслевые разделы 8 23.01.2008 12:05
Как повернуть не относительно горизонтали KorPash AutoCAD 3 11.06.2007 15:17
БРЕД СИВОЙ КОБЫЛЫ Kryaker Разное 1876 29.12.2006 23:41