• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Фреза, заготовка детали и NumPy

Автор Vitalij Lysanov, 21.09.17, 11:49:49

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

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

Vitalij Lysanov

21.09.17, 11:49:49 Последнее редактирование: 21.09.17, 15:46:36 от Vitalij Lysanov
Если установить NumPy и запустить код который ниже, получим след фрезы в формате точек Компас.
Смотреть лучше "Пространственные кривые"   "Импортированная кривая"
Вывод идет в развернутых цилиндрических координатах, так без синусов и наглядней..
Если заготовка детали уже имеет форму, это вместо расстояния до плоскости подставим значения из массива координат заготовки.

По программе:
Работаем с массивом 5000 на 10000 точек.

Фрезу из 10000 точек формируем математически и добавляем выступы.

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

Дальше все операции в NumPY который специально заточен для операций сдвига и сложения матриц.

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

# -*- coding: cp1251 -*-

import math
import copy
import numpy as np

r=np.arange(0, 10, 0.001)
r=11+68*(abs(np.sin((r+1)*3)))

r=np.array(r)
r[1600:1700]=86
r[1640:1670]=86-1

rk=copy.copy(r)

f2 = open("D:/tochk.txt", "w")
m=[]
ma1=np.zeros((5000, 10000))
shag=1

pl=68+5
vdal=55
rast=np.zeros(len(r))

for n in range (len(r)):
   sm=0
   u=6.28*(n/len(r))        # Угол по номеру массива
   us=u-1.039                # Угол для поворота плоскости
   rp=0

#  Расчет расстояния до плоскости по углу
   og=11111
   if math.cos(us)>0.1: og=pl/math.cos(us)
   rast[n]=og


for pr in range(0,vdal,shag):
    rk=copy.copy(r)

    rk[r<rast]=0                            #  Учет пересечения с плоскостью         
    ma1[pr,:]=rk[:]


    for n in range(1):     # кольцевой сдвиг
        b = r[0]
        for i in range(len(r)-1):
           r[i] = r[i+1]
        r[len(r)-1] = b

m=ma1
xma=[]
yma=[]
zma=[]






# Накопление выборок в заготовке
h=20
sdv=20
for nak in range(1):
    m[0:h, : : ]=np.maximum(m[0:h, : : ],m[sdv+nak:sdv+nak+h, : : ])





for pr in range(vdal):
    for n in range(len(r)):
        if m[pr,n]>1:

            f2.write(str(-pr))
            f2.write (         "\t")

            f2.write     (     str(n/20)   )
            f2.write("\t")

            f2.write   (     str(  m[pr,n]     )  )
            f2.write("\t")

            f2.write("\n")

f2.close()
print ("___")



Обратная задача
NumPy написан на СИ и если только NuмPy, то это скорость работы СИ.
Скорость работы позволяет методом подбора решить и обратную задачу и по профилю детали подобрать фрезу и траекторию движения. (Мечта технолога! Сейчас для ЧПУ чтобы выбрать металл по контуру, его просто нужно задать. Это то же самое, только в объеме.
p.s.   
Аналогичные тексты уже были в литературе. Там еще были такие слова "И тут Остапа ... " )

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

 
+ Благодарностей: 2

Vitalij Lysanov


     
Продолжение для формата STL

Для больших объемов информации хорошо подходит формат STL.

Есть программа "Numpy Stl". Кроме записи в формат STL также полный набор сдвигов и трансформаций.
Запись в файл "STL" будет если в программу добавить:


from stl import mesh
cube = mesh.Mesh(np.zeros(27115, dtype=mesh.Mesh.dtype))
                nt=nt+1                             # номер треугольника     
                cube.vectors[nt][0]= np.array([pr,     n,           m[pr,n]])
                cube.vectors[nt][1]= np.array([pr,     n+1,       m[pr,n+1]])
                cube.vectors[nt][2]= np.array([pr+1, n,           m[pr+1,n]])
                nt=nt+1
                cube.vectors[nt][0]= np.array([pr,      n,           m[pr,n]])
                cube.vectors[nt][1]= np.array([pr+1,  n,           m[pr,n]])
                cube.vectors[nt][2]= np.array([pr+1, n+1,        m[pr+1,n+1]])
cube.save('D:\cube.stl')



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

Для сложных случаев есть программа разбивка на треугольники.

Здесь близко от формата данных применяемого в медицине. Где точка пространства в черно белом варианте, размером 1 бит, имеет свои координаты. Это формат позволит двигать не контур тела а целое сложное тело и смотреть результат.
Логическими массивами NumPy тоже может работать и например, спокойно разводить печатные платы волновым алгоритмом.
С форматом STL могут работать и напрямую - вырезать, складывать.


Запись в формат STL есть, должно быть и чтение. Загрузил фрезу и можно ее двигать.

В формат STL легко записать и самостоятельно.
Узкие полоски нужно разбить на треугольники.
Координаты точек треугольников есть. Если получаются острые треугольники, можно добавить промежуточные точки.