Кватернионы. Чертежи. Аксонометрия

Автор Vitalij Lysanov, 02.10.21, 20:53:53

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Vitalij Lysanov



Кватернионы. Чертежи. Аксонометрия
По отзывам, кватернионы устойчивей поворачивают по сравнению с углами Эйлера.

Тут как на автомашине, есть направление, поворачиваешь руль, и какие могут быть сложности.

Будем разбираться с опорными точками 3D модели.

Проекция получается при неизменном направлении взгляда, только точки модели поворачиваем в данном случае вдоль осей координат на 90 градусов.

Аксонометрия пока без искажений, тоже просто два поворота, уже не 90 градусов, а меньше.


Рис.    Простая модель и поворот точек для проекций.

На аксонометрии и на чертеже выделяем одинаковые отрезки и длина их идентична.

Это все в 3D, чертеж получаем если убрать одну координату.



Рис.    Тоже только поворот на аксонометрию.


Так любые точки можно получить, останется только соединить точки.

В начертательной геометрии тоже много плоскостей поворачивают.








Программу для кватернионов легко устанавливать в Anaconda.
Просто в консоли набрал Pip...   Conda...

Программа формирует полный текст Макро, например для ломаных линий.
Записывает файл на диск.

Прямо в программе вызывается Pythonw и файл Макро, все быстро рисуется, как родное Макро.



Пример вывода 3D графики штатными средствами в Anaconda.

Компас конечно дает лучшее качество, так что можно ставить конвертер, получать Макро код и графика будет в Компас, можно и поверхность построить.

   


Рис. Семейство кривых и поверхность.





Рис     Пример работы поворотов.

Белый объект поворачивается вокруг оси на заданный в цикле угол.
Это задается направление вектора и угол в алгебраическом виде.


Например так:


for u in range(int(stepCnt/3)):   
   
    ug=u/3

    v=np.array([0.1,0,0])
   
    q1= Quaternion(axis=    [0, 0, 1], angle= ug  )X
 
   re1=q1.rotate(v)






Полный код рисующий картину приведенную выше:

# -*- coding: utf-8 -*-
"""
Created on Fri Sep 24 23:01:07 2021

@author: Userets
"""



import numpy as np
import numpy
from pyquaternion import Quaternion

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D






from bokeh.plotting import figure, output_file, show
from bokeh.io import output_notebook
output_notebook()

%matplotlib


import math



# ##_______________________________________________________________________________________________

sh="""# -*- coding: utf-8 -*-
#|лом

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject  = kompas_object

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication  = application


Documents = application.Documents
#  Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()



"""
# ##_______________________________________________________________________________________________





# ##_______________________________________________________________________________________________

nach_lom = ""iPart7 = kompas_document_3d.TopPart"
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

obj = iPart.NewEntity(kompas6_constants_3d.o3d_polyline)
iDefinition = obj.GetDefinition()
iDefinition.closed = False
"""

# ##_______________________________________________________________________________________________









# ##_______________________________________________________________________________________________
zav_lom=""obj.name = ""1111111"""
iColorParam = obj.ColorParam()
iColorParam.color = 16711680
obj.Create()
"""
# ##_______________________________________________________________________________________________


# ##_______________________________________________________________________________________________
zav_lom_1=""obj.name = ""1111111"""
iColorParam = obj.ColorParam()
iColorParam.color = 711680
obj.Create()
"""
# ##_______________________________________________________________________________________________


# ##_______________________________________________________________________________________________
zav_lom_2=""obj.name = ""1111111"""
iColorParam = obj.ColorParam()
iColorParam.color = 6711680
obj.Create()
"""
# ##_______________________________________________________________________________________________


# ##_______________________________________________________________________________________________
zav_lom_3=""obj.name = ""1111111"""
iColorParam = obj.ColorParam()
iColorParam.color = 11680
obj.Create()
"""
# ##_______________________________________________________________________________________________


def zav_lom_def(r,g,b):
 #    print(f)
     


     r=abs(r*255)
     g=abs(g*255)
     b=abs(b*255)

     print(r,g,b,______"")"

     f.write("obj.name = ""1111111""")
     f.write("\n")
 
     
 
     f.write("iColorParam = obj.ColorParam()")
     f.write("\n")


     cv=   r +  256*g +  256*256*b
     print(r,g,b,"______",str(cv))


     f.write("iColorParam.color = "+str(cv))
     f.write("\n")



     f.write("obj.Create()")
     f.write("\n")















