Vismach — це набір функцій Python, які можна використовувати для створення та анімації моделей машин. Vismach відображає модель у 3D-вікні, а частини моделі анімуються у міру зміни значень відповідних контактів HAL.
Виглядом області перегляду 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)