Vismach — це набір функцій Python, які можна використовувати для створення та анімації моделей машин. Vismach відображає модель у 3D-вікні, а частини моделі анімуються у міру зміни значень відповідних контактів HAL.

Vismach відображає модель у 3D-вікні перегляду

Виглядом області перегляду Vismach можна маніпулювати наступним чином:

  • масштабування за допомогою колеса прокручування або перетягування правою кнопкою миші,

  • pan перетягуванням лівою кнопкою миші,

  • повернути перетягуванням середньою кнопкою миші або перетягуванням із утримуваною клавішею Shift.

Модель Vismach має вигляд скрипта Python і може використовувати стандартний синтаксис Python. Це означає, що існує кілька способів написання скрипта, але в прикладах, наведених у цьому документі, я буду використовувати найпростіший і найосновніший з них.

Основна послідовність створення моделі Vismach така

  • Створіть контакти HAL, які керують рухом.

  • Створіть деталі.

  • Визначте, як вони рухаються.

  • Об’єднайтеся в рухові групи.

1. Запустіть скрипт

Для тестування корисно включити #!/usr/bin/env python3, щоб файл можна було запустити як скрипт. Перше, що потрібно зробити, це імпортувати необхідні бібліотеки.

#!/usr/bin/env python3

from vismach import *
import hal
import math
import sys

2. Створіть контакти HAL.

Контакти HAL створюються за допомогою звичайної бібліотеки Python «hal» і не є специфічними для Vismach. Більш детальну інформацію можна знайти в розділі Створення нереального часу компонентів в Python. Компонент слід створювати з іменем, яке відповідає імені файлу скрипта, а потім до цього компонента додаються контакти HAL. Вони будуть посилатися на їх компонентну ручку і коротке ім’я при використанні для анімації моделі Vismach.

c = hal.component("samplegui")
c.newpin("joint0", hal.HAL_FLOAT, hal.HAL_IN)
c.newpin("joint1", hal.HAL_FLOAT, hal.HAL_IN)
c.ready()

Створить HAL-піни samplegui.joint0 та samplegui.joint1. Під час завантаження моделі Vismach за допомогою loadusr -W samplegui функція c.ready() повідомляє loadusr про готовність.

3. Створення деталей

Найпростіше створити геометрію в пакеті CAD і імпортувати її в скрипт моделі за допомогою функцій AsciiSTL() або AsciiOBJ(). Обидві функції можуть приймати один з двох іменованих аргументів: ім’я файлу або необроблені дані:

  • part = AsciiSTL(filename="path/to/file.stl") + part = AsciiSTL(data="solid part1 facet normal ....") + part = AsciiOBJ(filename="path/to/file.obj") + part = AsciiOBJ(data="v 0.123 0.234 0.345 1.0 ...")
    Деталі будуть створені в просторі Vismach у тих самих місцях, що й у просторі STL або OBJ. Це означає, що можливо зібрати модель у пакеті CAD.

Або ж деталі можна створювати всередині скрипта моделі з ряду примітивів фігур. Багато фігур створюються у початку координат і після створення їх потрібно перемістити в потрібне місце:

  • cylinder = CylinderX(x1, r1, x2, r2) + cylinder = CylinderY(y1, r1, y2, r2) + cylinder = CylinderZ(z1, r1, z2, r2)
    Створює (за бажанням конічний) циліндр на заданій осі із заданими радіусами у заданих точках на осі.

  • sphere = Sphere(x, y, z, r)
    Створює сферу радіуса r у точках (x,y,z)

  • triangle = TriangleXY(x1, y1, x2, y2, x3, y3, z1, z2) + triangle = TriangleXZ(x1, z1, x2, z2, x3, z3, y1, y2) + triangle = TriangleYZ(y1, z1, y2, z2, y3, z3, x1, x2)
    Створює трикутну пластину між площинами, визначеними двома останніми значеннями, паралельними заданій площині, з вершинами, заданими трьома парами координат.

  • arc = ArcX(x1, x2, r1, r2, a1, a2)
    Створіть дугоподібну форму.

  • box = Box(x1, y1, z1, x2, y2, z2)
    Створює прямокутну призму з протилежними кутами у вказаних положеннях та ребрами, паралельними осям XYZ.

  • box = BoxCentered(xw, yw, zw)
    Створює прямокутник xw на yw на zw з центром у початку координат.

  • box = BoxCenteredXY(xw, yw, z)
    Створює блок шириною xw / yw та висотою z.

