Замена движения инструмента движением сфер

Автор Vitalij Lysanov, 18.02.19, 14:43:27

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

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

Vitalij Lysanov



Замена движения инструмента движением сфер



Работа со сферами дает много преимуществ:


  • Сферу можно не отображать, достаточно знать координаты цента и радиус

    При сечении сферы плоскостью, получаем окружность.

    Если плоскость сечения параллельна плоскостям координат, центр окружности при сечении уже известен, радиус окружности определяется расстоянием между плоскостью и  центром сферы. Значение рассчитывается по треугольнику

    Размеры сфер могут быть маленькие и сферы могут касаться поверхности инструмента. Сфер может быть много, лишь бы быстро считались. Быстро считается без графического отображения. Для частичного отображения можно вывести прореженный массив, чтобы не загружать машину.

Пока графика еще необходима на следующем этапе. Допустим сейчас на плоскости получили 6000 окружностей. В Компасе есть хороший инструмент Заливка, позволяющая в векторном формате получить контур заливки.

Включаем заливку при включенном Макрорекордере. Записываем Макро.
Если исходные кривые сплайны, в макро могут быть записаны отрезки длиной 1 миллиметр, это наверно выбрано для нормальной видимости заливки на деталях с обычными размерами.

В нашем случае исходное, это окружности, контур получаем в виде дуг. Компас находит точки пересечения окружностей и формирует контур.
После записи Макро, оставляем в тексте Макро один контур основной линией и при включении Макро, нарисует контур в эскизе.

Для примера взяли две плоскости и два эскиза. По сечениям построили результат при движении инструмента.
Запись Макро можно также получить, если временно удалить заливку и снова вставить. Новые операции Макро записывает.

В радиотехнике сложные сигналы заменяют суммой синусоид. Синусоида связана с окружностью и соответственно со сферой. Так что тут ничего нового. Повторюсь, лишь бы быстро считалось. Если инструмент изменяет форму в одной плоскости, сечение инструмента можно представить как сигнал и применить преобразование Фурье. Это поможет выбрать величины и фазы сфер. Тут еще особенность, радиосигналы рассматриваются как функция времени (не имеют завитушек, узлов). Это правильно, в пространстве завитушки отсутствуют, а в проекции они могут быть, но это уже не Фурье, это что то другое. Фурье в радиотехнике оно везде. Аппараты УЗИ, повышают качество раскладывая сигнал в разложение Фурье, в реальном времени. Некоторые частоты убирают, и снова восстанавливают сигнал. Подробностей в любом деле хватает. Есть программы с фотографии могут дать это преобразование.     


Если заменить графическую операцию, получения контура заливкой, можно и качество увеличить и плоскостей много взять.
Заливка сама иногда ошибается, поэтому желательно чтобы размеры выражались числом >10000. При записи Макро и большом количестве дуг (>3000) Компас может остановиться.

Программа

 
# Графику VTK можно убрать
import vtk
appendFilter = vtk.vtkAppendPolyData()
import math

# Открываем файл и записываем текст для отображения окружностей на фрагменте
f2 = open("d:\Okr.cdm", "w")
f2.write("#-*- coding: cp1251 -*- \n \n")

f2.write("import Kompas10API5 as KAPI  \n")
f2.write("import Kompas10API7 as KAPI7 \n")
f2.write("import pythoncom \n")
f2.write("from win32com.client import Dispatch \n")
f2.write("import LDefin2D \n")
f2.write("import LDefin3D \n")
f2.write("import ksConstants as CONST2D7 \n")
f2.write("import ksConstants3D as CONST3D7 \n")
f2.write("import MiscellaneousHelpers as MH \n")
f2.write("iKompasObject = Dispatch('KOMPAS.Application.5') \n")
f2.write("iKompasObject = KAPI.KompasObject(iKompasObject) \n")
f2.write("MH.iKompasObject = iKompasObject \n")
f2.write("iApplication = Dispatch('KOMPAS.Application.7') \n")
f2.write("iApplication = KAPI7.IApplication(iApplication) \n")
f2.write("MH.iApplication = iApplication \n")
f2.write("iDocument2D = iKompasObject.ActiveDocument2D() \n")
f2.write("iDocument = iApplication.ActiveDocument \n")
f2.write("iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument) \n")
f2.write("\n")

# Функция, рисует окружности при пересечении сферы и плоскости,
# Параметры. Смещения. Фаза спирали. Радиус сферы. Радиус спирали. 
def ok(dx,dy,faz,r_sfer,rsp):
    #rsp=12222
    pl=17000


    for u100 in range(0,10222,2):
        u=u100/200.0
        rshar=u*r_sfer
        u=u+faz/1.0
        x=rsp*math.sin(u)+dx
        y=rsp*math.cos(u)+dy
        z=25*u100

     
        input1 = vtk.vtkPolyData()
        sphereSource = vtk.vtkSphereSource()
        sphereSource.SetRadius(rshar)
        sphereSource.SetCenter(x,y,z)
       # Качество сферы       
        sphereSource.SetPhiResolution(10)   
        sphereSource.SetThetaResolution(10) 


        sphereSource.Update()
     

       # Записываем окружности только про пересечении сфер с плоскостью
        if (z+rshar)>pl and  (z-rshar)<pl:
           # Радиус окружности
            diskr=math.sqrt(rshar/1.0*rshar/1.0-abs(z-pl)*abs(z-pl))
           # Запись строчки окружности в Макро
            f2.write("obj = iDocument2D.ksCircle(")
            f2.write(str(x))
            f2.write(",")

            f2.write(str(y))
            f2.write(",")

            f2.write(str(diskr))
            f2.write(", 1)")

            f2.write("\n")

            appendFilter.AddInputConnection(input1.GetProducerPort())
            input1.ShallowCopy(sphereSource.GetOutput())



Циклы дают две группы перемещающихся сфер и окружности на плоскости
for n in range(4):
    ok(0,0,0+n*math.pi/2.0,600,15000)

for n in range(4):
    ok(0,0,2+n*math.pi/2.0,900,12000)

f2.close()



 
# Create a mapper and actor
mapper = vtk.vtkPolyDataMapper()
#mapper.SetInputConnection(cleanFilter.GetOutputPort())
mapper.SetInputConnection(appendFilter.GetOutputPort())
appendFilter

actor = vtk.vtkActor()
actor.SetMapper(mapper)

# Create a renderer, render window, and interactor
renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)

# Add the actors to the scene
renderer.AddActor(actor)
renderer.SetBackground(.3, .2, .1) # Background color dark red

# Render and interact
renderWindow.Render()
renderWindowInteractor.Start()