Добавлен алгоритм для задания позиций захвата
This commit is contained in:
parent
29cad491f5
commit
0c8767e3f5
3 changed files with 136 additions and 0 deletions
|
@ -183,11 +183,15 @@ def getLocalPartProps(obj):
|
|||
"label": obj.Label,
|
||||
"parent_label": obj_parent_label,
|
||||
"placement": placement2pose(old_placement),
|
||||
# "grip properties": { "grip open": obj.GripOpen, "grip depth": obj.GripDepth, "grip width": obj.GripWidth}
|
||||
# "boundingbox": boundingBox2list(obj.Shape.BoundBox),
|
||||
# "volume": obj.Shape.Volume*1e-9,
|
||||
# "centerofmass": vector2list(obj.Shape.CenterOfMass),
|
||||
# "principalproperties": principalProperties2dict(obj.Shape.PrincipalProperties)
|
||||
}
|
||||
if obj.GripOpen != None:
|
||||
partprops["grip properties"] = { "grip open": obj.GripOpen, "grip depth": obj.GripDepth, "grip width": obj.GripWidth}
|
||||
|
||||
# obj.Placement = old_placement
|
||||
return partprops
|
||||
|
||||
|
|
0
cg/freecad/Frames/normalEstimator
Normal file
0
cg/freecad/Frames/normalEstimator
Normal file
132
cg/freecad/Frames/poseGenerator.py
Normal file
132
cg/freecad/Frames/poseGenerator.py
Normal file
|
@ -0,0 +1,132 @@
|
|||
import FreeCAD as App
|
||||
import FreeCADGui as Gui
|
||||
|
||||
# App.newDocument()
|
||||
doc = App.ActiveDocument
|
||||
|
||||
|
||||
print('задайте начальную точку захватной зоны. ')
|
||||
print('Учтите, что ось X должна быть направлена вдоль направления раскрытия пальцев')
|
||||
print('Ось Z должна быть направлена в противоположную сторону от направления кончика пальца захвата')
|
||||
lcsname = input('Введите название начальной точки' + "\n")
|
||||
|
||||
lcs = doc.getObject(lcsname)
|
||||
|
||||
def poseGenerator(lcs):
|
||||
|
||||
box = doc.addObject("Part::Box", "gripSpace")
|
||||
box.Length = 62 #раскрытие
|
||||
box.Width = 10 #ширина пальца
|
||||
box.Height = 40 #глубина
|
||||
|
||||
box.Placement = lcs.Placement
|
||||
#box.Transparency = 80 #не работает, хз почему
|
||||
|
||||
|
||||
|
||||
#есть смысл создавать привязку прямо здесь же. благодаря параметризации, при подстройке куба все точки сместятся как надо
|
||||
gripPose = App.ActiveDocument.addObject('PartDesign::CoordinateSystem', 'GripPose')
|
||||
gripPose.Support = box
|
||||
gripPose.MapMode = 'ObjectXY'
|
||||
gripPose.AttachmentOffset.Base = [box.Length/2, box.Width/2, 0] #здесь должна быть активная привязка, не просто значения координат
|
||||
|
||||
gripPose.addProperty("App::PropertyFloat", "GripOpen")
|
||||
gripPose.addProperty("App::PropertyFloat", "GripDepth")
|
||||
gripPose.addProperty("App::PropertyFloat", "GripWidth")
|
||||
gripPose.GripOpen = box.Length.Value
|
||||
gripPose.GripWidth = box.Width.Value
|
||||
gripPose.GripDepth = box.Height.Value
|
||||
|
||||
|
||||
|
||||
|
||||
#нужно создавать эту хрень внутри Part, а не внутри главного документа. сбиваются привязки !!!
|
||||
|
||||
|
||||
print('Установите захватную зону вручную, растянув обьект GripSpace')
|
||||
doc.recompute()
|
||||
|
||||
#вроде как работает
|
||||
|
||||
|
||||
poseGenerator(lcs)
|
||||
|
||||
# def collectAndExportProps():
|
||||
|
||||
|
||||
|
||||
|
||||
# This class logs any mouse button events. As the registered callback function fires twice for 'down' and
|
||||
# 'up' events we need a boolean flag to handle this.
|
||||
|
||||
# todo:
|
||||
# добавить включатель-выключатель
|
||||
# должно срабатывать на задание одной позиции
|
||||
# научить считать нормаль поверхности в указанной точке
|
||||
# добавить коррекцию позиции
|
||||
# 1 выбираем первую грань
|
||||
# 2 сохраняем позицию курсора
|
||||
# 3 в данной позиции считаем нормаль поверхности, выравниваем вокруг нее ось x
|
||||
|
||||
# 3 выбираем вторую грань
|
||||
# расстояние до нее должно стать длиной параллелепипеда
|
||||
# ширина задается вручную
|
||||
# создаем ск, которая смещена на половину длины прямоугольника и на половину ширины
|
||||
# полученная штука - центр расстояния между кончиками пальцев
|
||||
# в эту штуку можно вставить параметризованный захват и проверить на коллизии
|
||||
|
||||
|
||||
#####
|
||||
#все хуйня
|
||||
#давай по новой
|
||||
|
||||
#создаем опорную точку в asm4 (взять оттуда генератор точек?)
|
||||
#по ней строим от угла прямоугольник
|
||||
#используя asm4, создаем ориентированный обьект и присваиваем ему свойства, равные размерам объекта
|
||||
|
||||
# class ViewObserver:
|
||||
# def __init__(self, view):
|
||||
# self.view = view
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# def logPosition(self, info):
|
||||
# # def turnOn():
|
||||
# # switch = 'Run'
|
||||
# # while True:
|
||||
# # switch = input('Tell me when to stop')
|
||||
# # if switch != 'Run':
|
||||
# # print('MacroStop')
|
||||
# # break
|
||||
# # return (switch)
|
||||
|
||||
|
||||
|
||||
# down = (info["State"] == "DOWN")
|
||||
# pos = info["Position"]
|
||||
# if (down):
|
||||
# App.Console.PrintMessage(
|
||||
# "Clicked on position: ("+str(pos[0])+", "+str(pos[1])+")\n")
|
||||
# pnt = self.view.getPoint(pos)
|
||||
# App.Console.PrintMessage("World coordinates: " + str(pnt[0].x) + "\n")
|
||||
# info = self.view.getObjectInfo(pos)
|
||||
# print(info['x'])
|
||||
# print(info['y'])
|
||||
# print(info['z'])
|
||||
# from random import randrange
|
||||
# id = str('yo' + str(randrange(0, 10000)))
|
||||
# # App.ActiveDocument.addObject("Part::Box",id)
|
||||
# print(id)
|
||||
# # App.ActiveDocument.getObject(id).Placement = App.Placement(App.Vector(info['x'],info['y'],info['z']),App.Rotation(App.Vector(0.00,0.00,1.00),0.00))
|
||||
|
||||
# # App.ActiveDocument.getObject(id).Width = '1.00 mm'
|
||||
# # App.ActiveDocument.getObject(id).Length = '1.00 mm'
|
||||
# # App.ActiveDocument.getObject(id).Height = '1.00 mm'
|
||||
# # App.Console.PrintMessage("Object info: " + str(info) + "\n")
|
||||
|
||||
|
||||
|
||||
# o = ViewObserver(v)
|
||||
# c = v.addEventCallback("SoMouseButtonEvent", o.logPosition)
|
Loading…
Add table
Add a link
Reference in a new issue