"""

sh=

# -*- coding: utf-8 -*-
#|лом

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule({75C9F5D0-B5B8-4526-8681-9903C567D2ED}"", 0, 1, 0).constants"
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject  = kompas_object

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication  = application


Documents = application.Documents
#  Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()

iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

obj = iPart.NewEntity(kompas6_constants_3d.o3d_polyline)
iDefinition = obj.GetDefinition()
iDefinition.closed = False
iDefinition.AddVertex(3.525321988818, -2, -0.850903524534, 0)
iDefinition.AddVertex(7.128676540056, -2, -0.976744607149, 0)
iDefinition.AddVertex(3.525321988818, -2, -0.850903524534, 0)
iDefinition.AddVertex(3.496406662385, -1.672805303204, -0.804067196152, 0)
iDefinition.AddVertex(7.099761213623, -1.672805303204, -0.929908278767, 0)
iDefinition.AddVertex(3.496406662385, -1.672805303204, -0.804067196152, 0)
iDefinition.AddVertex(3.412843858818, -1.38163019693, -0.668714240082, 0)
iDefinition.AddVertex(7.016198410056, -1.38163019693, -0.794555322697, 0)
iDefinition.AddVertex(3.412843858818, -1.38163019693, -0.668714240082, 0)
iDefinition.AddVertex(3.283832681881, -1.158529015192, -0.459745136377, 0)
iDefinition.AddVertex(6.887187233119, -1.158529015192, -0.585586218992, 0)
iDefinition.AddVertex(3.283832681881, -1.158529015192, -0.459745136377, 0)
iDefinition.AddVertex(3.123575469852, -1.028062098637, -0.200164480226, 0)
iDefinition.AddVertex(6.72693002109, -1.028062098637, -0.326005562841, 0)
iDefinition.AddVertex(3.123575469852, -1.028062098637, -0.200164480226, 0)
iDefinition.AddVertex(2.94971431538, -1.004592042248, 0.081451504386, 0)
iDefinition.AddVertex(6.553068866618, -1.004592042248, -0.044389578229, 0)
iDefinition.AddVertex(2.94971431538, -1.004592042248, 0.081451504386, 0)
iDefinition.AddVertex(2.781388916185, -1.090702573174, 0.354100809942, 0)
iDefinition.AddVertex(6.384743467423, -1.090702573174, 0.228259727327, 0)
iDefinition.AddVertex(2.781388916185, -1.090702573174, 0.354100809942, 0)
iDefinition.AddVertex(2.637129560235, -1.276914118262, 0.587768535714, 0)
iDefinition.AddVertex(6.240484111472, -1.276914118262, 0.461927453099, 0)
iDefinition.AddVertex(2.637129560235, -1.276914118262, 0.587768535714, 0)
iDefinition.AddVertex(2.532817198478, -1.542727373364, 0.756731111354, 0)
iDefinition.AddVertex(6.136171749716, -1.542727373364, 0.630890028739, 0)
iDefinition.AddVertex(2.532817198478, -1.542727373364, 0.756731111354, 0)
iDefinition.AddVertex(2.479935172771, -1.85887999194, 0.84238810462, 0)
iDefinition.AddVertex(6.083289724009, -1.85887999194, 0.716547022005, 0)
iDefinition.AddVertex(2.479935172771, -1.85887999194, 0.84238810462, 0)
iDefinition.AddVertex(2.484305059475, -2.190567962875, 0.835309870552, 0)
iDefinition.AddVertex(6.087659610712, -2.190567962875, 0.709468787937, 0)
iDefinition.AddVertex(2.484305059475, -2.190567962875, 0.835309870552, 0)
obj.name = "Ломаная:3"
iColorParam = obj.ColorParam()
iColorParam.color = 16711680
obj.Create()








iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

obj = iPart.NewEntity(kompas6_constants_3d.o3d_polyline)
iDefinition = obj.GetDefinition()
iDefinition.closed = False


iDefinition.AddVertex(6.127892350324, -5, -3.446707237203, 0)
iDefinition.AddVertex(7.913735108867, -5, -6.578921412792, 0)
iDefinition.AddVertex(6.127892350324, -5, -3.446707237203, 0)
iDefinition.AddVertex(6.152555690432, -4.672805303204, -3.397498930854, 0)
iDefinition.AddVertex(7.938398448975, -4.672805303204, -6.529713106443, 0)
iDefinition.AddVertex(6.152555690432, -4.672805303204, -3.397498930854, 0)
iDefinition.AddVertex(6.223830619647, -4.38163019693, -3.255291162703, 0)
iDefinition.AddVertex(8.00967337819, -4.38163019693, -6.387505338292, 0)
iDefinition.AddVertex(6.223830619647, -4.38163019693, -3.255291162703, 0)
iDefinition.AddVertex(6.33387075846, -4.158529015192, -3.035739032384, 0)
iDefinition.AddVertex(8.119713517003, -4.158529015192, -6.167953207973, 0)
iDefinition.AddVertex(6.33387075846, -4.158529015192, -3.035739032384, 0)
iDefinition.AddVertex(6.470562216334, -4.028062098637, -2.763012179289, 0)
iDefinition.AddVertex(8.256404974877, -4.028062098637, -5.895226354877, 0)
iDefinition.AddVertex(6.470562216334, -4.028062098637, -2.763012179289, 0)
iDefinition.AddVertex(6.618857162761, -4.004592042248, -2.467134041049, 0)
iDefinition.AddVertex(8.404699921304, -4.004592042248, -5.599348216638, 0)
iDefinition.AddVertex(6.618857162761, -4.004592042248, -2.467134041049, 0)
iDefinition.AddVertex(6.762430384346, -4.090702573174, -2.180676690161, 0)
iDefinition.AddVertex(8.548273142889, -4.090702573174, -5.31289086575, 0)
iDefinition.AddVertex(6.762430384346, -4.090702573174, -2.180676690161, 0)
iDefinition.AddVertex(6.885476464002, -4.276914118262, -1.935175101311, 0)
iDefinition.AddVertex(8.671319222545, -4.276914118262, -5.0673892769, 0)
iDefinition.AddVertex(6.885476464002, -4.276914118262, -1.935175101311, 0)
iDefinition.AddVertex(6.974449737792, -4.542727373364, -1.757655588769, 0)
iDefinition.AddVertex(8.760292496335, -4.542727373364, -4.889869764357, 0)
iDefinition.AddVertex(6.974449737792, -4.542727373364, -1.757655588769, 0)
iDefinition.AddVertex(7.019555484346, -4.85887999194, -1.667660584652, 0)
iDefinition.AddVertex(8.805398242889, -4.85887999194, -4.799874760241, 0)
iDefinition.AddVertex(7.019555484346, -4.85887999194, -1.667660584652, 0)
iDefinition.AddVertex(7.015828187604, -5.190567962875, -1.675097288647, 0)
iDefinition.AddVertex(8.801670946147, -5.190567962875, -4.807311464236, 0)
iDefinition.AddVertex(7.015828187604, -5.190567962875, -1.675097288647, 0)
obj.name = "Ломаная:3"
iColorParam = obj.ColorParam()
iColorParam.color = 16711680
obj.Create()

"""




