mirmik / zencad

CAD system for righteous zen programmers
https://mirmik.github.io/zencad/
MIT License
134 stars 13 forks source link

Как разместить объекты на кривой с шагом? #37

Closed zenbooster closed 4 years ago

zenbooster commented 4 years ago

Имеется некоторая кривая полученная с помощью функции interpolate. Можно ли разместить на этой кривой объекты (в моём случае одинаковые) с некоторым шагом?

mirmik commented 4 years ago

На текущий момент такой возможности нет.
Но в ближайшее время появится.

Алгоритм работы с длинами параметрических кривых в ядре имеется, так что где-нибудь к завтрашнему вечеру будет.

mirmik commented 4 years ago

Ок. Патч запилил, мастер ветку и репозиторий на pypi для линуксовой версии обновил. В мануал добавлен раздел "Анализ кривых": https://mirmik.github.io/zencad/ru/crvalgo.html

Собственно, метод uniform_points делает равномерную выборку точек из кривой. Точки могут быть использованы для перемещения объекта:

#!/usr/bin/env python3
#coding: utf-8

from zencad import *

icrv=interpolate([
    (0,0,0),
    (10,0,0),
    (0,10,0)
])
pnts=icrv.uniform_points(5)
m=box(1, center=True)

arr = [m.translate(*pnt) for pnt in pnts]

disp(arr)
disp(icrv)
show()

Screenshot 2019-12-19 00:03:27

mirmik commented 4 years ago

А... Запрос был о размещении с фиксированным шагом....

mirmik commented 4 years ago
#!/usr/bin/env python3
#coding: utf-8

from zencad import *

icrv=interpolate([
    (0,0,0),
    (10,0,0),
    (0,10,0)
])

m=box(1, center=True)

arr = [ icrv.linoff_point(3*i, 0) for i in range(5) ]

for pnt in arr:
    disp(m.translate(*pnt))

disp(icrv)
show()

Screenshot 2019-12-19 00:12:43

mirmik commented 4 years ago

Возможно, будет интересен такой вариант:

#!/usr/bin/env python3
#coding: utf-8

from zencad import *

icrv=interpolate([
    (0,0,0),
    (10,0,0),
    (0,10,10)
])

m=box(1, center=True)

arr = [ icrv.d1(icrv.linoff(3*i, 0)) for i in range(8) ]
fromvec = vector3(1,0,0)

for pnt, vec in arr:
    s = short_rotate(fromvec=fromvec,tovec=vec)(m)
    disp(s.translate(*pnt))

disp(icrv)
show()

Screenshot 2019-12-19 01:11:26

zenbooster commented 4 years ago

Выглядит - то, что надо. Возможно я делаю, что-то не так, но при попытке запустить 1-й пример, в логах появляется следующее: изображение Версию обновлял, просто запустив: python3 -m pip install zencad изображение

mirmik commented 4 years ago

Обновите пакет pyservoce до версии 1.15.2.

zenbooster commented 4 years ago

Уже стоит версия 1.15.2: изображение

mirmik commented 4 years ago

O_o. Попробуйте сделать из gui: Utility/Invalidate Cache

Если не поможет, то я где-то что-то не то залил.

zenbooster commented 4 years ago

Поискал "uniform_points" по репозиторию, нашёл упоминание только в файлах документации. Сейчас попробую...

mirmik commented 4 years ago

А его в zencad и нет. Он линкуется непосредственно из pyservoce.

zenbooster commented 4 years ago

Utility/Invalidate Cache

mirmik commented 4 years ago

В общем-то так и должно было быть. Так и должно было быть. У результата операции interpolate поменялся тип. Он теперь Edge, а не Shape. (Edge наследует от Shape). А из кеша он извлекался со старым типом.