import FreeCAD as App import FreeCADGui as Gui doc = App.ActiveDocument print('lcs - локальная система координат') print('grip - позиция захвата') print('area - плоскость') print('vol - зона') print('joint - соединение') entityType = input('Введите тип получаемого обьекта') def create(entityType): if entityType == 'grip': print('задайте начальную точку захватной зоны. ') print('Учтите, что ось X должна быть направлена вдоль направления раскрытия пальцев') print('Ось Z должна быть направлена в противоположную сторону от направления кончика пальца захвата') objname = input('Введите название начальной точки' + "\n") obj = doc.getObject(objname) poseGenerator(obj) elif entityType == 'area': print('задайте плоскость') objname = input('Введите название плоскости'+ "\n") obj = doc.getObject(objname) areaProps(obj) elif entityType == 'vol': print('задайте обьем') objname = input('Введите название обьема'+ "\n") obj = doc.getObject(objname) volProps(obj) elif entityType == 'joint': print('Задайте позицию соединения') objname = input('Введите название соединения'+ "\n") part1 = input('укажите название первой детали'+ "\n") part2 = input('укажите название второй детали'+ "\n") jointGenerator(objname, part1, part2) obj.addProperty("App::PropertyString", "Type").Type = entityType ## заглушки функций на случай, если что-то придумаю полезное для них def areaProps(area): #здесь нужно отметить свойства зоны #в принципе, Placement и размеры тут есть, больше ничего особо не нужно #добавить характеристику entityType print(area.Label) def volProps(vol): #желательно указать координаты, габариты, позицию привязки #но думаю, что это все уже есть print(vol.Label) def jointGenerator(jointName, part1, part2): #получаем относительные координаты для первой детали и для второй детали #создаем две сущности - точка входа и точка выхода (??????) #в работе сейчас print(jointName.Label) print(part1.Label) print(part2.Label) # Эта функция работает нормально def poseGenerator(lcs): box = doc.addObject("Part::Box", "gripSpace") box.Length = 62 #раскрытие box.Width = 10 #ширина пальца box.Height = 40 #глубина box.Placement = lcs.Placement #есть смысл создавать привязку прямо здесь же. благодаря параметризации, при подстройке куба все точки сместятся как надо gripPose = App.ActiveDocument.addObject('PartDesign::CoordinateSystem', 'GripPose') gripPose.Support = box gripPose.positionBySupport() gripPose.MapMode = 'ObjectXY' gripPose.AttachmentOffset.Base = [str(box.Label) + '.Length' + '/2', str(box.Label) + '.Length'+ '/2', 0] #здесь должна быть активная привязка, не просто значения координат gripPose.addProperty("App::PropertyFloat", "GripOpen") gripPose.addProperty("App::PropertyFloat", "GripDepth") gripPose.addProperty("App::PropertyFloat", "GripWidth") gripPose.setExpression('GripDepth', str(box.Label) + '.Height') gripPose.setExpression('GripOpen', str(box.Label) + '.Length') gripPose.setExpression('GripWidth', str(box.Label) + '.Width') #нужно создавать внутри Part, а не внутри главного документа. сбиваются привязки !!! print('Установите захватную зону вручную, растянув обьект GripSpace') doc.recompute() #теперь нужно производить экспорт #он делается через Tools.py или через импорт-экспорт create(entityType) ### getObjectInfo работает def getFaceInfo(face): if face: App.Console.PrintMessage(f"Информация о грани: {face}\n") # Получите позицию (Base) и ориентацию (Rotation) грани в глобальных координатах placement = face.Placement position = App.Vector(placement.Base) orientation = App.Rotation(placement.Rotation) App.Console.PrintMessage(f"Позиция грани: {position}\n") App.Console.PrintMessage(f"Ориентация грани: {orientation}\n") def getObjectInfo(): selection = Gui.Selection.getSelectionEx() if selection: selected_object = selection[0].Object if selected_object: subelement_name = selection[0].SubElementNames[0] if "Face" in subelement_name: face = selected_object.Shape.Faces[int(subelement_name.split("Face")[1])] getFaceInfo(face) else: App.Console.PrintError("Выберите грань, а не тело или другой элемент\n") else: App.Console.PrintError("Объект не найден\n") else: App.Console.PrintError("Не выбраны объекты\n") getObjectInfo()