#______________________________________________________

stepCnt = int(19*3)
#stepCnt = int(11*3)


xs = np.zeros((stepCnt + 0,))
ys = np.zeros((stepCnt + 0,))
zs = np.zeros((stepCnt + 0,))





n=0


#f = open(C:\\Users\\Userets\\Documents\\lom.m3m"", 'w')"
f = open("C:\\Users\\All Users\\ASCON\\KOMPAS-3D\\20\\Python 3\\App\\lom.m3m", 'w')

#C:\\Users\\All Users\\ASCON\\KOMPAS-3D\\20\\Python 3\\App\\
f.write(sh)







f.write(nach_lom)

for u in range(int(stepCnt/3)):
   
   
    ug=u/3
   
  #  sm=np.array([10,0,0])
   
    v=np.array([0.1,0,0])
   
    q1= Quaternion(axis=    [0, 0, 1], angle= ug  ) # Rotate 180 about X
    q_y_1= Quaternion(axis= [0, 1, 0], angle= 0.1  ) # Rotate 180 about X
 
    re1=q1.rotate(v)
  #  re1=q_y_1.rotate(re)




#    re=q_y_1.rotate(re1)
#    re=q_y_1.rotate(re1)
    re=re1   
   
    xs[n]=re[0]
    ys[n]=re[1]
    zs[n]=re[2]
    n=n+1
                     ##   ку1 по окружности   

    xs[n]=re[0]+0.3
    ys[n]=re[1]-0.1
    zs[n]=re[2]+3.3
    n=n+1
                     ## Наклонно   -2  0  -3
                     
                     

    xs[n]=re[0]
    ys[n]=re[1]
    zs[n]=re[2]
    n=n+1
                    #  вернуличь на окружнсть   



