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)