Складені частини можна створювати шляхом асемблювання цих примітивів або під час створення, або згодом за допомогою Collection():

part1 = Collection([Sphere(100,100,100,50), CylinderX(100,40,150,30)])
part2 = Box(50,40,75,100,75,100)
part3 = Collection([part2, TriangleXY(10,10,20,10,15,20,100,101)])
part4 = Collection([part1, part2])

4. Рухомі частини

Для складання моделі може знадобитися переміщення деталей у просторі Vismach. Також може знадобитися їх переміщення для створення анімації, оскільки вісь обертання анімації створюється в точці початку координат (але переміщується разом із деталлю):

  • part1 = Translate([part1], x, y, z)
    Перемістіть деталь1 на задані відстані по осях x, y та z.

  • part1 = Rotate([part1], theta, x, y, z)
    Повернути деталь на кут тета навколо осі між початком координат та координатами x, y, z.

5. Анімація деталей

Для анімації моделі (керованої значеннями контактів HAL) існують дві функції: «HalTranslate» і «HalRotate». Щоб деталі могли рухатися всередині збірки, перед складанням за допомогою команди «Collection» необхідно визначити їхні рухи HAL. Вісь обертання і вектор перенесення рухаються разом з деталлю, коли вона переміщується скриптом vismach під час складання моделі або коли вона рухається у відповідь на контакти HAL під час анімації моделі:

  • part = HalTranslate([part], comp, "hal_pin", xs, ys, zs)
    Аргументи функції:

    • спочатку колекцію/частину, яку можна попередньо створити раніше в скрипті, або ж, якщо бажаєте, створити на цьому етапі, наприклад, part1 = HalTranslate([Box(....)], ...).

    • Компонент HAL є наступним аргументом, тобто об’єктом, що повертається командою comp = hal.component(...). Далі йде назва HAL, який буде анімувати рух. Вона повинна відповідати існуючому виводу HAL, що є частиною компонента HAL, створеного раніше в скрипті.

    • Потім слідуйте за шкалами X, Y, Z.
      Для декартової машини, створеної в масштабі 1:1, це зазвичай буде 1,0,0 для руху в позитивному напрямку X.
      Однак, якщо файл STL виявився в см, а машина була в дюймах, це можна виправити на цьому етапі, використовуючи 0,3937 (1 см / 2,54 дюйма) як масштаб.

  • part = HalRotate([part], comp, "hal_pin", angle_scale, x, y, z)
    Ця команда подібна за своєю роботою до HalTranslate, за винятком того, що зазвичай спочатку необхідно перемістити деталь до початку координат, щоб визначити вісь.

    • Ось обертання проходить від точки початку координат до точки, визначеної координатами (x, y, z).
      Коли деталь переміщується назад від початку координат до свого правильного положення, ось обертання можна вважати «вбудованою» в деталь.

    • Кути повороту вказані в градусах, тому для поворотного з’єднання з масштабуванням 0-1 вам потрібно буде використовувати шкалу кутів 360.

6. Збірка моделі.

Щоб деталі рухалися разом, їх потрібно зібрати за допомогою команди Collection(). Важливо зібрати деталі та визначити їхні рухи у правильній послідовності. Наприклад, щоб створити фрезерний верстат із рухомою головкою, обертовим шпинделем та анімованою тяговою штангою, потрібно:

  • Створіть основну частину голови.

  • Створіть шпиндель у початку координат.

  • Дайте визначення обертання.

  • Перемістіть головку до шпинделя або шпиндель до головки.

  • Створіть планку для витягування.

  • Визначте рух тяги.

  • Зберіть три частини в головний вузол.

  • Визначте рух головки.

У цьому прикладі обертання шпинделя позначається обертанням набору приводних собачок:

#Собаки для перегонів
dogs = Box(-6,-3,94,6,3,100)
dogs = Color([1,1,1,1],[dogs])
dogs = HalRotate([dogs],c,"spindle",360,0,0,1)
dogs = Translate([dogs],-1,49,0)

#Дишло
draw = CylinderZ(120,3,125,3)
draw = Color([1,0,.5,1],[draw])
draw = Translate([draw],-1,49,0)
draw = HalTranslate([draw],c,"drawbar",0,0,1)

# головка/шпиндель
head = AsciiSTL(filename="./head.stl")
head = Color([0.3,0.3,0.3,1],[head])
head = Translate([head],0,0,4)
head = Collection([head, tool, dogs, draw])
head = HalTranslate([head],c,"Z",0,0,0.1)

# база
base = AsciiSTL(filename="./base.stl")
base = Color([0.5,0.5,0.5,1],[base])
# покласти на нього голову
base = Collection([head, base])

Нарешті, потрібно створити єдину колекцію всіх деталей машини, підлоги та робіт (якщо такі є):

  • Для серійної машини кожна нова частина буде додана до колекції попередньої частини.

  • Для паралельної машини може бути кілька "базових" частин.

Таким чином, наприклад, у scaragui.py link3 додається до link2, link2 до link1 та link1 до link0, тож остаточна модель створюється за допомогою:

model = Collection([link0, floor, table])

Тоді як модель VMC з окремими частинами, що рухаються на основі, може мати:

model = Collection([base, saddle, head, carousel])

7. Інші функції

  • part = Color([colorspec], [part])
    Встановлює колір відображення деталі. Зверніть увагу, що на відміну від інших функцій, в цьому випадку визначення деталі йде другим.
    Колір складається з трьох значень RGB і непрозорості. Наприклад, [1,0,0,0.5] для червоного кольору з непрозорістю 50%.

  • myhud = Hud()
    Створює віконце в графічному інтерфейсі Vismach для відображення таких елементів, як положення осей.

  • tooltip = Capture()
    Уявіть це як невидиму частину, яку потрібно прикріпити до підказки, щоб відстежувати положення та орієнтацію системи координат інструменту. Насправді це матриця перетворення, яка постійно оновлюється під час руху моделі.

  • work = Capture()
    Те саме, що й вище, але прикріплено до робочого столу для відстеження системи координат заготовки.

  • main(model, tooltip, work, size=10, hud=0, rotation_vectors=None, lat=0, lon=0)
    Це команда, яка все це робить, створює дисплей тощо.

    • model має бути колекцією, яка містить усі деталі машини.

    • tooltip та work повинні бути створені за допомогою Capture(). Vismach потребує цю інформацію для малювання заднього плану, який є, по суті, позицією підказки, намальованою в системі координат роботи.
      Дивіться scaragui.py для прикладу того, як підключити підказку до інструменту, а інструмент до моделі.

    • Для встановлення початкової точки огляду можна використовувати або rotation_vectors, або latitude/longitude, і це доцільно зробити, оскільки початкова точка огляду за замовчуванням досить незручна безпосередньо згори.

    • size встановлює розмір об’єму, що візуалізується у початковому вигляді.

    • hud стосується відображення положення осей на лобовому склі.

8. Базова структура скрипту Vismach.

#імпорт
з vismach імпорту *
імпорт hal
#створити компонент HAL і контакти
comp = hal.component("compname")
comp.newpin("pin_name", hal.HAL_FLOAT, hal.HAL_IN)
...
#створити підлогу, інструмент і роботу
floor = Box(-50, -50, -3, 50, 50, 0)
work = Capture()
tooltip = Capture()...

#Побудувати і зібрати модель
part1 = Collection([Box(-6,-3,94,6,3,100)])
part1 = Color([1,1,1,1],[part1])
part1 = HalRotate([part1],comp,"pin_name",360,0,0,1)
part1 = Translate([dogs],-1,49,0)
...
#Створити модель верхнього рівня
model = Collection([base, saddle, head, carousel])
#Запустити візуалізацію
main(model, tooltip, work, 100, lat=-75, lon=215)