for n in range(int(stepCnt/1)):

    qnov= Quaternion(axis=    [0, 0, 1], angle= 0.0  ) # Rotate 180 about X


    no=np.array([xs[n],ys[n],zs[n]])
                                       # подряж берем точки окружности


    re=qnov.rotate(no)
                                     # по игрек поворот 0.7

 
    xs[n]=re[0]
    ys[n]=re[1]
    zs[n]=re[2]
                                     # повернули на 0ю7 и записали
   
    xs[n]=xs[n]
    ys[n]=ys[n]
    zs[n]=zs[n]
                                    # смещение для второго отображения

   


    # f.write(str(xs[n]))
    # f.write("\t")

    # f.write(str(ys[n]))
    # f.write("\t")

    # f.write(str(zs[n]))           #Пошем только вророе

    # f.write("\n")

    tmp1="iDefinition.AddVertex("+str(xs[n])+" , "+  str( ys[n])+   " , " + str(zs[n]) +   " , 0) "
    f.write(str(tmp1))

    f.write("\n")


f.write("\n")

##_____________________________________________
#f.write(zav_lom)
zav_lom_def(1,1,1)
##_________________________________________________

#######################################################################################
#######################################################################################
#######################################################################################
#######################################################################################
#######################################################################################
#######################################################################################
#######################################################################################
#######################################################################################
#######################################################################################


f.write("##_________________ \n")
f.write("##_________________ \n")
f.write("##_________________ \n")



f.write(nach_lom)










cvv=np.array([1,  0,   1])

for ang in range(3,62,3):
   
    angl=ang/10
   
    for n in range(int(stepCnt/1)):
   
      #  print(angl)
        pov=math.pi/4
   
      #  qnov= Quaternion(axis=    cvv, angle=-math.pi/28 ) # Rotate 180 about X
        qnov= Quaternion(axis=    cvv, angle=angl ) # Rotate 180 about X
   
   
        no=np.array([xs[n],ys[n],zs[n]])
   
        re=qnov.rotate(no)
   
   
        tmp1="iDefinition.AddVertex("+str(re[0])+" , "+  str( re[1])+   " , " + str(re[2]) +   " , 0) "



        f.write(str(tmp1))
   
        f.write("\n")
   
   
   
   
    ##___________________________________________________________
    #f.write(zav_lom_3)
   
    zav_lom_def(cvv[0],cvv[1],cvv[2])
    ##___________________________________________________
   
   
   
   
   
f.close()
   
 




from subprocess import call
call(["C:\\Users\\All Users\\ASCON\\KOMPAS-3D\\20\\Python 3\\App\\pythonw.exe", "C:\\Users\\All Users\\ASCON\\KOMPAS-3D\\20\\Python 3\\App\\lom.m3m"])



           

Toptotal

Не чего не понятно , но очень интересно ! Продолжайте !

Golovanev


Vitalij Lysanov

03.10.21, 06:51:27 #3 Последнее редактирование: 03.10.21, 07:38:45 от Vitalij Lysanov
Цитата: Toptotal от 03.10.21, 03:43:30Не чего не понятно , но очень интересно ! Продолжайте !

Можно продолжить в направлении постановки реального размера в аксонометрии.

В 3D аксонометрии  только повороты и отрезки имеют реальный размер.
Только для отрезка общего положения поставить размер 3D это проблема.

Ориентация нормально к одной из систем координат и размеры должны нормально читаться на чертеже с аксонометрией.

Есть размеры с полочками.
___


 
Можно самому строить размерные линии и ставить текст в 3D.

Можно размер ставить как позицию, только возле самой линии.
Линию со стрелкой и на полочке сам размер.

Это все зависит от требований нормоконтроля, если он вообще есть


___

Пишут что повороты углами Эйлера опасны при углах кратных 90 градусов.
Так почти все углы кратны 90 градусов.


Это на тему сборок которых не видно.
А это координата за миллион и вектора системы координат для отрисовки деталей равны нулю.

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


__
В общем смысле,
Про развеивание тумана и получения хоть какой информации - это отдельный разговор.

Певица рассказывала что чувствую что в песне это слово не идет.
В стихах это слово нормально.

Чувствовать - это рассеивать туман и получать хоть какую информацию.
Рассеивать туман это адекватно сокращать объем информации.

Например собственные вектора матриц отражают реальность, но оперировать с собственными векторами матриц намного легче.
https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80

Тут возникает слово движняк, потому что не работая в определенном направлении, никаких чувств не воспитать


 

 
 

p3452

Классная штука!
Есть во многих игровых движках и SDK, есть даже в .NET а вот в Компасе нет Кватернионов.(